Index: wp-admin/ms-upgrade-network.php
===================================================================
--- wp-admin/ms-upgrade-network.php	(revision 14044)
+++ wp-admin/ms-upgrade-network.php	(working copy)
@@ -12,24 +12,32 @@
 if ( !is_multisite() )
 	wp_die( __('Multisite support is not enabled.') );
 
-require_once( ABSPATH . WPINC . '/http.php' );
-
-$title = __('Update Network');
-$parent_file = 'ms-admin.php';
-require_once('admin-header.php');
-
 if ( ! current_user_can( 'manage_network' ) )
 	wp_die( __('You do not have permission to access this page.') );
 
-echo '<div class="wrap">';
-screen_icon();
-echo '<h2>'.__('Update Network').'</h2>';
+require_once( ABSPATH . WPINC . '/http.php' );
 
 $action = isset($_GET['action']) ? $_GET['action'] : 'show';
+$n = ( isset($_GET['n']) ) ? intval($_GET['n']) : 0;
 
+$ajax = false;
+if ( 'upgrade' == $action && $n > 4 )
+	$ajax = true;
+
+if ( !$ajax ) {
+	$title = __('Update Network');
+	$parent_file = 'ms-admin.php';
+	require_once('admin-header.php');
+	echo '<div class="wrap">';
+	screen_icon();
+	echo '<h2>'.__('Update Network').'</h2>';
+} else {
+	@header('Content-Type: text/html; charset=' . get_option('blog_charset'));
+}
+
 switch ( $action ) {
 	case "upgrade":
-		$n = ( isset($_GET['n']) ) ? intval($_GET['n']) : 0;
+		
 
 		if ( $n < 5 ) {
 			global $wp_db_version;
@@ -37,41 +45,66 @@
 		}
 
 		$blogs = $wpdb->get_results( "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5", ARRAY_A );
-		if ( empty( $blogs ) ) {
-			echo '<p>' . __( 'All done!' ) . '</p>';
-			break;
-		}
-		echo "<ul>";
+		if ( empty( $blogs ) ) 
+			die( '0' );
+
+		if ( !$ajax )
+			echo "<ul id='site_list'>";
+
 		foreach ( (array) $blogs as $details ) {
 			if ( $details['spam'] == 0 && $details['deleted'] == 0 && $details['archived'] == 0 ) {
 				$siteurl = get_blog_option( $details['blog_id'], 'siteurl' );
-				echo "<li>$siteurl</li>";
+
 				$response = wp_remote_get( trailingslashit( $siteurl ) . "wp-admin/upgrade.php?step=1", array( 'timeout' => 120, 'httpversion' => '1.1' ) );
-				if ( is_wp_error( $response ) )
-					wp_die( "<strong>Warning!</strong> Problem updating {$siteurl}. Your server may not be able to connect to sites running on it.<br /> Error message: <em>" . $response->get_error_message() ."</em>" );
+				if ( is_wp_error( $response ) ) {
+					echo '<div class="error inline" style="width:600px;"><p>';
+					_e( "<strong>Warning!</strong> Problem updating {$siteurl}. Your server may not be able to connect to sites running on it.<br /> Error message: <em>" . $response->get_error_message() ."</em>" );
+					echo '</p></div>';
+				} else {
+					echo "<li><div class='updated inline' style='width:600px;'><p><strong>" . __('Successful:') . "</strong> $siteurl</p></div></li>";
+				}
 				do_action( 'after_mu_upgrade', $response );
 				do_action( 'wpmu_upgrade_site', $details[ 'blog_id' ] );
 			}
 		}
-		echo "</ul>";
-		?><p><?php _e("If your browser doesn't start loading the next page automatically click this link:"); ?> <a class="button" href="ms-upgrade-network.php?action=upgrade&amp;n=<?php echo ($n + 5) ?>"><?php _e("Next Sites"); ?></a></p>
+		if ( !$ajax ) {
+			echo "</ul>";
+		?>
+		
 		<script type='text/javascript'>
-		<!--
-		function nextpage() {
-			location.href = "ms-upgrade-network.php?action=upgrade&n=<?php echo ($n + 5) ?>";
+		jQuery(document).ready(function($){
+			var admin_url = "<?php echo admin_url(); ?>";
+			var n = 0;
+
+			function nextsites() {
+				n = n + 5;
+				nexturl = admin_url + 'ms-upgrade-network.php?action=upgrade&n=' + n;
+				jQuery.post(nexturl, function(r) {
+					if ( r == '0' ) {
+						$('ul#site_list').after('<div class="updated inline"><p><strong><?php _e('All Done!'); ?></strong></p></div>');
+						$('div.wrap h2:first').after('<div id="message" class="updated fade"><p><strong><?php _e( 'All Done!' ); ?></strong></p></div>');
+					} else {
+						$('ul#site_list').append(r);
+						nextsites();
+					}
+				})
+			}
+			nextsites();
+		})
+		</script>
+		<?php
 		}
-		setTimeout( "nextpage()", 250 );
-		//-->
-		</script><?php
 	break;
 	case 'show':
 	default:
 		?><p><?php _e("You can update all the sites on your network through this page. It works by calling the update script of each site automatically. Hit the link below to update."); ?></p>
-		<p><a class="button" href="ms-upgrade-network.php?action=upgrade"><?php _e("Update Network"); ?></a></p><?php
+		<p><a class="button" href="<?php echo admin_url( 'ms-upgrade-network.php?action=upgrade' ) ?>"><?php _e("Update Network"); ?></a></p><?php
 		do_action( 'wpmu_upgrade_page' );
 	break;
 }
+
+if ( !$ajax ) {
+	include('admin-footer.php');
+	echo '</div>';
+}
 ?>
-</div>
-
-<?php include('admin-footer.php'); ?>
