Index: wp-includes/wp-diff.php
===================================================================
--- wp-includes/wp-diff.php	(revision 23482)
+++ wp-includes/wp-diff.php	(working copy)
@@ -59,6 +59,8 @@
 	 */
 	var $inline_diff_renderer = 'WP_Text_Diff_Renderer_inline';
 
+	var $_showsplitview = null;
+
 	/**
 	 * Constructor - Call parent constructor with params array.
 	 *
@@ -70,6 +72,8 @@
 	 */
 	function __construct( $params = array() ) {
 		parent::__construct( $params );
+		if ( isset( $params[ 'showsplitview' ] ) )
+			$this -> _showsplitview = $params[ 'showsplitview' ];
 	}
 
 	/**
@@ -98,7 +102,8 @@
 	 * @return string
 	 */
 	function addedLine( $line ) {
-		return "<td>+</td><td class='diff-addedline'>{$line}</td>";
+		return "<td class='diff-addedline'>{$line}</td>";
+
 	}
 
 	/**
@@ -108,7 +113,7 @@
 	 * @return string
 	 */
 	function deletedLine( $line ) {
-		return "<td>-</td><td class='diff-deletedline'>{$line}</td>";
+		return "<td class='diff-deletedline'>{$line}</td>";
 	}
 
 	/**
@@ -118,7 +123,7 @@
 	 * @return string
 	 */
 	function contextLine( $line ) {
-		return "<td> </td><td class='diff-context'>{$line}</td>";
+		return "<td class='diff-context'>{$line}</td>";
 	}
 
 	/**
@@ -127,7 +132,7 @@
 	 * @return string
 	 */
 	function emptyLine() {
-		return '<td colspan="2">&nbsp;</td>';
+		return '<td>&nbsp;</td>';
 	}
 
 	/**
@@ -142,8 +147,12 @@
 		$r = '';
 		foreach ($lines as $line) {
 			if ( $encode )
-				$line = htmlspecialchars( $line );
-			$r .= '<tr>' . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n";
+				$line = wp_kses_post( $line );
+			if ( ! $this->_showsplitview ) {
+				$r .= '<tr>' . $this->addedLine( $line ) . "</tr>\n";
+			} else {
+				$r .= '<tr>' . $this->emptyLine() . $this->emptyLine() . $this->addedLine( $line ) . "</tr>\n";
+			}
 		}
 		return $r;
 	}
@@ -160,8 +169,13 @@
 		$r = '';
 		foreach ($lines as $line) {
 			if ( $encode )
-				$line = htmlspecialchars( $line );
-			$r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . "</tr>\n";
+				$line = wp_kses_post( $line );
+			if ( ! $this->_showsplitview ) {
+				$r .= '<tr>' . $this->deletedLine( $line ) . "</tr>\n";
+			} else {
+				$r .= '<tr>' . $this->deletedLine( $line ) . $this->emptyLine() . $this->emptyLine() . "</tr>\n";
+			}
+
 		}
 		return $r;
 	}
@@ -178,9 +192,12 @@
 		$r = '';
 		foreach ($lines as $line) {
 			if ( $encode )
-				$line = htmlspecialchars( $line );
-			$r .= '<tr>' .
-				$this->contextLine( $line ) . $this->contextLine( $line ) . "</tr>\n";
+				$line = wp_kses_post( $line );
+			if (  ! $this->_showsplitview ) {
+				$r .= '<tr>' . $this->contextLine( $line ) . "</tr>\n";
+			} else {
+				$r .= '<tr>' . $this->contextLine( $line ) . $this->emptyLine() . $this->contextLine( $line )  . "</tr>\n";
+			}
 		}
 		return $r;
 	}
@@ -264,7 +281,11 @@
 			} elseif ( $final_rows[$row] < 0 ) { // Final is blank. This is really a deleted row.
 				$r .= $this->_deleted( array($orig_line), false );
 			} else { // A true changed row.
-				$r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->addedLine( $final_line ) . "</tr>\n";
+				if ( ! $this->_showsplitview ) {
+					$r .= '<tr>' . $this->deletedLine( $orig_line ) . "</tr><tr>" . $this->addedLine( $final_line ) . "</tr>\n";
+				} else {
+					$r .= '<tr>' . $this->deletedLine( $orig_line ) . $this->emptyLine() . $this->addedLine( $final_line ) . "</tr>\n";
+				}
 			}
 		}
 
Index: wp-includes/pluggable.php
===================================================================
--- wp-includes/pluggable.php	(revision 23482)
+++ wp-includes/pluggable.php	(working copy)
@@ -1713,17 +1713,21 @@
 
 	$left_lines  = explode("\n", $left_string);
 	$right_lines = explode("\n", $right_string);
-
 	$text_diff = new Text_Diff($left_lines, $right_lines);
-	$renderer  = new WP_Text_Diff_Renderer_Table();
+	$renderer  = new WP_Text_Diff_Renderer_Table( $args );
 	$diff = $renderer->render($text_diff);
 
 	if ( !$diff )
 		return '';
 
 	$r  = "<table class='diff'>\n";
-	$r .= "<col class='ltype' /><col class='content' /><col class='ltype' /><col class='content' />";
 
+	if ( isset( $args[ 'showsplitview' ] ) && 'true' == $args[ 'showsplitview' ] ) {
+		$r .= "<col class='content diffsplit left' /><col class='content diffsplit middle' /><col class='content diffsplit right' />";
+	} else {
+		$r .= "<col class='content' />";
+	}
+
 	if ( $args['title'] || $args['title_left'] || $args['title_right'] )
 		$r .= "<thead>";
 	if ( $args['title'] )
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 23482)
+++ wp-includes/script-loader.php	(working copy)
@@ -270,8 +270,11 @@
 	$scripts->add( 'json2', "/wp-includes/js/json2$suffix.js", array(), '2011-02-23');
 
 	$scripts->add( 'underscore', '/wp-includes/js/underscore.min.js', array(), '1.4.4', 1 );
-	$scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery'), '0.9.2', 1 );
+	$scripts->add( 'template', "/wp-includes/js/template$suffix.js", array('underscore'), '1.4.4', 1 );
+	$scripts->add( 'backbone', '/wp-includes/js/backbone.min.js', array('underscore','jquery', 'template'), '0.9.2', 1 );
 
+	$scripts->add( 'revisions', "/wp-includes/js/revisions$suffix.js", array('backbone'), '', 1 );
+
 	$scripts->add( 'imgareaselect', "/wp-includes/js/imgareaselect/jquery.imgareaselect$suffix.js", array('jquery'), '0.9.8', 1 );
 
 	$scripts->add( 'password-strength-meter', "/wp-admin/js/password-strength-meter$suffix.js", array('jquery'), false, 1 );
@@ -537,6 +540,8 @@
 	$styles->add( 'customize-controls', "/wp-admin/css/customize-controls$suffix.css", array( 'wp-admin', 'colors', 'ie' ) );
 	$styles->add( 'media-views', "/wp-includes/css/media-views$suffix.css", array( 'buttons' ) );
 	$styles->add( 'buttons', "/wp-includes/css/buttons$suffix.css" );
+	$styles->add( 'revisions', "/wp-admin/css/revisions$suffix.css" );
+	$styles->add( 'wp-jquery-ui-slider', "/wp-includes/css/jquery-ui-slider$suffix.css" );
 
 	foreach ( $rtl_styles as $rtl_style ) {
 		$styles->add_data( $rtl_style, 'rtl', true );
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 23482)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -42,7 +42,7 @@
 
 $core_actions_get = array(
 	'fetch-list', 'ajax-tag-search', 'wp-compression-test', 'imgedit-preview', 'oembed-cache',
-	'autocomplete-user', 'dashboard-widgets', 'logged-in',
+	'autocomplete-user', 'dashboard-widgets', 'logged-in', 'revisions-data'
 );
 
 $core_actions_post = array(
@@ -56,7 +56,7 @@
 	'save-widget', 'set-post-thumbnail', 'date_format', 'time_format', 'wp-fullscreen-save-post',
 	'wp-remove-post-lock', 'dismiss-wp-pointer', 'upload-attachment', 'get-attachment',
 	'query-attachments', 'save-attachment', 'save-attachment-compat', 'send-link-to-editor',
-	'send-attachment-to-editor', 'save-attachment-order', 'heartbeat',
+	'send-attachment-to-editor', 'save-attachment-order', 'heartbeat'
 );
 
 // Register core Ajax calls.
Index: wp-admin/includes/ajax-actions.php
===================================================================
--- wp-admin/includes/ajax-actions.php	(revision 23482)
+++ wp-admin/includes/ajax-actions.php	(working copy)
@@ -1379,7 +1379,7 @@
 	global $wp_list_table;
 
 	check_ajax_referer( 'taxinlineeditnonce', '_inline_edit' );
-	
+
 	$post_data = wp_unslash( $_POST );
 
 	$taxonomy = sanitize_key( $post_data['taxonomy'] );
@@ -2134,3 +2134,139 @@
 	wp_send_json($response);
 }
 
+function wp_ajax_revisions_data() {
+
+	$compareto = isset( $_GET['compareto'] ) ? $_GET['compareto'] : 0;
+	$showautosaves = isset( $_GET['showautosaves'] ) ? $_GET['showautosaves'] : '';
+	$showsplitview = isset( $_GET['showsplitview'] ) ? $_GET['showsplitview'] : '';
+	$postid = isset( $_GET['postid'] ) ? $_GET['postid'] : '';
+
+	$comparetwomode = ( '' == $postid ) ? false : true;
+	//
+	//TODO: currently code returns all possible comparisons for the indicated 'compareto' 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 ( '' == $postid )
+		$postid = $compareto;
+
+	if ( ! $revisions = wp_get_post_revisions( $postid ) )
+		return;
+
+	//if we are comparing two revisions, the first 'revision' represented by the leftmost
+	//slider position is the current revision, prepend a comparison to this revision
+	if ( $comparetwomode )
+		array_unshift( $revisions, get_post( $postid ) );
+
+	$count = 1;
+	foreach ( $revisions as $revision ) :
+	if ( 'true' != $showautosaves && wp_is_post_autosave( $revision ) )
+			continue;
+
+	$revision_from_date_author = '';
+
+
+	//if ( current_user_can( 'read_post', $revision->ID ) )
+	//		continue;
+	$left_revision = get_post( $compareto );
+	$right_revision = get_post( $revision );
+
+	$author = get_the_author_meta( 'display_name', $revision->post_author );
+	$compareto_author = get_the_author_meta( 'display_name', $left_revision->post_author );
+	/* translators: revision date format, see http://php.net/date */
+	$datef = _x( 'j F, Y @ G:i:s', 'revision date format');
+
+	$gravatar = get_avatar( $revision->post_author, 18 );
+	$compareto_gravatar = get_avatar( $left_revision->post_author, 18 );
+
+	$date = date_i18n( $datef, strtotime( $revision->post_modified ) );
+	$compareto_date = date_i18n( $datef, strtotime( $left_revision->post_modified ) );
+	$revision_date_author = sprintf(
+		'%s %s, %s %s (%s)',
+		$gravatar,
+		$author,
+		human_time_diff( strtotime( $revision->post_modified ), current_time( 'timestamp' ) ),
+		__( ' ago ' ),
+		$date
+	);
+
+	if ( $comparetwomode ) {
+
+		$revision_from_date_author = sprintf(
+			'%s %s, %s %s (%s)',
+			$compareto_gravatar,
+			$compareto_author,
+			human_time_diff( strtotime( $left_revision->post_modified ), current_time( 'timestamp' ) ),
+			__( ' ago ' ),
+			$compareto_date
+		);
+	}
+
+	$restoreaction = wp_nonce_url(
+		add_query_arg(
+			array( 'revision' => $revision->ID, 'action' => 'restore' ),
+			'/wp-admin/revision.php'
+		),
+		"restore-post_$compareto|$revision->ID"
+	);
+
+	//
+	//make sure the left revision is the most recent
+	//
+	if ( strtotime( $right_revision->post_modified_gmt ) < strtotime( $left_revision->post_modified_gmt ) ) {
+		$temp = $left_revision;
+		$left_revision = $right_revision;
+		$right_revision = $temp;
+	}
+
+	//
+	//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' );
+
+		add_filter( "_wp_post_revision_field_$field", 'wp_kses_post' );
+
+		$args = array();
+
+		if ( 'true' == $showsplitview )
+			 $args = array( 'showsplitview' => 'true' );
+
+		$content .= wp_text_diff( $left_content, $right_content, $args );
+	}
+
+	//if we are comparing two revisions
+	//and we are on the matching revision
+	//add an error revision indicating unable to compare to self
+	if ( $comparetwomode && $compareto == $revision->ID )
+		$alltherevisions[] = array (
+			'ID' => $revision->ID,
+			'revision_date_author' => $revision_date_author,
+			'revisiondiff' => sprintf('<div id="selfcomparisonerror">%s</div>', __( 'Cannot compare revision to itself' ) ),
+			'restoreaction' => urldecode( $restoreaction ),
+			'revision_from_date_author' => ''
+		);
+
+	//add to the return data only if there is a difference
+	if ( '' != $content )
+		$alltherevisions[] = array (
+			'ID' => $revision->ID,
+			'revision_date_author' => $revision_date_author,
+			'revisiondiff' => $content,
+			'restoreaction' => urldecode( $restoreaction ),
+			'revision_from_date_author' => $revision_from_date_author
+		);
+
+	endforeach;
+
+	//remove initial revision that only contains
+	//post title
+	//TODO remove if this is fixed and initial revision not created
+	array_pop( $alltherevisions );
+	echo json_encode( $alltherevisions );
+	exit();
+}
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 23482)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -178,6 +178,18 @@
 	<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js"><?php _e('Edit') ?></a>
 	<div id="timestampdiv" class="hide-if-js"><?php touch_time(($action == 'edit'), 1); ?></div>
 </div><?php // /misc-pub-section ?>
+<?php endif;
+
+	$the_revisions = wp_get_post_revisions( $post->ID );
+
+	if ( post_type_supports( $post_type, 'revisions' ) && count( $the_revisions ) ) :
+?>
+<div id="post-revisions-link" class="misc-pub-section" >
+	<span id="revisions-link"><?php _e( 'Revisions:' ) ?></span>
+	<a href="<?php printf( 'revisions.php?revision=%s&postid=%s&action=edit', key( $the_revisions ), $post->ID )?>" class="edit-revisions hide-if-no-js">
+		<?php _e( 'View' ); ?>
+	</a>
+</div>
 <?php endif; ?>
 
 <?php do_action('post_submitbox_misc_actions'); ?>
@@ -979,4 +991,4 @@
 function post_thumbnail_meta_box( $post ) {
 	$thumbnail_id = get_post_meta( $post->ID, '_thumbnail_id', true );
 	echo _wp_post_thumbnail_html( $thumbnail_id, $post->ID );
-}
\ No newline at end of file
+}
Index: wp-admin/css/colors-fresh.css
===================================================================
--- wp-admin/css/colors-fresh.css	(revision 23482)
+++ wp-admin/css/colors-fresh.css	(working copy)
@@ -1299,17 +1299,28 @@
 
 /* Diff */
 table.diff .diff-deletedline {
-	background-color: #fdd;
+	background-color: #ffe5e6;
+	color: #f2001f;
+	text-decoration: line-through;
 }
 
 table.diff .diff-deletedline del {
 	background-color: #f99;
 }
 
+table.diff .diff-deletedline-symbol {
+	color: #f2001f;
+}
+
 table.diff .diff-addedline {
-	background-color: #dfd;
+	background-color: #e9f6ea;
+	color: #00a500;
 }
 
+table.diff .diff-addedline-symbol {
+	color: #00a500;
+}
+
 table.diff .diff-addedline ins {
 	background-color: #9f9;
 }
Index: wp-admin/css/wp-admin.css
===================================================================
--- wp-admin/css/wp-admin.css	(revision 23482)
+++ wp-admin/css/wp-admin.css	(working copy)
@@ -3495,9 +3495,21 @@
 }
 
 table.diff col.content {
-	width: 50%;
+	width: auto;
 }
 
+table.diff col.content.diffsplit {
+	width: 48%;
+}
+
+table.diff col.diffsplit.middle {
+	width: 4%;
+}
+
+table.diff col.ltype {
+	width: 30px;
+}
+
 table.diff tr {
 	background-color: transparent;
 }
