Index: wp-admin/includes/ajax-actions.php
===================================================================
--- wp-admin/includes/ajax-actions.php	(revision 23893)
+++ wp-admin/includes/ajax-actions.php	(working copy)
@@ -2092,22 +2092,22 @@
 function wp_ajax_revisions_data() {
 	check_ajax_referer( 'revisions-ajax-nonce', 'nonce' );
 
-	$compare_to = isset( $_GET['compare_to'] ) ? absint( $_GET['compare_to'] ) : 0;
-	$show_autosaves = isset( $_GET['show_autosaves'] ) ? $_GET['show_autosaves'] : '';
-	$show_split_view = isset( $_GET['show_split_view'] ) ? $_GET['show_split_view'] : '';
-	$post_id = isset( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : '';
-	$right_handle_at = isset( $_GET['right_handle_at'] ) ? $_GET['right_handle_at'] : 0;
-	$left_handle_at = isset( $_GET['left_handle_at'] ) ? $_GET['left_handle_at'] : 0;
-	$single_revision_id = isset( $_GET['single_revision_id'] ) ? $_GET['single_revision_id'] : 0;
+	$compare_to = ! empty( $_GET['compare_to'] ) ? absint( $_GET['compare_to'] ) : 0;
+	$show_autosaves = ! empty( $_GET['show_autosaves'] );
+	$show_split_view = ! empty( $_GET['show_split_view'] );
+	$post_id = ! empty( $_GET['post_id'] ) ? absint( $_GET['post_id'] ) : 0;
+	$right_handle_at = ! empty( $_GET['right_handle_at'] ) ? $_GET['right_handle_at'] : 0;
+	$left_handle_at = ! empty( $_GET['left_handle_at'] ) ? $_GET['left_handle_at'] : 0;
+	$single_revision_id = ! empty( $_GET['single_revision_id'] ) ? $_GET['single_revision_id'] : 0;
+	$compare_two_mode = (bool) $post_id;
 
-	$compare_two_mode = ( '' == $post_id ) ? false : true;
 	//
 	//TODO: currently code returns all possible comparisons for the indicated 'compare_to' revision
 	//however, the front end prevents users from pulling the right handle past the left or the left pass the right,
 	//so only the possible diffs need be generated
 	//
 	$alltherevisions = array();
-	if ( '' == $post_id )
+	if ( ! $post_id )
 		$post_id = $compare_to;
 
 	if ( ! current_user_can( 'read_post', $post_id ) )
@@ -2116,33 +2116,26 @@
 	if ( ! $revisions = wp_get_post_revisions( $post_id ) )
 		return;
 
-	/* translators: revision date format, see http://php.net/date */
-	$datef = _x( 'j F, Y @ G:i:s', 'revision date format');
-
 	$left_revision = get_post( $compare_to );
 
 	//single model fetch mode
 	//return the diff of a single revision comparison
-	if ( 0 != $single_revision_id ) {
+	if ( $single_revision_id ) {
 		$right_revision = get_post( $single_revision_id );
 
-	if ( 0 == $compare_to )
+		if ( ! $compare_to )
 			$left_revision = get_post( $post_id );
 
-	// make sure the right revision is the most recent
-	if ( $compare_two_mode && $right_revision->ID < $left_revision->ID ) {
-		$temp = $left_revision;
-		$left_revision = $right_revision;
-		$right_revision = $temp;
-	}
+		// make sure the right revision is the most recent
+		if ( $compare_two_mode && $right_revision->ID < $left_revision->ID ) {
+			$temp = $left_revision;
+			$left_revision = $right_revision;
+			$right_revision = $temp;
+		}
 
-		$linesadded=0;
-		$linesdeleted=0;
-
-		//
+		$linesadded = $linesdeleted = 0;
+		$content = '';
 		//compare from left to right, passed from application
-		//
-		$content='';
 		foreach ( array_keys( _wp_post_revision_fields() ) as $field ) {
 			$left_content = apply_filters( "_wp_post_revision_field_$field", $left_revision->$field, $field, $left_revision, 'left' );
 			$right_content = apply_filters( "_wp_post_revision_field_$field", $right_revision->$field, $field, $right_revision, 'right' );
@@ -2151,11 +2144,11 @@
 
 			$args = array();
 
-			if ( ! empty( $show_split_view ) )
+			if ( $show_split_view )
 				 $args = array( 'show_split_view' => true );
 
 			// compare_to == 0 means first revision, so compare to a blank field to show whats changed
-			$diff = wp_text_diff_with_count( ( 0 == $compare_to) ? '' : $left_content, $right_content, $args );
+			$diff = wp_text_diff_with_count( ( 0 == $compare_to ) ? '' : $left_content, $right_content, $args );
 
 			if ( isset( $diff[ 'html' ] ) )
 				$content .= $diff[ 'html' ];
@@ -2165,16 +2158,15 @@
 
 			if ( isset( $diff[ 'linesdeleted' ] ) )
 				$linesdeleted = $linesdeleted + $diff[ 'linesdeleted' ];
-
-
 		}
 		$content = '' == $content ? __( 'No difference' ) : $content;
 
 		$alltherevisions = array (
-			'revisiondiff' => $content,
+			'diff'          => $content,
 			'lines_deleted' => $linesdeleted,
-			'lines_added' => $linesadded
+			'lines_added'   => $linesadded
 		);
+
 		echo json_encode( $alltherevisions );
 		exit();
 	} //end single model fetch
@@ -2186,10 +2178,12 @@
 
 	$previous_revision_id = 0;
 
+	/* translators: revision date format, see http://php.net/date */
+	$datef = _x( 'j F, Y @ G:i:s', 'revision date format');
+
 	foreach ( $revisions as $revision ) :
-		//error_log( ( $show_autosaves  ));
-		if ( empty( $show_autosaves ) && wp_is_post_autosave( $revision ) )
-				continue;
+		if ( $show_autosaves && wp_is_post_autosave( $revision ) )
+			continue;
 
 		$revision_from_date_author = '';
 		$count++;
@@ -2230,11 +2224,11 @@
 			$date
 		);
 
-		$autosavef = __( '%1$s [Autosave]' );
-		$currentf  = __( '%1$s [Current Revision]' );
+		$autosavef = _x( '%1$s [Autosave]', 'post revision title extra' );
+		$currentf  = _x( '%1$s [Current Revision]', 'post revision title extra' );
 
-		if ( ! $post = get_post( $post_id))
-			exit();
+		if ( ! $post = get_post( $post_id ) )
+			exit();  // Should that be `continue;` instead?
 
 		if ( $left_revision->post_modified === $post->post_modified )
 			$revision_from_date_author = sprintf( $currentf, $revision_from_date_author );
@@ -2246,7 +2240,8 @@
 		elseif ( wp_is_post_autosave( $revision ) )
 			$revision_date_author = sprintf( $autosavef, $revision_date_author );
 
-		$date_short_format = __( 'j M @ G:i' );
+		/* translators: revision date short format, see http://php.net/date */
+		$date_short_format = _x( 'j M @ G:i', 'revision date short format');
 		$date_short = date_i18n( $date_short_format, strtotime( $revision->post_modified ) );
 
 		$revision_date_author_short = sprintf(
@@ -2256,7 +2251,7 @@
 			$date_short
 		);
 
-		$restoreaction = wp_nonce_url(
+		$restore_link = wp_nonce_url(
 			add_query_arg(
 				array( 'revision' => $revision->ID,
 					'action' => 'restore' ),
@@ -2264,20 +2259,22 @@
 			),
 			"restore-post_{$revision->ID}"
 		);
+
 		// if this is a left handled calculation swap data
 		if ( 0 != $right_handle_at ) {
 			$tmp = $revision_from_date_author;
 			$revision_from_date_author = $revision_date_author;
 			$revision_date_author = $tmp;
 		}
+
 		if ( ( $compare_two_mode || -1 !== $previous_revision_id ) ) {
 			$alltherevisions[] = array (
-				'ID' => $revision->ID,
-				'revision_date_author' => $revision_date_author,
-				'revision_from_date_author' => $revision_from_date_author,
-				'revision_date_author_short' => $revision_date_author_short,
-				'restoreaction' => urldecode( $restoreaction ),
-				'revision_toload' => true,
+				'ID'                   => $revision->ID,
+				'titleTo'              => $revision_date_author,
+				'titleFrom'            => $revision_from_date_author,
+				'titleTooltip'         => $revision_date_author_short,
+				'restoreLink'          => urldecode( $restore_link ),
+				'revision_toload'      => true,
 				'previous_revision_id' => $previous_revision_id
 			);
 		}
Index: wp-admin/js/revisions.js
===================================================================
--- wp-admin/js/revisions.js	(revision 23893)
+++ wp-admin/js/revisions.js	(working copy)
@@ -1,772 +1,779 @@
 window.wp = window.wp || {};
 
 (function($) {
-	wp.revisions = {
+	var Revision, Revisions, Diff, l10n, revisions;
 
-		views: {},
+	revisions = wp.revisions = function() {
+		Diff = revisions.Diff = new Diff();
+	};
 
-		Model: Backbone.Model.extend({
-			idAttribute: 'ID',
-			urlRoot: ajaxurl +	'?action=revisions-data' +
-				'&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
-			defaults: {
-				ID: 0,
-				revision_date_author: '',
-				revision_date_author_short: '',
-				revisiondiff: '<div class="diff-loading"><div class="spinner"></div></div>',
-				restoreaction: '',
-				revision_from_date_author: '',
-				revision_toload: false,
-				lines_added: 0,
-				lines_deleted: 0,
-				scope_of_changes: 'none',
-				previous_revision_id: 0
-			},
+	_.extend( revisions, { model: {}, view: {}, controller: {} } );
 
-			url: function() {
-				if ( 1 === REVAPP._compareOneOrTwo ) {
-					return this.urlRoot +
-						'&single_revision_id=' + this.id +
-						'&compare_to=' + this.get( 'previous_revision_id' ) +
-						'&post_id=' + wpRevisionsSettings.post_id;
-				} else {
-					return this.urlRoot +
-				'&single_revision_id=' + this.id;
-				}
+	// Link any localized strings.
+	l10n = revisions.model.l10n = typeof wpRevisionsL10n === 'undefined' ? {} : wpRevisionsL10n;
 
-			}
+	// Link any settings.
+	revisions.model.settings = l10n.settings || {};
+	delete l10n.settings;
 
-		}),
 
-		app: _.extend({}, Backbone.Events),
+	/**
+	 * ========================================================================
+	 * CONTROLLERS
+	 * ========================================================================
+	 */
 
-		App: Backbone.Router.extend({
-			_revisions: null,
-			_leftHandleRevisions: null,
-			_rightHandleRevisions: null,
-			_revisionsInteractions: null,
-			_revisionsOptions: null,
-			_leftDiff: 1,
-			_rightDiff: 1,
-			_autosaves: true,
-			_showSplitView: true,
-			_compareOneOrTwo: 1,
-			_leftModelLoading: false,	// keep track of model loads
-			_rightModelLoading: false,	// disallow slider interaction, also repeat loads, while loading
-			_tickmarkView: null, // the slider tickmarks
+	/**
+	 * wp.revisions.controller.Diff
+	 *
+	 * Controlls the diff
+	 */
+	Diff = revisions.controller.Diff = Backbone.Model.extend( {
+		rightDiff: 1,
+		leftDiff: 1,
+		revisions: null,
+		leftHandleRevisions: null,
+		rightHandleRevisions: null,
+		revisionsInteractions: null,
+		autosaves: true,
+		showSplitView: true,
+		singleRevision: true,
+		leftModelLoading: false,	// keep track of model loads
+		rightModelLoading: false,	// disallow slider interaction, also repeat loads, while loading
+		tickmarkView: null, // the slider tickmarks
+		slider: null, // the slider instance
 
-			routes: {
-			},
+		constructor: function() {
+			this.slider = new revisions.view.Slider();
+			if ( null === this.revisions ) {
+				this.revisions = new Revisions(); // set up collection
+				this.startRightModelLoading();
 
-			reloadToLoadRevisions: function( model_collection, reverse_direction ) {
-				var self = this,
-				    revisionsToLoad = model_collection.where( { revision_toload: true } ),
-				    delay = 0;
-				// match slider to passed revision_id
-				_.each( revisionsToLoad, function( theModel ) {
-					if ( theModel.get( 'ID' )  == wpRevisionsSettings.revision_id ) {
-						self._rightDiff = self._revisions.indexOf( theModel ) + 1;
+				var self = this;
+				this.revisions.fetch({ // load revision data
+					success: function() {
+						self.stopRightModelLoading();
+						self.completeApplicationSetup();
 					}
-
 				});
-				_.each( revisionsToLoad, function( theModel ) {
-						theModel.urlRoot = model_collection.url;
-						_.delay( function() {
-							theModel.fetch( {
-								update: true,
-								add: false,
-								remove: false,
-								success: function( model ) {
-									model.set( 'revision_toload', 'false' );
+			}
+		},
 
-									// stop spinner when all models are loaded
-									if ( 0 === model_collection.where( { revision_toload: true } ).length )
-										self.stopModelLoadingSpinner();
+		reloadToLoadRevisions: function( models, reverse_direction ) {
+			var self = this,
+				revisionsToLoad = models.where( { revision_toload: true } ),
+				delay = 0;
 
-									self._tickmarkView.render();
+			// 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;
+			});
 
-									var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'),
-									    scope_of_changes = 'vsmall';
+			_.each( revisionsToLoad, function( revision ) {
+					revision.urlRoot = models.url();
+					_.delay( function() {
+						revision.fetch( {
+							update: true,
+							add: false,
+							remove: false,
+							success: function( model ) {
+								model.set( 'revision_toload', 'false' );
 
-									// Note: hard coded scope of changes
-									// TODO change to dynamic based on range of values
-									if  ( total_changes > 1 && total_changes <= 3 ) {
-										scope_of_changes = 'small';
-									} else if(total_changes > 3 && total_changes <= 5 ) {
-										scope_of_changes = 'med';
-									} else if(total_changes > 5 && total_changes <= 10 ) {
-										scope_of_changes = 'large';
-									} else if(total_changes > 10 ) {
-										scope_of_changes = 'vlarge';
-									}
-									model.set( 'scope_of_changes', scope_of_changes );
-									if ( 0 !== self._rightDiff &&
-										model.get( 'ID' ) === self._revisions.at( self._rightDiff - 1 ).get( 'ID' ) ) {
-										// reload if current model refreshed
-										self._revisionView.render();
-									}
+								// stop spinner when all models are loaded
+								if ( 0 === models.where( { revision_toload: true } ).length )
+									self.stopModelLoadingSpinner();
 
-								}
-						} );
-						}, delay ) ;
-						delay = delay + 150; // stagger model loads to avoid hammering server with requests
-					}
-				);
-			},
+								self.tickmarkView.render();
 
-			startLeftModelLoading: function() {
-				this._leftModelLoading = true;
-				$('.revisiondiffcontainer').addClass('leftmodelloading');
-			},
+								var total_changes = model.get( 'lines_added' ) + model.get( 'lines_deleted'),
+									scope_of_changes = 'vsmall';
 
-			stopLeftModelLoading: function() {
-				this._leftModelLoading = false;
-			},
+								// Note: hard coded scope of changes
+								// TODO change to dynamic based on range of values
+								if  ( total_changes > 1 && total_changes <= 3 ) {
+									scope_of_changes = 'small';
+								} else if( total_changes > 3 && total_changes <= 5 ) {
+									scope_of_changes = 'med';
+								} else if( total_changes > 5 && total_changes <= 10 ) {
+									scope_of_changes = 'large';
+								} else if( total_changes > 10 ) {
+									scope_of_changes = 'vlarge';
+								}
+								model.set( 'scope_of_changes', scope_of_changes );
+								if ( 0 !== self.rightDiff &&
+									model.get( 'ID' ) === self.revisions.at( self.rightDiff - 1 ).get( 'ID' ) ) {
+									// reload if current model refreshed
+									self.revisionView.render();
+								}
 
-			startRightModelLoading: function() {
-				this._rightModelLoading = true;
-				$('.revisiondiffcontainer').addClass('rightmodelloading');
-			},
+							}
+					} );
+					}, delay ) ;
+					delay = delay + 150; // stagger model loads to avoid hammering server with requests
+				}
+			);
+		},
 
-			stopRightModelLoading: function() {
-				this._rightModelLoading = false;
-			},
+		startLeftModelLoading: function() {
+			this.leftModelLoading = true;
+			$('.revisiondiffcontainer').addClass('leftmodelloading');
+		},
 
-			stopModelLoadingSpinner: function() {
-				$('.revisiondiffcontainer').removeClass('rightmodelloading');
-				$('.revisiondiffcontainer').removeClass('leftmodelloading');
-			},
+		stopLeftModelLoading: function() {
+			this.leftModelLoading = false;
+		},
 
-			reloadModel: function() {
-				if ( 2 === this._compareOneOrTwo ) {
-					this.reloadLeftRight();
-				} else {
-					this.reloadModelSingle();
-				}
-			},
+		startRightModelLoading: function() {
+			this.rightModelLoading = true;
+			$('.revisiondiffcontainer').addClass('rightmodelloading');
+		},
 
-			// load the models for the single handle mode
-			reloadModelSingle: function() {
-				var self = this;
-				self._revisions.url = ajaxurl +	'?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
-											'&show_autosaves=' + self._autosaves +
-											'&show_split_view=' +  self._showSplitView +
-											'&nonce=' + wpRevisionsSettings.nonce;
-				self.startRightModelLoading();
-				self._revisions.fetch({ // reload revision data
-					success: function() {
-						console.log('loaded');
-						// self.stopRightModelLoading();
-						// REVAPP._rightDiff -= 1;
-						var revisionCount = self._revisions.length;
-						self._revisionView.model = self._revisions;
-						self._revisionView.render();
-						self.reloadToLoadRevisions( self._revisions );
-						self._tickmarkView.model = self._revisions;
-						self._tickmarkView.render();
-						$( '#slider' ).slider( 'option', 'max', revisionCount - 1 ); // TODO: test this, if autosave option changed
-						$( '#slider' ).slider( 'value', self._rightDiff - 1 ).trigger( 'slide' );
+		stopRightModelLoading: function() {
+			this.rightModelLoading = false;
+		},
 
-					},
+		stopModelLoadingSpinner: function() {
+			$('.revisiondiffcontainer').removeClass('rightmodelloading');
+			$('.revisiondiffcontainer').removeClass('leftmodelloading');
+		},
 
-					error: function() {
-						self.stopRightModelLoading();
-					}
+		reloadModel: function() {
+			if ( this.singleRevision ) {
+				this.reloadModelSingle();
+			} else {
+				this.reloadLeftRight();
+			}
+		},
 
-				});
-			},
+		// load the models for the single handle mode
+		reloadModelSingle: function() {
+			var self = this;
 
-			// load the models for the left handle
-			reloadLeft: function() {
-				var self = this;
-				self.startLeftModelLoading();
-				self._leftHandleRevisions = new wp.revisions.Collection();
+			// TODO: Only updates the query args yet
+			self.revisions.reload({
+				'showAutosaves': self.autosaves,
+				'showSplitView': self.showSplitView
+			});
 
-				self._leftHandleRevisions.url =
-					ajaxurl +
-					'?action=revisions-data&compare_to=' + self._revisions.at( self._rightDiff - 1 ).get( 'ID' ) +
-					'&post_id=' + wpRevisionsSettings.post_id +
-					'&show_autosaves=' + REVAPP._autosaves +
-					'&show_split_view=' +  REVAPP._showSplitView +
-					'&nonce=' + wpRevisionsSettings.nonce +
-					'&right_handle_at='  + ( self._rightDiff );
+			self.startRightModelLoading();
+			self.revisions.fetch({ // reload revision data
+				success: function() {
+					var revisionCount = self.revisions.length;
+					self.revisionView.model = self.revisions;
+					self.revisionView.render();
+					self.reloadToLoadRevisions( self.revisions );
+					self.tickmarkView.model = self.revisions;
+					self.tickmarkView.render();
+					self.slider.refresh({
+						'max': revisionCount - 1,
+						'value': self.rightDiff - 1
+					}, true);
+				},
 
-				self._leftHandleRevisions.fetch({
+				error: function() {
+					self.stopRightModelLoading();
+				}
 
-					success: function(){
-						self.stopLeftModelLoading();
-						self.reloadToLoadRevisions( self._leftHandleRevisions );
-						self._tickmarkView.model = self._leftHandleRevisions;
-						$( '#slider' ).slider( 'option', 'max', self._revisions.length );
-						// ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off
-						// the number of models in the collection might get shorter, this ensures right handle is not beyond last model
-						if ( self._rightDiff > self._revisions.length )
-							self._rightDiff = self._revisions.length;
-						},
+			});
+		},
 
-					error: function() {
-						self.stopLeftModelLoading();
-					}
-				});
-			},
+		// load the models for the left handle
+		reloadLeft: function() {
+			var self = this;
+			self.startLeftModelLoading();
+			self.leftHandleRevisions = new Revisions( {}, {
+				'compareTo': self.revisions.at( self.leftDiff ).get( 'ID' ),
+				'showAutosaves': self.autosaves,
+				'showSplitView': self.showSplitView,
+				'rightHandleAt': self.rightDiff
+			});
 
-			// load the models for the right handle
-			reloadRight: function() {
-				var self = this;
-				self.startRightModelLoading();
-				self._rightHandleRevisions = new wp.revisions.Collection();
+			self.leftHandleRevisions.fetch({
+				success: function(){
+					self.stopLeftModelLoading();
+					self.reloadToLoadRevisions( self.leftHandleRevisions );
+					self.tickmarkView.model = self.leftHandleRevisions;
+					self.slider.refresh({
+						'max': self.revisions.length
+					});
+					// ensure right handle not beyond length, in particular if viewing autosaves is switched from on to off
+					// the number of models in the collection might get shorter, this ensures right handle is not beyond last model
+					if ( self.rightDiff > self.revisions.length )
+						self.rightDiff = self.revisions.length;
+					},
 
-					self._rightHandleRevisions.url =
-						ajaxurl +
-						'?action=revisions-data&compare_to=' + ( self._revisions.at( self._leftDiff ).get( 'ID' ) - 1 )+
-						'&post_id=' + wpRevisionsSettings.post_id +
-						'&show_autosaves=' + REVAPP._autosaves +
-						'&show_split_view=' +  REVAPP._showSplitView +
-						'&nonce=' + wpRevisionsSettings.nonce;
+				error: function() {
+					self.stopLeftModelLoading();
+				}
+			});
+		},
 
-				self._rightHandleRevisions.fetch({
+		// load the models for the right handle
+		reloadRight: function() {
+			var self = this;
+			self.startRightModelLoading();
+			self.rightHandleRevisions = new Revisions( {}, {
+				'compareTo': self.revisions.at( self.leftDiff ).get( 'ID' ) - 1,
+				'showAutosaves': self.autosaves,
+				'showSplitView': self.showSplitView
+			});
 
-					success: function(){
-						self.stopRightModelLoading();
-						self.reloadToLoadRevisions( self._rightHandleRevisions );
-						self._tickmarkView.model = self._rightHandleRevisions;
-						$( '#slider' ).slider( 'option', 'max', self._revisions.length );
-						$( '#slider' ).slider( 'values', [ REVAPP._leftDiff, REVAPP._rightDiff] ).trigger( 'slide' );
+			self.rightHandleRevisions.fetch({
+				success: function(){
+					self.stopRightModelLoading();
+					self.reloadToLoadRevisions( self.rightHandleRevisions );
+					self.tickmarkView.model = self.rightHandleRevisions;
+					self.slider.refresh({
+						'max': self.revisions.length,
+						'values': [ self.leftDiff, self.rightDiff]
+					}, true);
+				},
 
-						// REVAPP._revisionView.render();
+				error: function( response ) {
+					self.stopRightModelLoading();
+				}
+			});
 
-					},
+		},
 
-					error: function( response ) {
-						self.stopRightModelLoading();
-					}
-				});
+		reloadLeftRight: function() {
+			this.startRightModelLoading();
+			this.startLeftModelLoading();
+			this.reloadLeft();
+			this.reloadRight();
+		},
 
-			},
+		completeApplicationSetup: function() {
+			this.revisionView = new revisions.view.Diff({
+				model: this.revisions
+			});
+			this.revisionView.render();
 
-			reloadLeftRight: function() {
-				this.startRightModelLoading();
-				this.startLeftModelLoading();
-				this.reloadLeft();
-				this.reloadRight();
-			},
+			this.reloadToLoadRevisions( this.revisions );
 
-			/*
-			 * initialize the revision application
-			 */
-			initialize: function( options ) {
-				var self = this; // store the application instance
-				if (this._revisions === null) {
-					self._revisions = new wp.revisions.Collection(); // set up collection
-					self.startRightModelLoading();
-					self._revisions.fetch({ // load revision data
+			this.revisionsInteractions = new revisions.view.Interact({
+				model: this.revisions
+			});
+			this.revisionsInteractions.render();
 
-						success: function() {
-							self.stopRightModelLoading();
-							// self._rightHandleRevisions = self._revisions;
-							self.completeApplicationSetup();
-						}
-					});
-				}
-				return this;
-			},
+			this.tickmarkView = new revisions.view.Tickmarks({
+				model: this.revisions
+			});
+			this.tickmarkView.render();
+			this.tickmarkView.resetTicks();
 
-			addTooltip: function( handle, message ) {
+		}
+	});
 
-				handle.attr( 'title', '' ).tooltip({
-					track: false,
 
-					position: {
-						my: "left-30 top-66",
-						at: "top left",
-						using: function( position, feedback ) {
-							$( this ).css( position );
-							$( "<div>" )
-							.addClass( "arrow" )
-							.addClass( feedback.vertical )
-							.addClass( feedback.horizontal )
-							.appendTo( $( this ) );
-						}
-					},
-					show: false,
-					hide: false,
-					content:  function() {
-						return message;
-					}
+	/**
+	 * ========================================================================
+	 * VIEWS
+	 * ========================================================================
+	 */
 
-				} );
-			},
-/**/
+	/**
+	 * wp.revisions.view.Slider
+	 *
+	 * The slider
+	 */
+	revisions.view.Slider = Backbone.View.extend({
+		el: $( '#slider' ),
+		singleRevision: true,
 
-			completeApplicationSetup: function() {
-				this._revisionView = new wp.revisions.views.View({
-					model: this._revisions
-				});
-				this._revisionView.render();
-				$( '#slider' ).slider( 'option', 'max', this._revisions.length - 1 );
+		initialize: function( options ) {
+			this.options = _.defaults( options || {}, {
+				value: 0,
+				min: 0,
+				max: 1,
+				step: 1
+			});
+		},
 
-				this.reloadToLoadRevisions( this._revisions );
+		slide: function( event, ui ) {
+			if ( this.singleRevision ) {
+				Diff.rightDiff = ( ui.value + 1 );
+				Diff.revisionView.render();
+			} else {
+				if ( ui.values[0] === ui.values[1] ) // prevent compare to self
+					return false;
 
-				this._revisionsInteractions = new wp.revisions.views.Interact({
-					model: this._revisions
-				});
-				this._revisionsInteractions.render();
+				var index = $( ui.handle ).index(); // 0 (left) or 2 (right)
+				switch ( index ) {
+					case 0: // left
+						if ( Diff.leftModelLoading ) // left model still loading, prevent sliding left handle
+							return false;
 
-				this._tickmarkView = new wp.revisions.views.Tickmarks({
-					model: this._revisions
-				});
-				this._tickmarkView.render();
-				this._tickmarkView.resetTicks();
+						Diff.leftDiff = ui.values[0];
+						break;
 
+					case 2: // right
+						if ( Diff.rightModelLoading ) // right model still loading, prevent sliding right handle
+							return false;
 
-				/*
-				.on( 'mouseup', function( event ) {
-					REVAPP._keep_tooltip_open = false;
-					$( this ).find('.ui-slider-tooltip').hide();
-				} ).on( 'mousedown', function( event ) {
-					REVAPP._keep_tooltip_open = true;
-				} ).on( 'mouseout', function( event ) {
-					if ( REVAPP._keep_tooltip_open)
-						event.stopImmediatePropagation();
-					});
-				*/
-				/*
-				// Options hidden for now, moving to screen options
-				this._revisionsOptions = new wp.revisions.views.Options({
-					model: this._revisions
-				});
-				this._revisionsOptions.render();
-				*/
+						Diff.rightDiff = ui.values[1];
+						break;
+				}
 
-			}
-		})
-	};
+				if ( 0 === Diff.leftDiff ) {
+					$( '.revisiondiffcontainer' ).addClass( 'currentversion' );
+				} else {
+					$( '.revisiondiffcontainer' ).removeClass( 'currentversion' );
+				}
 
-	wp.revisions.Collection = Backbone.Collection.extend({
-		model: wp.revisions.Model,
-		url: ajaxurl +	'?action=revisions-data&compare_to=' + wpRevisionsSettings.post_id +
-			'&show_autosaves=true&show_split_view=true&nonce=' + wpRevisionsSettings.nonce,
-
-		initialize: function() {
+				Diff.revisionView.render();
 			}
-	} );
+		},
 
-	_.extend(wp.revisions.views, {
+		start: function( event, ui ) {
+			// Not needed in one mode
+			if ( this.singleRevision )
+				return;
 
-		// Ticks inside slider view
-		Tickmarks: Backbone.View.extend({
-			el: $('#diff-slider-ticks')[0],
-			tagName: 'diff-slider-ticks-view',
-			className: 'diff-slider-ticks-container',
-			template: wp.template('revision-ticks'),
-			model: wp.revisions.Model,
+			var index = $( ui.handle ).index(); // 0 (left) or 2 (right)
+			switch ( index ) {
+				case 0: // left handle drag
+					if ( Diff.leftModelLoading ) // left model still loading, prevent sliding left handle
+						return false;
 
-			resetTicks: function() {
-				var sliderMax = $( '#slider' ).slider( 'option', 'max');
-				var sliderWidth = $( '#slider' ).width();
-				var adjustMax = ( 2 === REVAPP._compareOneOrTwo ) ? 1 : 0;
-				var tickWidth = Math.floor( sliderWidth / ( sliderMax - adjustMax ) );
+					Diff.revisionView.draggingLeft = true;
 
-				// TODO: adjust right margins for wider ticks so they stay centered on handle stop point
+					if ( Diff.revisionView.model !== Diff.leftHandleRevisions &&
+							null !== Diff.leftHandleRevisions ) {
+						Diff.revisionView.model = Diff.leftHandleRevisions;
+						Diff.tickmarkView.model = Diff.leftHandleRevisions;
+						Diff.tickmarkView.render();
+					}
 
-				// set minimum and maximum widths for tick marks
-				tickWidth = (tickWidth > 50 ) ? 50 : tickWidth;
-				tickWidth = (tickWidth < 10 ) ? 10 : tickWidth;
+					Diff.leftDiffStart = ui.values[ 0 ];
+					break;
 
-				sliderWidth = tickWidth * (sliderMax - adjustMax ) + 1;
+				case 2: // right
+					if ( Diff.rightModelLoading || 0 === Diff.rightHandleRevisions.length) // right model still loading, prevent sliding right handle
+						return false;
 
-				$( '#slider' ).width( sliderWidth );
-				$( '.diff-slider-ticks-wrapper' ).width( sliderWidth );
-				$( '#diffslider' ).width( sliderWidth );
-				$( '#diff-slider-ticks' ).width( sliderWidth );
+					if ( Diff.revisionView.model !== Diff.rightHandleRevisions &&
+							null !== Diff.rightHandleRevisions ) {
+						Diff.revisionView.model = Diff.rightHandleRevisions;
+						Diff.tickmarkView.model = Diff.rightHandleRevisions;
+						Diff.tickmarkView.render();
+					}
 
-				var aTickWidth = $( '.revision-tick' ).width();
+					Diff.revisionView.draggingLeft = false;
+					Diff.rightDiffStart = ui.values[1];
+					break;
+			}
+		},
 
-				if ( tickWidth !==  aTickWidth ) { // is the width already set correctly?
-					$( '.revision-tick' ).each( function( ) {
-						$(this).css( 'margin-right', tickWidth - 1 + 'px'); // space the ticks out using right margin
-					});
+		stop: function( event, ui ) {
+			// Not needed in one mode
+			if ( this.singleRevision )
+				return;
 
-					if( 2 === REVAPP._compareOneOrTwo ) {
-						$( '.revision-tick' ).first().remove(); // TODO - remove the check
-					}
-					$( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin
-				}
+			// calculate and generate a diff for comparing to the left handle
+			// and the right handle, swap out when dragging
+			var index = $( ui.handle ).index(); // 0 (left) or 1 (right)
 
-			},
+			switch ( index ) {
+				case 1: // left
+					// left handle dragged & changed, reload right handle model
+					if ( Diff.leftDiffStart !== ui.values[0] )
+						Diff.reloadRight();
 
-			// render the tickmark view
-			render: function() {
-				var self = this;
+					break;
 
-				if ( null !== self.model ) {
-					var addHtml = "";
-					_.each ( self.model.models, function( theModel ) {
-						addHtml = addHtml + self.template ( theModel.toJSON() );
-					});
-					self.$el.html( addHtml );
+				case 2: // right
+					// right handle dragged & changed, reload left handle model if changed
+					if ( Diff.rightDiffStart !== ui.values[1] )
+						Diff.reloadLeft();
 
-				}
-				self.resetTicks();
-				return self;
+					break;
 			}
-		}),
+		},
 
-		// primary revision diff view
-		View: Backbone.View.extend({
-			el: $('#backbonerevisionsdiff')[0],
-			tagName: 'revisionvview',
-			className: 'revisionview-container',
-			template: wp.template('revision'),
-			comparetwochecked: '',
-			draggingLeft: false,
+		addTooltip: function( handle, message ) {
 
-			// render the revisions
-			render: function() {
-				var addHtml = '';
-				var thediff;
-				// compare two revisions mode?
+			handle.attr( 'title', '' ).tooltip({
+				track: false,
 
-				if ( 2 === REVAPP._compareOneOrTwo ) {
-
-					this.comparetwochecked = 'checked';
-					if ( this.draggingLeft ) {
-						thediff = REVAPP._leftDiff -1;
-						if ( this.model.at( thediff ) ) {
-							addHtml = this.template( _.extend(
-								this.model.at( thediff ).toJSON(),
-								{ comparetwochecked: this.comparetwochecked } // keep the checkmark checked
-							) );
-						}
-					} else { // dragging right handle
-						thediff = REVAPP._rightDiff -1;
-						if ( this.model.at( thediff ) ) {
-							addHtml = this.template( _.extend(
-								this.model.at( thediff ).toJSON(),
-								{ comparetwochecked: this.comparetwochecked } // keep the checkmark checked
-							) );
-						}
+				position: {
+					my: "left-30 top-66",
+					at: "top left",
+					using: function( position, feedback ) {
+						$( this ).css( position );
+						$( "<div>" )
+						.addClass( "arrow" )
+						.addClass( feedback.vertical )
+						.addClass( feedback.horizontal )
+						.appendTo( $( this ) );
 					}
-				} else { // end compare two revisions mode, eg only one slider handle
-					this.comparetwochecked = '';
-					if ( this.model.at( REVAPP._rightDiff - 1 ) ) {
-						addHtml = this.template( _.extend(
-							this.model.at( REVAPP._rightDiff - 1 ).toJSON(),
-							{ comparetwochecked: this.comparetwochecked } // keep the checkmark unchecked
-						) );
-					}
+				},
+				show: false,
+				hide: false,
+				content:  function() {
+					return message;
 				}
-				this.$el.html( addHtml );
-				if ( this.model.length < 3 ) {
-					$( 'div#comparetworevisions' ).hide(); // don't allow compare two if fewer than three revisions
-				}
-				if ( this.model.length < 2 ) {
-					$( 'div#diffslider' ).hide(); // don't allow compare two if fewer than three revisions
-					$( 'div.diff-slider-ticks-wrapper' ).hide();
-				}
 
-				// add tooltips to the handles
-				if ( 2 === REVAPP._compareOneOrTwo ) {
-					REVAPP.addTooltip ( $( 'a.ui-slider-handle.left-handle' ),
-						( REVAPP._leftDiff < 0 ) ? '' : REVAPP._revisions.at( REVAPP._leftDiff - 1 ).get( 'revision_date_author_short' ) );
-					REVAPP.addTooltip ( $( 'a.ui-slider-handle.right-handle' ),
-						( REVAPP._rightDiff > REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._rightDiff - 1 ).get( 'revision_date_author_short' ) );
-				} else {
-					REVAPP.addTooltip ( $( 'a.ui-slider-handle' ),
-						( REVAPP._rightDiff > REVAPP._revisions.length ) ? '' : REVAPP._revisions.at( REVAPP._rightDiff - 1 ).get( 'revision_date_author_short' ) );
-				}
+			} );
+		},
 
-				// hide the restore button when on the last sport/current post data
-				if (  REVAPP._rightDiff === REVAPP._revisions.length ){
-					$( '.restore-button' ).hide();
-				} else {
-					$( '.restore-button' ).show();
-				}
+		width: function() {
+			return $( '#slider' ).width();
+		},
 
-				return this;
-			},
+		setWidth: function( width ) {
+			return $( '#slider' ).width( width );
+		},
 
-			// the compare two button is in this view, add the interaction here
-			events: {
-				'click #comparetwo': 'clickcomparetwo'
-			},
+		refresh: function( options, slide ) {
+			$( '#slider' ).slider( 'option', options );
 
-			// turn on/off the compare two mmode
-			clickcomparetwo: function(){
-				self = this;
+			// Triggers the slide event
+			if ( slide )
+				$( '#slider' ).trigger( 'slide' );
+		},
 
-				if ( $( 'input#comparetwo' ).is( ':checked' ) ) { // compare 2 mode
-					REVAPP._compareOneOrTwo = 2 ;
+		option: function( key ) {
+			return $( '#slider' ).slider( 'option', key );
+		},
 
-					if ( 1 === REVAPP._rightDiff )
-						REVAPP._rightDiff = 2;
-						REVAPP._revisionView.draggingLeft = false;
+		render: function() {
+			var self = this;
+			// this.$el doesn't work, why?
+			$( '#slider' ).slider( {
+				slide: $.proxy( self.slide, self ),
+				start: $.proxy( self.start, self ),
+				stop: $.proxy( self.stop, self )
+			} );
 
-						wpRevisionsSettings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision
-						REVAPP.reloadLeftRight();
-						REVAPP._revisionView.model = REVAPP._rightHandleRevisions;
+			// Set options
+			this.refresh( this.options );
+		}
+	});
 
-					} else { // compare one mode
-						REVAPP._compareOneOrTwo = 1 ;
-						REVAPP._revisionView.draggingLeft = false;
-						// REVAPP._leftDiff = 0;
-						// REVAPP._rightDiff = (REVAPP._revisions.length <= REVAPP._rightDiff ) ? REVAPP._rightDiff + 1 : REVAPP._rightDiff + 1;
-						REVAPP.reloadModelSingle();
-					}
-					// REVAPP._revisionView.render();
-					REVAPP._revisionsInteractions.render();
-					REVAPP._tickmarkView.render();
+	/**
+	 * wp.revisions.view.Tickmarks
+	 *
+	 * The slider tickmarks.
+	 */
+	revisions.view.Tickmarks = Backbone.View.extend({
+		el: $('#diff-slider-ticks'),
+		template: wp.template('revision-ticks'),
+		model: Revision,
 
-			}
-		}),
+		resetTicks: function() {
+			var sliderMax = Diff.slider.option( 'max' );
+			var sliderWidth = Diff.slider.width();
+			var adjustMax = Diff.singleRevision ? 0 : 1;
+			var tickWidth = Math.floor( sliderWidth / ( sliderMax - adjustMax ) );
 
-		// options view for show autosaves and show split view options
-		/* DISABLED for now
-		Options: Backbone.View.extend({
-			el: $('#backbonerevisionsoptions')[0],
-			tagName: 'revisionoptionsview',
-			className: 'revisionoptions-container',
-			template: wp.template('revisionoptions'),
+			// TODO: adjust right margins for wider ticks so they stay centered on handle stop point
 
-			// render the options view
-			render: function() {
-				var addHtml = this.template;
-				this.$el.html( addHtml );
-				return this;
-			},
+			// set minimum and maximum widths for tick marks
+			tickWidth = (tickWidth > 50 ) ? 50 : tickWidth;
+			tickWidth = (tickWidth < 10 ) ? 10 : tickWidth;
 
-			// add options interactions
-			events: {
-				'click #toggleshowautosaves': 'toggleshowautosaves',
-				'click #showsplitview': 'showsplitview'
-			},
+			sliderWidth = tickWidth * (sliderMax - adjustMax ) + 1;
 
-			// toggle include autosaves
-			toggleshowautosaves: function() {
-				var self = this;
-				if ( $( '#toggleshowautosaves' ).is( ':checked' ) ) {
-					REVAPP._autosaves = true ;
-				} else {
-					REVAPP._autosaves = false ;
-				}
+			Diff.slider.setWidth( sliderWidth );
+			$( '.diff-slider-ticks-wrapper' ).width( sliderWidth );
+			$( '#diffslider' ).width( sliderWidth );
+			$( '#diff-slider-ticks' ).width( sliderWidth );
 
-				// refresh the model data
-				REVAPP.reloadModel();
-			},
+			var aTickWidth = $( '.revision-tick' ).width();
 
-			// toggle showing the split diff view
-			showsplitview:  function() {
-				var self = this;
+			if ( tickWidth !== aTickWidth ) { // is the width already set correctly?
+				$( '.revision-tick' ).each( function( ) {
+					$(this).css( 'margin-right', tickWidth - 1 + 'px'); // space the ticks out using right margin
+				});
 
-				if ( $( 'input#showsplitview' ).is( ':checked' ) ) {
-					REVAPP._showSplitView = 'true';
-					$('.revisiondiffcontainer').addClass('diffsplit');
-				} else {
-					REVAPP._showSplitView = '';
-					$('.revisiondiffcontainer').removeClass('diffsplit');
+				if( ! Diff.singleRevision ) {
+					$( '.revision-tick' ).first().remove(); // TODO - remove the check
 				}
-
-				REVAPP.reloadModel();
+				$( '.revision-tick' ).last().css( 'margin-right', '0' ); // last tick gets no right margin
 			}
-		}),
-		*/
-		// main interactions view
-		Interact: Backbone.View.extend({
-			el: $('#backbonerevisionsinteract')[0],
-			tagName: 'revisionvinteract',
-			className: 'revisionvinteract-container',
-			template: wp.template('revisionvinteract'),
 
-			initialize: function() {
-			},
+		},
 
-			render: function() {
-				var self = this;
+		// render the tickmark view
+		render: function() {
+			var self = this;
 
-				var addHtml = this.template;
-				this.$el.html( addHtml );
+			if ( null !== self.model ) {
+				var addHtml = "";
+				_.each ( self.model.models, function( theModel ) {
+					addHtml = addHtml + self.template ( theModel.toJSON() );
+				});
+				self.$el.html( addHtml );
 
-				var modelcount = REVAPP._revisions.length;
+			}
+			self.resetTicks();
+			return self;
+		}
+	});
 
-				slider = $( "#slider" );
-				if ( 1 === REVAPP._compareOneOrTwo ) {
-					// set up the slider with a single handle
-					slider.slider({
-						value: REVAPP._rightDiff - 1,
-						min: 0,
-						max: modelcount - 1,
-						step: 1,
+	/**
+	 * wp.revisions.view.Interact
+	 *
+	 * Next/Prev buttons and the slider
+	 */
+	// TODO: Change Interact to something else.
+	revisions.view.Interact = Backbone.View.extend({
+		el: $('#backbonerevisionsinteract'),
+		template: wp.template('revision-interact'),
 
+		// next and previous buttons, only available in compare one mode
+		events: {
+			'click #next':     'nextRevision',
+			'click #previous': 'previousRevision'
+		},
 
-						// slide interactions for one handles slider
-						slide: function( event, ui ) {
+		render: function() {
+			var self = this;
 
-							REVAPP._rightDiff = ( ui.value + 1 );
-							REVAPP._revisionView.render();
-							/*
-							$( 'a.ui-slider-handle' ).tooltip( {
-								content: REVAPP._revisions.at( ui.value ).get( 'revision_date_author_short' ),
-								position: {
-								my: "top-65",
-								using: function( position, feedback ) {
-									$( this ).css( position );
-									$( "<div>" )
-									.addClass( "arrow" )
-									.addClass( feedback.vertical )
-									.addClass( feedback.horizontal )
-									.appendTo( this );
-									}
-								}
-							});// .trigger( 'close' ).trigger( 'open' );
-*/
-							}
-					});
-					$( '.revisiondiffcontainer' ).removeClass( 'comparetwo' );
+			var addHtml = this.template;
+			this.$el.html( addHtml );
 
-				} else { // comparing more than one, eg 2
-					// set up the slider with two handles
-					slider.slider({
-						values: [ REVAPP._leftDiff, REVAPP._rightDiff + 1 ],
-						min: 1,
-						max: modelcount + 1,
-						step: 1,
-						range: true,
+			var modelcount = Diff.revisions.length;
 
-						// in two handled mode when user starts dragging, swap in precalculated diff for handle
-						start: function(event, ui ) {
-							var index = $( ui.handle ).index(); // 0 (left) or 1 (right)
-							switch ( index ) {
-								case 1: // left handle drag
-									if ( REVAPP._leftModelLoading ) // left model still loading, prevent sliding left handle
-										return false;
+			Diff.slider.singleRevision = Diff.singleRevision;
+			Diff.slider.render();
 
-									REVAPP._revisionView.draggingLeft = true;
+			if ( Diff.singleRevision ) {
+				Diff.slider.refresh({
+					value: Diff.rightDiff - 1,
+					min: 0,
+					max: modelcount - 1
+				});
 
-									if ( REVAPP._revisionView.model !== REVAPP._leftHandleRevisions &&
-											null !== REVAPP._leftHandleRevisions ) {
-										REVAPP._revisionView.model = REVAPP._leftHandleRevisions;
-										REVAPP._tickmarkView.model = REVAPP._leftHandleRevisions;
-										REVAPP._tickmarkView.render();
-									}
+				$( '.revisiondiffcontainer' ).removeClass( 'comparetwo' );
 
-									REVAPP._leftDiffStart = ui.values[ 0 ];
-									break;
+			} else {
+				Diff.slider.refresh({
+					values: [ Diff.leftDiff, Diff.rightDiff + 1 ],
+					min: 1,
+					max: modelcount + 1,
+					range: true
+				});
 
-								case 2: // right
-									if ( REVAPP._rightModelLoading || 0 === REVAPP._rightHandleRevisions.length) // right model still loading, prevent sliding right handle
-										return false;
+				$( '.revisiondiffcontainer' ).addClass( 'comparetwo' );
+				$( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' );
 
-									if ( REVAPP._revisionView.model !== REVAPP._rightHandleRevisions &&
-											null !== REVAPP._rightHandleRevisions ) {
-										REVAPP._revisionView.model = REVAPP._rightHandleRevisions;
-										REVAPP._tickmarkView.model = REVAPP._rightHandleRevisions;
-										REVAPP._tickmarkView.render();
-									}
+			}
 
-									REVAPP._revisionView.draggingLeft = false;
-									REVAPP._rightDiffStart = ui.values[1];
-									break;
-							}
-						},
+			return this;
+		},
 
-						// when sliding in two handled mode change appropriate value
-						slide: function( event, ui ) {
-							if ( ui.values[0] === ui.values[1] ) // prevent compare to self
-								return false;
+		// go to the next revision
+		nextRevision: function() {
+			if ( Diff.rightDiff < this.model.length ) // unless at right boundry
+				Diff.rightDiff = Diff.rightDiff + 1 ;
 
-							var index = $( ui.handle ).index(); // 0 (left) or 1 (right)
+			Diff.revisionView.render();
 
-							switch ( index ) {
-								case 1: // left
-									if ( REVAPP._leftModelLoading ) // left model still loading, prevent sliding left handle
-										return false;
+			Diff.slider.refresh({
+				value: Diff.rightDiff - 1
+			}, true );
+		},
 
-									REVAPP._leftDiff = ui.values[0];
-									break;
+		// go the the previous revision
+		previousRevision: function() {
+			if ( Diff.rightDiff > 1 ) // unless at left boundry
+				Diff.rightDiff = Diff.rightDiff - 1 ;
 
-								case 2: // right
-									if ( REVAPP._rightModelLoading ) // right model still loading, prevent sliding right handle
-										return false;
+			Diff.revisionView.render();
 
-									REVAPP._rightDiff = ui.values[1];
-									break;
-							}
+			Diff.slider.refresh({
+				value: Diff.rightDiff - 1
+			}, true );
+		}
+	});
 
-							if ( 0 === REVAPP._leftDiff ) {
-								$( '.revisiondiffcontainer' ).addClass( 'currentversion' );
+	/**
+	 * wp.revisions.view.Diff
+	 *
+	 * Next/Prev buttons and the slider
+	 */
+	revisions.view.Diff = Backbone.View.extend({
+		el: $('#backbonerevisionsdiff'),
+		template: wp.template('revision'),
+		draggingLeft: false,
 
-							} else {
-								$( '.revisiondiffcontainer' ).removeClass( 'currentversion' );
-							}
+		// the compare two button is in this view, add the interaction here
+		events: {
+			'click #comparetwo': 'compareTwo',
+			'click #restore':    'restore'
+		},
 
-							REVAPP._revisionView.render();
+		// render the revisions
+		render: function() {
+			var addHtml = '';
+			var thediff;
 
-						},
+			// compare two revisions mode?
+			if ( ! Diff.singleRevision ) {
+				if ( this.draggingLeft ) {
+					thediff = Diff.leftDiff - 1;
+					if ( this.model.at( thediff ) ) {
+						addHtml = this.template( this.model.at( thediff ).toJSON() );
+					}
+				} else { // dragging right handle
+					thediff = Diff.rightDiff -1;
+					if ( this.model.at( thediff ) ) {
+						addHtml = this.template( this.model.at( thediff ).toJSON() );
+					}
+				}
+			} else { // end compare two revisions mode, eg only one slider handle
+				this.comparetwochecked = '';
+				if ( this.model.at( Diff.rightDiff - 1 ) ) {
+					addHtml = this.template( this.model.at( Diff.rightDiff - 1 ).toJSON() );
+				}
+			}
+			this.$el.html( addHtml );
 
-						// when the user stops sliding  in 2 handle mode, recalculate diffs
-						stop: function( event, ui ) {
-							if ( 2 === REVAPP._compareOneOrTwo ) {
-								// calculate and generate a diff for comparing to the left handle
-								// and the right handle, swap out when dragging
+			if ( this.model.length < 2 ) {
+				$( '#diffslider' ).hide(); // don't allow compare two if fewer than three revisions
+				$( '.diff-slider-ticks-wrapper' ).hide();
+			}
 
-								var index = $( ui.handle ).index(); // 0 (left) or 1 (right)
+			// add tooltips to the handles
+			if ( ! Diff.singleRevision ) {
+				Diff.slider.addTooltip ( $( 'a.ui-slider-handle.left-handle' ),
+					( Diff.leftDiff < 0 ) ? '' : Diff.revisions.at( Diff.leftDiff - 1 ).get( 'titleTooltip' ) );
+				Diff.slider.addTooltip ( $( 'a.ui-slider-handle.right-handle' ),
+					( Diff.rightDiff > Diff.revisions.length ) ? '' : Diff.revisions.at( Diff.rightDiff - 1 ).get( 'titleTooltip' ) );
+			} else {
+				Diff.slider.addTooltip ( $( 'a.ui-slider-handle' ),
+					( Diff.rightDiff > Diff.revisions.length ) ? '' : Diff.revisions.at( Diff.rightDiff - 1 ).get( 'titleTooltip' ) );
+			}
 
-								switch ( index ) {
-									case 1: // left
+			this.toogleCompareTwoCheckbox();
 
-										// left handle dragged & changed, reload right handle model
-										if ( REVAPP._leftDiffStart !== ui.values[0] )
-											REVAPP.reloadRight();
+			// hide the restore button when on the last sport/current post data
+			if ( Diff.rightDiff === Diff.revisions.length ){
+				$( '#restore' ).hide();
+			} else {
+				$( '#restore' ).show();
+			}
 
-										break;
+			return this;
+		},
 
-									case 2: // right
-										// REVAPP._rightDiff =  ( 1 >= REVAPP._rightDiff ) ? 1 : REVAPP._rightDiff - 1;
-										// right handle dragged & changed, reload left handle model if changed
-										if ( REVAPP._rightDiffStart !== ui.values[1] )
-											REVAPP.reloadLeft();
+		toogleCompareTwoCheckbox: function() {
+			// don't allow compare two if fewer than three revisions
+			if ( this.model.length < 3 )
+				$( '#comparetworevisions' ).hide();
 
-										break;
-								}
-							}
-						}
-					});
-					$( '.revisiondiffcontainer' ).addClass( 'comparetwo' );
-					$( '#diffslider a.ui-slider-handle' ).first().addClass( 'left-handle' ).next().addClass( 'right-handle' );
-				}
+			$( '#comparetwo' ).prop( 'checked', ! Diff.singleRevision );
+		},
 
-				return this;
-			},
+		// turn on/off the compare two mode
+		compareTwo: function() {
+			if ( $( 'input#comparetwo' ).is( ':checked' ) ) { // compare 2 mode
+				Diff.singleRevision = false ;
 
-			// next and previous buttons, only available in compare one mode
-			events: {
-				'click #next': 'nextRevision',
-				'click #previous': 'previousRevision'
-			},
+				if ( 1 === Diff.rightDiff )
+					Diff.rightDiff = 2;
 
-			// go to the next revision
-			nextRevision: function() {
-				if ( REVAPP._rightDiff < this.model.length ) // unless at right boundry
-					REVAPP._rightDiff = REVAPP._rightDiff + 1 ;
+				Diff.revisionView.draggingLeft = false;
 
-				REVAPP._revisionView.render();
+				revisions.model.settings.revision_id = ''; // reset passed revision id so switching back to one handle mode doesn't re-select revision
+				Diff.reloadLeftRight();
+				Diff.revisionView.model = Diff.rightHandleRevisions;
 
-				$( '#slider' ).slider( 'value', REVAPP._rightDiff - 1 ).trigger( 'slide' );
-			},
+			} else { // compare one mode
+				Diff.singleRevision = true;
+				Diff.revisionView.draggingLeft = false;
+				Diff.reloadModelSingle();
+			}
+			Diff.revisionsInteractions.render();
+			Diff.tickmarkView.render();
+		},
 
-			// go the the previous revision
-			previousRevision: function() {
-				if ( REVAPP._rightDiff > 1 ) // unless at left boundry
-					REVAPP._rightDiff = REVAPP._rightDiff - 1 ;
+		restore: function() {
+			document.location = $( '#restore' ).data( 'restoreLink' );
+		}
+	});
 
-				REVAPP._revisionView.render();
 
-				$( '#slider' ).slider( 'value', REVAPP._rightDiff - 1 ).trigger( 'slide' );
+	/**
+	 * ========================================================================
+	 * MODELS
+	 * ========================================================================
+	 */
+
+	/**
+	 * wp.revisions.Revision
+	 */
+	Revision = revisions.model.Revision = Backbone.Model.extend({
+		idAttribute: 'ID',
+		urlRoot: ajaxurl +	'?action=revisions-data' +
+			'&show_autosaves=true&show_split_view=true&nonce=' + revisions.model.settings.nonce,
+		defaults: {
+			ID: 0,
+			titleTo: '',
+			titleTooltip: '',
+			titleFrom: '',
+			diff: '<div class="diff-loading"><div class="spinner"></div></div>',
+			restoreLink: '',
+			revision_toload: false,
+			lines_added: 0,
+			lines_deleted: 0,
+			scope_of_changes: 'none',
+			previous_revision_id: 0
+		},
+
+		url: function() {
+			if ( Diff.singleRevision ) {
+				return this.urlRoot +
+					'&single_revision_id=' + this.id +
+					'&compare_to=' + this.get( 'previous_revision_id' ) +
+					'&post_id=' + revisions.model.settings.post_id;
+			} else {
+				return this.urlRoot + '&single_revision_id=' + this.id;
 			}
-		})
+
+		}
 	});
 
-	// instantiate Revision Application
-	REVAPP = new wp.revisions.App();
+	/**
+	 * wp.revisions.Revisions
+	 */
+	Revisions = revisions.Revisions = Backbone.Collection.extend({
+		model: Revision,
+		urlRoot: ajaxurl + '?action=revisions-data',
 
+		initialize: function( models, options ) {
+			this.options = _.defaults( options || {}, {
+				'compareTo': revisions.model.settings.post_id,
+				'post_id': revisions.model.settings.post_id,
+				'showAutosaves': true,
+				'showSplitView': true,
+				'rightHandleAt': 0,
+				'nonce': revisions.model.settings.nonce
+			});
+		},
+
+		url: function() {
+			return this.urlRoot +
+				'&compare_to=' + this.options.compareTo +
+				'&post_id=' + this.options.post_id +
+				'&show_autosaves=' + this.options.showAutosaves +
+				'&show_split_view=' + this.options.showSplitView +
+				'&right_handle_at=' + this.options.rightHandleAt +
+				'&nonce=' + this.options.nonce;
+		},
+
+		reload: function( options ) {
+			this.options = _.defaults( options || {}, this.options );
+
+			// TODO
+			//this.fetch();
+		}
+
+	} );
+
+	$( wp.revisions );
+
 }(jQuery));
Index: wp-admin/revision.php
===================================================================
--- wp-admin/revision.php	(revision 23893)
+++ wp-admin/revision.php	(working copy)
@@ -79,13 +79,21 @@
 
 require_once( './admin-header.php' );
 
-//TODO - Some of the translations below split things into multiple strings that are contextually related and this makes it pretty impossible for RTL translation.
-//TODO can we pass the context in a better way
-$wpRevisionsSettings = array( 'post_id' => $post->ID,
-						'nonce' => wp_create_nonce( 'revisions-ajax-nonce' ),
-						'revision_id' => $revision_id );
-wp_localize_script( 'revisions', 'wpRevisionsSettings', $wpRevisionsSettings );
+$strings = array(
+	'diffFromTitle' => _x( 'From: %s', 'revision from title'  ),
+	'diffToTitle'   => _x( 'To: %s', 'revision to title' )
+);
 
+$settings = array(
+	'post_id'     => $post->ID,
+	'nonce'       => wp_create_nonce( 'revisions-ajax-nonce' ),
+	'revision_id' => $revision_id
+);
+
+$strings['settings'] = $settings;
+
+wp_localize_script( 'revisions', 'wpRevisionsL10n', $strings );
+
 $comparetworevisionslink = get_edit_post_link( $revision->ID );
 ?>
 
@@ -112,36 +120,39 @@
 </div>
 
 <script id="tmpl-revision" type="text/html">
+	<div id="comparetworevisions">
+		<label>
+			<input type="checkbox" id="comparetwo" />
+			<?php esc_attr_e( 'Compare two revisions' ); ?>
+		</label>
+	</div>
+
 	<div id="diffsubheader" class="diff-left-hand-meta-row">
 		<div id="diff_from_current_revision">
 			<?php printf( '<b>%1$s</b> %2$s.' , __( 'From:' ), __( 'the current version' ) ); ?>
 		</div>
 		<div id="difftitlefrom">
-			<div class="diff-from-title"><?php _e( 'From:' ); ?></div>{{{ data.revision_from_date_author }}}
+			<div class="diff-from-title"><?php _e( 'From:' ); ?></div>{{{ data.titleFrom }}}
 		</div>
 	</div>
 
 	<div id="diffsubheader">
 		<div id="difftitle">
-			<div class="diff-to-title"><?php _e( 'To:' ); ?></div>{{{ data.revision_date_author }}}
+			<div class="diff-to-title"><?php _e( 'To:' ); ?></div>{{{ data.titleTo }}}
 		</div>
 		<div id="diffrestore">
-			<input class="button button-primary restore-button" onClick="document.location='{{{ data.restoreaction }}}'" type="submit" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" />
+			<input class="button button-primary" data-restore-link="{{{ data.restoreLink }}}" type="button" id="restore" value="<?php esc_attr_e( 'Restore This Revision' )?>" />
 		</div>
-		<div id="comparetworevisions">
-			<input type="checkbox" id="comparetwo" value="comparetwo" {{{ data.comparetwochecked }}} name="comparetwo"/>
-				<label for="comparetwo"><?php esc_attr_e( 'Compare two revisions' ); ?></a></label>
-		</div>
 	</div>
 
 	<div id="removedandadded">
 		<div id="removed"><?php _e( 'Removed -' ); ?></div>
 		<div id="added"><?php _e( 'Added +' ); ?></div>
 	</div
-	<div>{{{ data.revisiondiff }}}</div>
+	<div>{{{ data.diff }}}</div>
 </script>
 
-<script id="tmpl-revisionvinteract" type="text/html">
+<script id="tmpl-revision-interact" type="text/html">
 	<div id="diffheader">
 		<div id="diffprevious"><input class="button" type="submit" id="previous" value="<?php esc_attr_e( 'Previous' ); ?>" />
 		</div>
@@ -153,22 +164,10 @@
 		</div>
 	</div>
 </script>
+
 <script id="tmpl-revision-ticks" type="text/html">
 	<div class="revision-tick revision-toload{{{ data.revision_toload }}} revision-scopeofchanges-{{{ data.scope_of_changes }}}">
 	</div>
 </script>
 <?php
-/*
-TODO Convert these into screen options
-<script id="tmpl-revisionoptions" type="text/html">
-	<div id="revisionoptions">
-		<div id="showsplitviewoption">
-			<input type='checkbox' id="show_split_view" checked="checked" value="1" /> <?php _e( 'Show split diff view' ); ?>
-		</div>
-		<div id="toggleshowautosavesoption">
-			<input type='checkbox' id="toggleshowautosaves" value="1" /> <?php _e( 'Show autosaves' ); ?>
-		</div>
-	</div>
-</script>
-*/
-require_once( './admin-footer.php' );
\ No newline at end of file
+require_once( './admin-footer.php' );
