Index: wp-admin/js/revisions.js
===================================================================
--- wp-admin/js/revisions.js	(revision 24346)
+++ wp-admin/js/revisions.js	(working copy)
@@ -38,6 +38,8 @@
 		rightModelLoading: false,	// disallow slider interaction, also repeat loads, while loading
 		tickmarkView: null, // the slider tickmarks
 		slider: null, // the slider instance
+		maxConcurrentRequests: 3,
+		currentRequests: 1,
 
 		constructor: function() {
 			var self    = this;
@@ -56,58 +58,85 @@
 			}
 		},
 
-		loadDiffs: function( models ) {
+		/*
+		 * Time to load all the models, each model represents a comparison
+		 */
+		loadDiffs: function( models, otherModels ) {
+			// in two handle mode, pass the other handle's models and copy over scopeOfChanges (tick width)
+			// from that model for positions this handle can't reach (but the other handle can reach)
+			// (only do this once)
+			if ( 'undefined' !== typeof otherModels ) { // otherModels only passed in two handle mode
+				_.each( models.where( { loadedStatus: 'true' } ), // select just the models that are marked as not needing loading, eg. positions this handle can't reach
+					function( theModel ) {
+						foundModel = otherModels.findWhere( { ID: theModel.id } ); //find the matching position from the other handle's models
+						if ( 'undefined' !== typeof foundModel ) {
+							theModel.set( 'scopeOfChanges', // set the displayed scope of changes for ticks this handle can't get to
+								foundModel
+								.get( 'scopeOfChanges' ) ); // copy the scope of changes from the other handle which can reach this spot
+						}
+					}
+				);
+			}
+			this.loadDiffsRecursive( models, otherModels ); // recursively load models that need loading
+		},
+
+		/*
+		 * load models that aren't loaded yet
+		 */
+		loadDiffsRecursive: function( models, otherModels ) {
 			var self = this,
-				revisionsToLoad = models.where( { completed: false } ),
-				delay = 0,
-				totalChanges;
-
-			// match slider to passed revision_id
-			_.each( revisionsToLoad, function( revision ) {
-				if ( revision.get( 'ID' ) == revisions.model.settings.revision_id )
+				revision = models.findWhere( { loadedStatus: 'false' } ), // find the first model needing loading
+				totalChanges,
+				foundModel;
+			if ( 'undefined' === typeof revision ) { // nothing to load this time
+				self.tickmarkView.render();
+			} else {
+				if ( revision.get( 'ID' ) == revisions.model.settings.revision_id ) { // match slider to passed revision_id
 					self.rightDiff = self.revisions.indexOf( revision ) + 1;
-			});
+					self.revisionsInteractions.render();
+					self.tickmarkView.render();
+				}
+				revision.set( 'loadedStatus', 'loading' );
+				revision.fetch( {
+					update: true,
+					add: false,
+					remove: false,
+					success: function( model ) {
 
-			_.each( revisionsToLoad, function( revision ) {
-					_.delay( function() {
-						revision.fetch( {
-							update: true,
-							add: false,
-							remove: false,
-							success: function( model ) {
-								model.set( 'completed', true );
+						// stop spinner when all models are loaded
+						if ( 0 === models.where( { loadedStatus: 'false' } ).length )
+							self.stopModelLoadingSpinner();
 
-								// stop spinner when all models are loaded
-								if ( 0 === models.where( { completed: false } ).length )
-									self.stopModelLoadingSpinner();
+						totalChanges = model.get( 'linesAdded' ) + model.get( 'linesDeleted' ),
+							scopeOfChanges = 'vsmall';
 
-								totalChanges = model.get( 'linesAdded' ) + model.get( 'linesDeleted' ),
-									scopeOfChanges = 'vsmall';
+						// Note: hard coded scope of changes
+						// TODO change to dynamic based on range of values
+						if ( totalChanges > 1 && totalChanges <= 3 ) {
+							scopeOfChanges = 'small';
+						} else if ( totalChanges > 3 && totalChanges <= 5 ) {
+							scopeOfChanges = 'med';
+						} else if ( totalChanges > 5 && totalChanges <= 10 ) {
+							scopeOfChanges = 'large';
+						} else if ( totalChanges > 10 ) {
+							scopeOfChanges = 'vlarge';
+						}
+						model.set( 'scopeOfChanges', scopeOfChanges );
+						if ( 0 !== self.rightDiff &&
+							model.get( 'ID' ) === self.revisions.at( self.rightDiff - 1 ).get( 'ID' ) ) {
 
-								// Note: hard coded scope of changes
-								// TODO change to dynamic based on range of values
-								if ( totalChanges > 1 && totalChanges <= 3 ) {
-									scopeOfChanges = 'small';
-								} else if ( totalChanges > 3 && totalChanges <= 5 ) {
-									scopeOfChanges = 'med';
-								} else if ( totalChanges > 5 && totalChanges <= 10 ) {
-									scopeOfChanges = 'large';
-								} else if ( totalChanges > 10 ) {
-									scopeOfChanges = 'vlarge';
-								}
-								model.set( 'scopeOfChanges', scopeOfChanges );
-								if ( 0 !== self.rightDiff &&
-									model.get( 'ID' ) === self.revisions.at( self.rightDiff - 1 ).get( 'ID' ) ) {
-									// reload if current model refreshed
-									self.revisionView.render();
-								}
-								self.tickmarkView.render();
-							}
-					} );
-					}, delay ) ;
-					delay = delay + 150; // stagger model loads to avoid hammering server with requests
+								// reload if current model refreshed
+							self.revisionView.render();
+						}
+						model.set( 'loadedStatus', 'true' );
+						self.loadDiffsRecursive( models, otherModels );
+					}
 				}
 			);
+		}
+			if ( self.currentRequests++ < self.maxConcurrentRequests ) { // limit concurrent requests
+				self.loadDiffsRecursive( models, otherModels ); // load another model without waiting
+			}
 		},
 
 		startLeftModelLoading: function() {
@@ -218,6 +247,7 @@
 					self.stopRightModelLoading();
 					self.loadDiffs( self.rightHandleRevisions );
 					self.tickmarkView.model = self.rightHandleRevisions;
+					self.tickmarkView.render();
 					self.slider.refresh({
 						'max': self.revisions.length
 					}, true);
@@ -472,7 +502,7 @@
 					$( this ).css( 'border-right', ( tickWidth - tickMargin - $( this ).width() ) + 'px solid #f7f7f7'); // space the ticks out using margins
 				});
 				firstTick = $( '.revision-tick' ).first(); //cache selectors for optimization
-				lastTick = $( '.revision-tick' ).last();
+				lastTick  = $( '.revision-tick' ).last();
 
 				sliderWidth = sliderWidth + Math.ceil( ( tickWidth - ( lastTick.outerWidth() - lastTick.innerWidth() ) ) / 2 ); // room for the last tick
 				sliderWidth = sliderWidth + Math.ceil( ( tickWidth - ( firstTick.outerWidth() - firstTick.innerWidth() ) ) / 2 ); // room for the first tick
@@ -750,7 +780,7 @@
 			titleFrom: '',
 			diff: '<div class="diff-loading"><div class="spinner"></div></div>',
 			restoreLink: '',
-			completed: false,
+			loadedStatus: 'false',
 			linesAdded: 0,
 			linesDeleted: 0,
 			scopeOfChanges: 'none',
Index: wp-admin/revision.php
===================================================================
--- wp-admin/revision.php	(revision 24346)
+++ wp-admin/revision.php	(working copy)
@@ -175,7 +175,7 @@
 </script>
 
 <script id="tmpl-revision-ticks" type="text/html">
-	<div class="revision-tick completed-{{{ data.completed }}} scope-of-changes-{{{ data.scopeOfChanges }}}">
+	<div class="revision-tick completed-{{{ data.loadedStatus }}} scope-of-changes-{{{ data.scopeOfChanges }}}">
 		<span class="ui-slider-tooltip ui-widget-content ui-corner-all hidden"></span>
 	</div>
 </script>
