Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 17295)
+++ wp-includes/default-filters.php	(working copy)
@@ -186,6 +186,7 @@
 add_filter( 'pings_open',           '_close_comments_for_old_post', 10, 2 );
 add_filter( 'editable_slug',        'urldecode'                           );
 add_filter( 'nav_menu_meta_box_object', '_wp_nav_menu_meta_box_object'    );
+add_filter( 'wp_handle_upload_prefilter', 'wp_fix_original_filename'      );
 
 // Atom SSL support
 add_filter( 'atom_service_url','atom_service_url_filter' );
Index: wp-admin/includes/file.php
===================================================================
--- wp-admin/includes/file.php	(revision 17295)
+++ wp-admin/includes/file.php	(working copy)
@@ -1079,4 +1079,26 @@
 	return false;
 }
 
-?>
+/**
+ * Replaces $_FILES['blah']['name'] values sent by WebKit with munged double quotes with the value we stored in $_POST['original_file_name']
+ * Only works if $_FILES has only one entry, but the bug only exists when using the browser plugin.
+ *
+ * Attached to wp_handle_upload_prefilter
+ *
+ * http://core.trac.wordpress.org/ticket/16191
+ *
+ * @see media_upload_form()
+ */
+function wp_fix_original_filename( $file ) {
+	if ( empty( $_POST['original_file_name'] ) )
+		return $file;
+
+	$original_file_name = stripslashes( $_POST['original_file_name'] );
+	$original_file_name = str_replace( '\\', '/', $original_file_name ); // Windows path sanitiation
+	$original_file_name = wp_basename( $original_file_name );
+
+	if ( str_replace( '"', '%22', $original_file_name ) == $file['name'] )
+		$file['name'] = $original_file_name;
+
+	return $file;
+}
Index: wp-admin/includes/media.php
===================================================================
--- wp-admin/includes/media.php	(revision 17295)
+++ wp-admin/includes/media.php	(working copy)
@@ -1406,6 +1406,8 @@
  *
  * @since 2.5.0
  *
+ * @see wp_fix_original_filename()
+ *
  * @param unknown_type $errors
  */
 function media_upload_form( $errors = null ) {
@@ -1530,6 +1532,15 @@
 		};
 		swfu = new SWFUpload(settings);
 };
+<?php
+// Store the original file name in $_POST['original_file_name'] since WebKit munges double quotes
+// http://core.trac.wordpress.org/ticket/16191
+?>
+jQuery( function($) {
+	$( '#file-form' ).submit( function() {
+		$( '#original-file-name' ).val( $( '#async-upload' ).val() );
+	} );
+} );
 //]]>
 </script>
 
@@ -1552,6 +1563,7 @@
 	<p id="async-upload-wrap">
 		<label class="screen-reader-text" for="async-upload"><?php _e('Upload'); ?></label>
 		<input type="file" name="async-upload" id="async-upload" />
+		<input type="hidden" name="original_file_name" id="original-file-name" />
 		<?php submit_button( __( 'Upload' ), 'button', 'html-upload', false ); ?>
 		<a href="#" onclick="try{top.tb_remove();}catch(e){}; return false;"><?php _e('Cancel'); ?></a>
 	</p>
