Index: wp-admin/css/wp-admin.css
===================================================================
--- wp-admin/css/wp-admin.css	(revision 24303)
+++ wp-admin/css/wp-admin.css	(working copy)
@@ -3641,6 +3641,15 @@
 	display: block;
 }
 
+#diff-paginate {
+	text-align: center;
+	margin: 10px 0 0 0;
+}
+
+#diff-paginate input {
+	margin: 0 2px;
+}
+
 #diff-title-to strong {
 	display: none;
 }
@@ -3693,6 +3702,7 @@
 
 .comparing-two-revisions #diff-previous-revision,
 .comparing-two-revisions #diff-next-revision,
+.comparing-two-revisions .button.paginate,
 #diff-header-from {
 	display: none;
 }
Index: wp-admin/includes/ajax-actions.php
===================================================================
--- wp-admin/includes/ajax-actions.php	(revision 24303)
+++ wp-admin/includes/ajax-actions.php	(working copy)
@@ -2112,16 +2112,17 @@
 	$right_handle_at = ! empty( $_GET['right_handle_at'] ) ? (int) $_GET['right_handle_at'] : 0;
 	$left_handle_at = ! empty( $_GET['left_handle_at'] ) ? (int) $_GET['left_handle_at'] : 0;
 	$single_revision_id = ! empty( $_GET['single_revision_id'] ) ? absint( $_GET['single_revision_id'] ) : 0;
+	$page_size          = ! empty( $_GET['page_size'] ) ? absint( $_GET['page_size'] ) : -1;
+	$pages              = ! empty( $_GET['pages']     ) ? absint( $_GET['pages']     ) :  1;
+	$page               = ! empty( $_GET['page']      ) ? absint( $_GET['page']      ) :  1;
 	$compare_two_mode = (bool) $post_id;
 
 	$all_the_revisions = array();
-	if ( ! $post_id )
-		$post_id = $compare_to;
 
 	if ( ! current_user_can( 'read_post', $post_id ) )
 		continue;
 
-	if ( ! $revisions = wp_get_post_revisions( $post_id ) )
+	if ( ! $revisions = wp_get_post_revisions( $post_id, array( 'posts_per_page' => $page_size, 'paged' => $page ) ) )
 		return;
 
 	$left_revision = get_post( $compare_to );
@@ -2186,7 +2187,12 @@
 	// reverse the list to start with oldest revision
 	$revisions = array_reverse( $revisions );
 
-	$previous_revision_id = 0;
+	if ( $page < $pages ) { // not on last page
+		$previous =	array_pop( wp_get_post_revisions( $post_id, array( 'posts_per_page' => $page_size, 'paged' => $page, 'order' => 'ASC', 'numberposts' => 1 ) ) );
+		$previous_revision_id = $previous->ID;
+	} else {
+		$previous_revision_id = 0;
+	}
 
 	/* translators: revision date format, see http://php.net/date */
 	$datef = _x( 'j F, Y @ G:i:s', 'revision date format');
@@ -2209,6 +2215,7 @@
 				 ( 0 != $right_handle_at && $count > ( $right_handle_at - 2 ) ) ) ) {
 				$all_the_revisions[] = array (
 					'ID' => $revision->ID,
+					'timestamp' => strtotime($revision->post_modified),
 				);
 				continue;
 			}
@@ -2217,6 +2224,7 @@
 				 ( 0 != $left_handle_at && $count < $right_handle_at ) ) ) {
 				$all_the_revisions[] = array (
 					'ID' => $revision->ID,
+					'timestamp' => strtotime($revision->post_modified),
 				);
 				continue;
 			}
@@ -2305,6 +2313,7 @@
 				'restoreLink'  => urldecode( $restore_link ),
 				'previousID'   => $previous_revision_id,
 				'isCurrent'    => $is_current_revision,
+				'timestamp'    => strtotime($revision->post_modified),
 			);
 		}
 		$previous_revision_id = $revision->ID;
Index: wp-admin/js/revisions.js
===================================================================
--- wp-admin/js/revisions.js	(revision 24303)
+++ wp-admin/js/revisions.js	(working copy)
@@ -41,6 +41,7 @@
 
 		constructor: function() {
 			var self    = this;
+			this.page   = parseInt( revisions.model.settings.page );
 			this.slider = new revisions.view.Slider();
 
 			if ( null === this.revisions ) {
@@ -62,10 +63,22 @@
 				delay = 0,
 				totalChanges;
 
-			// match slider to passed revision_id
-			_.each( revisionsToLoad, function( revision ) {
-				if ( revision.get( 'ID' ) == revisions.model.settings.revision_id )
-					self.rightDiff = self.revisions.indexOf( revision ) + 1;
+			// match slider to passed revision_id when on initial page
+			if ( self.revisionsInteractions == null ) {
+				_.each( revisionsToLoad, function( revision ) {
+					if ( revision.get( 'ID' ) == revisions.model.settings.revision_id )
+						self.rightDiff = self.revisions.indexOf( revision ) + 1;
+				});
+			}
+
+			// order revisions in their chronological closeness to the handle(s)
+			var left  = self.singleRevision ? 0 : self.revisions.at( self.leftDiff - 1 ).get( 'timestamp' ),
+			    right = self.revisions.at( self.rightDiff - 1 ).get( 'timestamp' );
+			revisionsToLoad = _.sortBy( revisionsToLoad, function( model ) {
+				var t = model.get( 'timestamp' ),
+				    y = Math.abs( t - right ),
+				    x = Math.abs( t - left  );
+				return _.min( [x, y] );
 			});
 
 			_.each( revisionsToLoad, function( revision ) {
@@ -142,32 +155,45 @@
 		},
 
 		// load the models for the single handle mode
-		reloadModelSingle: function() {
+		reloadModelSingle: function( pageChange ) {
 			var self = this;
 
 			self.startRightModelLoading();
+			self.revisionsInteractions.buttonsDisable();
+			self.slider.disable();
 
 			self.revisions.reload({
 				options: {
-				'showAutosaves': self.autosaves,
-				'showSplitView': self.showSplitView
+					'showAutosaves': self.autosaves,
+					'showSplitView': self.showSplitView
 				},
 
 				success: function() {
-					var revisionCount = self.revisions.length;
+					var revisionCount = self.revisions.length,
+					    pos = self.rightDiff;
+
+					if ( pageChange !== 'undefined' )
+						pos = ( pageChange == 'left' ) ? revisionCount : 1;
+					self.rightDiff = pos;
+
+					self.slider.refresh({
+						'max': revisionCount - 1, // slider starts at 0 in single handle mode
+						'value': pos - 1 // slider starts at 0 in single handle mode
+					}, true);
 					self.revisionView.model = self.revisions;
 					self.revisionView.render();
 					self.loadDiffs( self.revisions );
 					self.tickmarkView.model = self.revisions;
 					self.tickmarkView.render();
-					self.slider.refresh({
-						'max': revisionCount - 1, // slider starts at 0 in single handle mode
-						'value': self.rightDiff - 1 // slider starts at 0 in single handle mode
-					}, true);
+
+					self.revisionsInteractions.buttonsEnable();
+					self.slider.enable();
 				},
 
 				error: function() {
 					self.stopRightModelLoading();
+					self.revisionsInteractions.buttonsEnable();
+					self.slider.enable();
 				}
 			});
 		},
@@ -234,8 +260,6 @@
 		 * reloadLeftRight reload models for both the left and right handles
 		 */
 		reloadLeftRight: function() {
-			this.startRightModelLoading();
-			this.startLeftModelLoading();
 			this.reloadLeft();
 			this.reloadRight();
 		},
@@ -245,14 +269,14 @@
 				next = ! isRtl ? $( '#next' ) : $( '#previous' ),
 				prev = ! isRtl ? $( '#previous' ) : $( '#next' );
 
-			// Disable "Next" button if you're on the last node
-			if ( maxVal === val )
+			// Disable "Next" button if you're on the last node and first page
+			if ( maxVal === val && Diff.page == 1 )
 				next.prop( 'disabled', true );
 			else
 				next.prop( 'disabled', false );
 
-			// Disable "Previous" button if you're on the 0 node
-			if ( 0 === val )
+			// Disable "Previous" button if you're on the 0 node and last page
+			if ( 0 === val && Diff.page == revisions.model.settings.pages )
 				prev.prop( 'disabled', true );
 			else
 				prev.prop( 'disabled', false );
@@ -430,6 +454,14 @@
 			return $( '#diff-slider' ).slider( 'option', key );
 		},
 
+		disable: function() {
+			$( '#diff-slider' ).slider( "disable" );
+		},
+
+		enable: function() {
+			$( '#diff-slider' ).slider( "enable" );
+		},
+
 		render: function() {
 			var self = this;
 			// this.$el doesn't work, why?
@@ -453,11 +485,19 @@
 		el: $('#diff-slider-ticks'),
 		template: wp.template('revision-ticks'),
 		model: Revision,
+		initWidth: null,
 
+		initialize: function() {
+			$(window).on('resize', this, this.resize);
+		},
+
 		resetTicks: function() {
+			if ( this.initWidth == null )
+				this.initWidth = Diff.slider.width();
+
 			var sliderMax, sliderWidth, adjustMax, tickWidth, tickCount = 0, aTickWidth, tickMargin, self = this, firstTick, lastTick;
 			sliderMax   = Diff.slider.option( 'max' );
-			sliderWidth = Diff.slider.width();
+			sliderWidth = this.initWidth;
 			adjustMax   = Diff.singleRevision ? 0 : 1;
 			tickWidth   = Math.floor( sliderWidth / ( sliderMax - adjustMax ) );
 			tickWidth   = ( tickWidth > 50 ) ? 50 : tickWidth; // set minimum and maximum widths for tick marks
@@ -539,6 +579,14 @@
 			} );
 		},
 
+		/**
+		 * Readjusts the slider width depending on the containers width.
+		 */
+		resize: function( e ) {
+			e.data.initWidth = $('#revision-diff-container').width() - 200;
+			e.data.render();
+		},
+
 		// render the tick mark view
 		render: function() {
 			var self = this, addHtml;
@@ -554,12 +602,12 @@
 			self.resetTicks();
 			return self;
 		}
-	} );
+	});
 
 	/**
 	 * wp.revisions.view.Interact
 	 *
-	 * Next/Prev buttons and the slider
+	 * Next/Prev/pagination buttons and the slider
 	 */
 	revisions.view.Interact = Backbone.View.extend({
 		el: $( '#revision-interact' ),
@@ -568,7 +616,8 @@
 		// next and previous buttons, only available in compare one mode
 		events: {
 			'click #next':     ! isRtl ? 'nextRevision' : 'previousRevision',
-			'click #previous': ! isRtl ? 'previousRevision' : 'nextRevision'
+			'click #previous': ! isRtl ? 'previousRevision' : 'nextRevision',
+			'click .paginate': 'changePage'
 		},
 
 		render: function() {
@@ -608,29 +657,62 @@
 			return this;
 		},
 
+		buttonsEnable: function() {
+			$( "#previous, #next, .paginate:not(.disabled)" ).prop('disabled', false);
+		},
+
+		buttonsDisable: function() {
+			$( "#previous, #next, .paginate" ).prop('disabled', true);
+		},
+
 		// go to the next revision
 		nextRevision: function() {
-			if ( Diff.rightDiff < this.model.length ) // unless at right boundry
-				Diff.rightDiff = Diff.rightDiff + 1 ;
+			if ( Diff.rightDiff < this.model.length ) { // unless at right boundary
+				Diff.rightDiff = Diff.rightDiff + 1;
 
-			Diff.revisionView.render();
+				Diff.revisionView.render();
 
-			Diff.slider.refresh({
-				value: Diff.rightDiff - 1
-			}, true );
+				Diff.slider.refresh({
+					value: Diff.rightDiff - 1
+				}, true );
+			}	else if ( Diff.page > 1 ) { // move to previous page
+				this.changePage( +Diff.page - 1 );
+			}
 		},
 
 		// go to the previous revision
 		previousRevision: function() {
-			if ( Diff.rightDiff > 1 ) // unless at left boundry
-				Diff.rightDiff = Diff.rightDiff - 1 ;
+			if ( Diff.rightDiff > 1 ) { // unless at left boundary
+				Diff.rightDiff = Diff.rightDiff - 1;
 
-			Diff.revisionView.render();
+				Diff.revisionView.render();
 
-			Diff.slider.refresh({
-				value: Diff.rightDiff - 1
-			}, true );
-		}
+				Diff.slider.refresh({
+					value: Diff.rightDiff - 1
+				}, true );
+			} else if ( Diff.page < revisions.model.settings.pages ) { // move to next page
+				this.changePage( +Diff.page + 1 );
+			}
+		},
+
+		changePage: function(arg) {
+			if ( ! Diff.slider.singleRevision ) // only in single handle mode
+				return;
+
+			var self = this;
+
+			// get page button depending on how function is called (direct or onclick)
+			var newPage = $.isNumeric(arg) ? arg : $( arg.currentTarget ).data( 'id' ),
+			    oldPage = Diff.page;
+
+			Diff.page = newPage;
+
+			$( ".paginate[data-id=" + newPage + "]" ).addClass(   'disabled' );
+			$( ".paginate[data-id=" + oldPage + "]" ).removeClass('disabled' );
+
+			var direction =  newPage > oldPage ? 'left' : 'right';
+			Diff.reloadModelSingle( direction );
+ 		}
 	});
 
 	/**
@@ -699,27 +781,38 @@
 			if ( $( '#compare-two-revisions' ).is( ':checked' ) ) { // compare 2 mode
 				Diff.singleRevision = false ;
 
-				// in RTL mode handles are swapped, so boundary checks are different;
-				if ( isRtl ){
-					Diff.leftDiff = Diff.revisions.length; // put the left handle at the rightmost position, representing current revision
+				// ensure that we are on page one
+				Diff.page = 1;
 
-					if ( Diff.revisions.length === Diff.rightDiff ) // make sure 'left' handle not in rightmost slot
-						Diff.rightDiff = Diff.rightDiff - 1;
-				} else {
-					if ( 1 === Diff.rightDiff ) // make sure right handle not in leftmost slot
-						Diff.rightDiff = 2;
-				}
+				// fix tickmarks
+				Diff.tickmarkView.resetTicks();
+				Diff.revisions.reload({
+					success: function() {
+						// in RTL mode handles are swapped, so boundary checks are different;
+						if ( isRtl ){
+							Diff.leftDiff = Diff.revisions.length; // put the left handle at the rightmost position, representing current revision
 
-				Diff.revisionView.draggingLeft = false;
+							if ( Diff.revisions.length === Diff.rightDiff ) // make sure 'left' handle not in rightmost slot
+								Diff.rightDiff = Diff.rightDiff - 1;
+						} else {
+							if ( 1 === Diff.rightDiff ) // make sure right handle not in leftmost slot
+								Diff.rightDiff = 2;
+						}
 
-				revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision
-				Diff.reloadLeftRight(); // load diffs for left and right handles
-				Diff.revisionView.model = Diff.rightHandleRevisions;
+						Diff.revisionView.draggingLeft = false;
 
+						revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision
+						Diff.reloadLeftRight(); // load diffs for left and right handles
+						Diff.revisionView.model = Diff.rightHandleRevisions;
+					}
+				});
+
+
 			} else { // compare one mode
 				Diff.singleRevision = true;
 				Diff.revisionView.draggingLeft = false;
-				Diff.reloadModelSingle();
+				Diff.page = null;
+				Diff.revisionsInteractions.changePage( 1 );
 			}
 			Diff.revisionsInteractions.render();
 			Diff.tickmarkView.render();
@@ -781,6 +874,11 @@
 	Revisions = revisions.Revisions = Backbone.Collection.extend({
 		model: Revision,
 
+		// sorts the revisions ASC by 'last modified' timestamp
+		comparator: function(item) {
+			return item.get('timestamp');
+		},
+
 		initialize: function( models, options ) {
 			this.options = _.defaults( options || {}, {
 				'compareTo': revisions.model.settings.post_id,
@@ -789,11 +887,17 @@
 				'showSplitView': true,
 				'rightHandleAt': 0,
 				'leftHandleAt': 0,
+				'pageSize': revisions.model.settings.page_size,
+				'pageSize2': revisions.model.settings.page_size_2,
+				'pages': revisions.model.settings.pages,
 				'nonce': revisions.model.settings.nonce
 			});
 		},
 
 		url: function() {
+			if( _.isUndefined( Diff.page ) )
+				Diff.page = revisions.model.settings.page;
+
 			return ajaxurl +
 				'?action=revisions-data' +
 				'&compare_to=' + this.options.compareTo + // revision are we comparing to
@@ -802,6 +906,9 @@
 				'&show_split_view=' + this.options.showSplitView + // show in split view or single column view
 				'&right_handle_at=' + this.options.rightHandleAt + // mark point for comparison list
 				'&left_handle_at=' + this.options.leftHandleAt + // mark point for comparison list
+				'&page_size=' + this.options.page_size +
+				'&pages=' + this.options.pages +
+				'&page=' + Diff.page +
 				'&nonce=' + this.options.nonce;
 		},
 
Index: wp-admin/revision.php
===================================================================
--- wp-admin/revision.php	(revision 24303)
+++ wp-admin/revision.php	(working copy)
@@ -78,11 +78,16 @@
 
 wp_enqueue_script( 'revisions' );
 
+$page_size = 50;
+$revisions_idx = array_flip( array_keys( wp_get_post_revisions( $post->ID ) ) );
 
 $settings = array(
 	'post_id'     => $post->ID,
 	'nonce'       => wp_create_nonce( 'revisions-ajax-nonce' ),
-	'revision_id' => $revision_id
+	'revision_id' => $revision_id,
+	'page'        => floor( ( ( $revisions_idx[$revision_id] ) / $page_size) ) + 1,
+	'pages'       => floor( count( $revisions_idx ) / $page_size ) + 1,
+	'page_size'   => $page_size,
 );
 
 wp_localize_script( 'revisions', 'wpRevisionsSettings', $settings );
@@ -172,6 +177,19 @@
 	</div>
 
 	<div id="diff-slider" class="wp-slider"></div>
+
+	<?php if ( $settings['pages'] > 1 ) : ?>
+	<div id="diff-paginate">
+		<?php
+		// display pages from high to low
+		for( $i = $settings['pages']; $i >= 1; $i-- ) {
+			$value = ( ( $i == $settings['pages'] ) ? count( $revisions_idx ) : $i * $page_size );
+			$value .= '-' . (($i-1) * $page_size + 1);
+			echo "<input class='button paginate' value='$value' data-id='$i' type='button'".disabled( $i, $settings['page'], false)." />\n";
+		}
+		?>
+	</div>
+	<?php endif; ?>
 </script>
 
 <script id="tmpl-revision-ticks" type="text/html">
