Index: wp-includes/js/swfupload/handlers.js
===================================================================
--- wp-includes/js/swfupload/handlers.js	(revision 10331)
+++ wp-includes/js/swfupload/handlers.js	(working copy)
@@ -285,3 +285,22 @@
 	});
 }
 })(jQuery);
+
+
+// Success handler for the import tools instance of the uploader
+function importUploadSuccess(fileObj, serverData) {
+	// if async-upload returned an error message, place it in the media item div and return
+	if ( serverData.match('media-upload-error') ) {
+		jQuery('#media-item-' + fileObj.id).html(serverData);
+		return;
+	}
+	
+	// Remove progress bar
+	jQuery('#media-item-' + fileObj.id + ' .progress').remove();
+	
+	// Add the link to go to the next step, indicating which attachment is the data file
+	jQuery('#media-item-' + fileObj.id).append('<a href="' + document.location.href + '&step=1&action=save&attachment_id=' + serverData + '&_wpnonce=' + import_nonce + '&_wp_http_referer=' + escape(document.location.href) + '" class="describe-toggle-on">' + swfuploadL10n.import_continue + '</a>');
+	
+	// Remove the upload button to prevent them from trying to upload more
+	jQuery('#flash-upload-msg').remove()
+}
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 10331)
+++ wp-includes/script-loader.php	(working copy)
@@ -130,6 +130,7 @@
 				'dismiss' => __('Dismiss'),
 				'crunching' => __('Crunching&hellip;'),
 				'deleted' => __('Deleted'),
+				'import_continue' => __('Continue Import &raquo;'),
 				'l10n_print_after' => 'try{convertEntities(swfuploadL10n);}catch(e){};'
 		) );
 	} else {
@@ -152,6 +153,7 @@
 				'dismiss' => __('Dismiss'),
 				'crunching' => __('Crunching&hellip;'),
 				'deleted' => __('Deleted'),
+				'import_continue' => __('Continue Import &raquo;'),
 				'l10n_print_after' => 'try{convertEntities(swfuploadL10n);}catch(e){};'
 		) );
 		$scripts->add( 'swfupload-swfobject', false, array('swfupload') );
Index: wp-admin/wp-admin.css
===================================================================
--- wp-admin/wp-admin.css	(revision 10331)
+++ wp-admin/wp-admin.css	(working copy)
@@ -2940,3 +2940,8 @@
 	line-height: 1;
 	padding-left: 25px;
 }
+
+ol {
+	list-style-type: decimal;
+	margin-left: 2em;
+}
\ No newline at end of file
Index: wp-admin/includes/import.php
===================================================================
--- wp-admin/includes/import.php	(revision 10331)
+++ wp-admin/includes/import.php	(working copy)
@@ -59,28 +59,34 @@
  * @return array
  */
 function wp_import_handle_upload() {
-	$overrides = array( 'test_form' => false, 'test_type' => false );
-	$_FILES['import']['name'] .= '.import';
-	$file = wp_handle_upload( $_FILES['import'], $overrides );
+	if (!empty($_FILES['import'])) {
+		// Handle upload of file and storage as attachment
+		$overrides = array( 'test_form' => false, 'test_type' => false );
+		$_FILES['import']['name'] .= '.import';
+		$file = wp_handle_upload( $_FILES['import'], $overrides );
 
-	if ( isset( $file['error'] ) )
-		return $file;
+		if ( isset( $file['error'] ) )
+			return $file;
 
-	$url = $file['url'];
-	$type = $file['type'];
-	$file = addslashes( $file['file'] );
-	$filename = basename( $file );
+		$url = $file['url'];
+		$type = $file['type'];
+		$file = addslashes( $file['file'] );
+		$filename = basename( $file );
 
-	// Construct the object array
-	$object = array( 'post_title' => $filename,
-		'post_content' => $url,
-		'post_mime_type' => $type,
-		'guid' => $url
-	);
+		// Construct the object array
+		$object = array( 'post_title' => $filename,
+			'post_content' => $url,
+			'post_mime_type' => $type,
+			'guid' => $url
+		);
 
-	// Save the data
-	$id = wp_insert_attachment( $object, $file );
-
+		// Save the data
+		$id = wp_insert_attachment( $object, $file );
+	} else {
+		// Populate details based on ID passed in from async upload
+		$id = $_REQUEST['attachment_id'];
+		$file = get_attached_file($id);
+	}
 	return array( 'file' => $file, 'id' => $id );
 }
 
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 10331)
+++ wp-admin/includes/template.php	(working copy)
@@ -2693,18 +2693,92 @@
 function wp_import_upload_form( $action ) {
 	$bytes = apply_filters( 'import_upload_size_limit', wp_max_upload_size() );
 	$size = wp_convert_bytes_to_hr( $bytes );
+	
+	// If Mac and mod_security, no Flash. :(
+	$flash = true;
+	if ( false !== strpos(strtolower($_SERVER['HTTP_USER_AGENT']), 'mac') && apache_mod_loaded('mod_security') )
+		$flash = false;
+
+	if (isset($_REQUEST['flash']) && '0' == $_REQUEST['flash'])
+		$flash = false;
+
+	$flash = apply_filters('import_flash_uploader', $flash);
 ?>
+
 <form enctype="multipart/form-data" id="import-upload-form" method="post" action="<?php echo attribute_escape($action) ?>">
-<p>
-<?php wp_nonce_field('import-upload'); ?>
-<label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)
-<input type="file" id="upload" name="import" size="25" />
-<input type="hidden" name="action" value="save" />
-<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
-</p>
-<p class="submit">
-<input type="submit" class="button" value="<?php _e( 'Upload file and import' ); ?>" />
-</p>
+
+<?php if ( $flash ) : ?>
+<script type="text/javascript">
+<!--
+SWFUpload.onload = function() {
+	post_id = 0;
+	import_nonce = '<?php echo wp_create_nonce('import-upload'); ?>';
+	swfu = new SWFUpload({
+			button_text: '<span class="button"><?php _e('Choose File'); ?></span>',
+			button_text_style: '.button { text-align: center; font-weight: bold; font-family:"Lucida Grande","Lucida Sans Unicode",Tahoma,Verdana,sans-serif; }',
+			button_height: "24",
+			button_width: "132",
+			button_image_url: '<?php echo includes_url('images/upload.png'); ?>',
+			button_placeholder_id: "flash-browse-button",
+			upload_url : "<?php echo attribute_escape( admin_url('async-upload.php') ); ?>",
+			flash_url : "<?php echo includes_url('js/swfupload/swfupload.swf'); ?>",
+			file_post_name: "async-upload",
+			file_types: "<?php echo apply_filters('import_upload_file_glob', '*.*'); ?>",
+			file_upload_limit: 1,
+			post_params : {
+				"auth_cookie" : "<?php if ( is_ssl() ) echo $_COOKIE[SECURE_AUTH_COOKIE]; else echo $_COOKIE[AUTH_COOKIE]; ?>",
+				"_wpnonce" : "<?php echo wp_create_nonce('media-form'); ?>",
+				"short" : "true",
+			},
+			file_size_limit : "<?php echo $bytes; ?>b",
+			file_dialog_start_handler : fileDialogStart,
+			file_queued_handler : fileQueued,
+			upload_start_handler : uploadStart,
+			upload_progress_handler : uploadProgress,
+			upload_error_handler : uploadError,
+			upload_success_handler : importUploadSuccess,
+			upload_complete_handler : uploadComplete,
+			file_queue_error_handler : fileQueueError,
+			file_dialog_complete_handler : fileDialogComplete,
+			swfupload_pre_load_handler: swfuploadPreLoad,
+			swfupload_load_failed_handler: swfuploadLoadFailed,
+			custom_settings : {
+				degraded_element_id : "html-upload-ui", // id of the element displayed when swfupload is unavailable
+				swfupload_element_id : "flash-upload-ui" // id of the element displayed when swfupload is available
+			},
+			debug: false
+		});
+};
+//-->
+</script>
+
+<div id="flash-upload-ui">
+<?php do_action('pre-flash-import-upload-ui'); ?>
+	<div id="flash-upload-msg"><?php _e( 'Click the button to choose a file to import' ); ?> <div id="flash-browse-button"></div></div>
+	<?php media_upload_flash_bypass() ?>
+	<div id="media-items"></div>
+<?php do_action('post-flash-import-upload-ui'); ?>
+</div>
+
+<?php endif; // $flash ?>
+
+<div id="html-upload-ui">
+<?php do_action('pre-html-import-upload-ui'); ?>
+	<p id="async-upload-wrap">
+		<?php wp_nonce_field('import-upload'); ?>
+		<label for="upload"><?php _e( 'Choose a file from your computer:' ); ?></label> (<?php printf( __('Maximum size: %s' ), $size ); ?>)
+		<input type="file" id="upload" name="import" size="25" />
+		<input type="hidden" name="action" value="save" />
+		<input type="hidden" name="max_file_size" value="<?php echo $bytes; ?>" />
+	</p>
+	<?php media_upload_html_bypass() ?>
+	<p class="submit">
+		<input type="submit" class="button" value="Upload &amp; Import" />
+	</p>
+	
+<?php do_action('post-html-import-upload-ui'); ?>
+</div>
+
 </form>
 <?php
 }
Index: wp-admin/admin.php
===================================================================
--- wp-admin/admin.php	(revision 10331)
+++ wp-admin/admin.php	(working copy)
@@ -97,7 +97,11 @@
 
 	exit();
 } else if (isset($_GET['import'])) {
-
+	wp_enqueue_script('swfupload');
+	wp_enqueue_script('swfupload-swfobject');
+	wp_enqueue_script('swfupload-queue');
+	wp_enqueue_script('swfupload-handlers');
+	wp_admin_css('media');
 	$importer = $_GET['import'];
 
 	if ( ! current_user_can('import') )
Index: wp-admin/import/livejournal.php
===================================================================
--- wp-admin/import/livejournal.php	(revision 10331)
+++ wp-admin/import/livejournal.php	(working copy)
@@ -35,8 +35,20 @@
 
 	function greet() {
 		echo '<div class="narrow">';
-		echo '<p>'.__('Howdy! Upload your LiveJournal XML export file and we&#8217;ll import the posts into this blog.').'</p>';
-		echo '<p>'.__('Choose a LiveJournal XML file to upload, then click Upload file and import.').'</p>';
+		echo '<p>'.__('Howdy! Let\'s get your LiveJournal posts imported into this blog.').'</p>';
+		echo '<ol>';
+		echo '<li>'.__('Use the <a href="http://www.livejournal.com/export.bml" target="_blank">LiveJournal Export Journal tool</a> to export all of your posts. You will need to export each month separately, and save the files to your computer. Use these options when exporting:');
+			echo '<ul>';
+			echo '<li>'.__('<strong>Export what:</strong> Journal entries').'</li>';
+			echo '<li>'.__('<strong>Select month:</strong> yyyy: (each year) - mm: (each month) [LJ only allows you to export one month at a time, so you should go through each month of each year that you have posts for and create a separate export file.]').'</li>';
+			echo '<li>'.__('<strong>Format:</strong> XML').'</li>';
+			echo '<li>'.__('<strong>Header:</strong> Checked').'</li>';
+			echo '<li>'.__('<strong>Encoding:</strong> Unicode (UTF-8)').'</li>';
+			echo '<li>'.__('<strong>Do not translate between encodings:</strong> Unchecked').'</li>';
+			echo '<li>'.__('<strong>Fields:</strong> Check All').'</li>';
+			echo '</ul></li>';
+		echo '<li>'.__('Come back here when you\'re done and upload each file using the form below to import the entries into this blog.').'</li>';
+		echo '</ol>';
 		wp_import_upload_form("admin.php?import=livejournal&amp;step=1");
 		echo '</div>';
 	}
@@ -70,9 +82,17 @@
 			$post_content = $this->unhtmlentities($post_content);
 
 			// Clean up content
-			$post_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $post_content);
+			$post_content = preg_replace_callback('|<(/?[A-Z]+)|', create_function('$match', 'return "<" . strtolower($match[1]);'), $post_content);
 			$post_content = str_replace('<br>', '<br />', $post_content);
 			$post_content = str_replace('<hr>', '<hr />', $post_content);
+			// Links to other LJ users
+			$post_content = preg_replace('|<lj\s+user\s*=\s*["\']([\w-]+)["\']>|', '<a href="http://$1.livejournal.com/" class="lj-user">$1</a>', $post_content);
+			// lj-cut ==> <!--more-->
+			$post_content = str_replace(array('<lj-cut>', '</lj-cut>'), array('<!--more-->', ''), $post_content);
+			// Remove all but the first <!--more-->
+			$first = strpos($post_content, '<!--more-->');
+			$post_content = str_replace(substr($post_content, $first + 1), str_replace('<!--more-->', '', substr($post_content, $first + 1)), $post_content);
+			
 			$post_content = $wpdb->escape($post_content);
 
 			$post_author = $current_user->ID;
@@ -106,7 +126,7 @@
 					$comment_content = $this->unhtmlentities($comment_content);
 
 					// Clean up content
-					$comment_content = preg_replace('|<(/?[A-Z]+)|e', "'<' . strtolower('$1')", $comment_content);
+					$comment_content = preg_replace_callback('|<(/?[A-Z]+)|', create_function('$match', 'return "<" . strtolower($match[1]);'), $comment_content);
 					$comment_content = str_replace('<br>', '<br />', $comment_content);
 					$comment_content = str_replace('<hr>', '<hr />', $comment_content);
 					$comment_content = $wpdb->escape($comment_content);
Index: wp-admin/import/rss.php
===================================================================
--- wp-admin/import/rss.php	(revision 10331)
+++ wp-admin/import/rss.php	(working copy)
@@ -118,9 +118,9 @@
 		echo '<ol>';
 
 		foreach ($this->posts as $post) {
-			echo "<li>".__('Importing post...');
-
+			echo "<li>";
 			extract($post);
+			printf(__('Importing post <em>%s</em>...'), stripslashes($post_title));
 
 			if ($post_id = post_exists($post_title, $post_content, $post_date)) {
 				_e('Post already imported');
