Index: wp-includes/default-filters.php
===================================================================
--- wp-includes/default-filters.php	(revision 23340)
+++ wp-includes/default-filters.php	(working copy)
@@ -123,6 +123,9 @@
 	add_filter( $filter, 'convert_chars' );
 }
 
+// Pre save Revision Version
+add_filter( 'wp_insert_post_data', '_wp_insert_post_data_revision_version', 10, 2 );
+
 // Pre save hierarchy
 add_filter( 'wp_insert_post_parent', 'wp_check_post_hierarchy_for_loops', 10, 2 );
 add_filter( 'wp_update_term_parent', 'wp_check_term_hierarchy_for_loops', 10, 3 );
@@ -249,7 +252,7 @@
 add_action( 'plugins_loaded',             'wp_maybe_load_widgets',                    0    );
 add_action( 'plugins_loaded',             'wp_maybe_load_embeds',                     0    );
 add_action( 'shutdown',                   'wp_ob_end_flush_all',                      1    );
-add_action( 'pre_post_update',            'wp_save_post_revision'                          );
+add_action( 'pre_post_update',            'wp_save_post_revision',                   10, 2 );
 add_action( 'publish_post',               '_publish_post_hook',                       5, 1 );
 add_action( 'transition_post_status',     '_transition_post_status',                  5, 3 );
 add_action( 'transition_post_status',     '_update_term_count_on_transition_post_status', 10, 3 );
Index: wp-includes/post-template.php
===================================================================
--- wp-includes/post-template.php	(revision 23340)
+++ wp-includes/post-template.php	(working copy)
@@ -1375,18 +1375,28 @@
 
 	if ( $parent )
 		array_unshift( $revisions, $post );
+ 	
+ 	if ( ! array_pop( $revisions ) )
+ 		return;
 
 	$rows = $right_checked = '';
 	$class = false;
 	$can_edit_post = current_user_can( 'edit_post', $post->ID );
+
 	foreach ( $revisions as $revision ) {
+
 		if ( !current_user_can( 'read_post', $revision->ID ) )
 			continue;
 		if ( 'revision' === $type && wp_is_post_autosave( $revision ) )
 			continue;
 
 		$date = wp_post_revision_title( $revision );
-		$name = get_the_author_meta( 'display_name', $revision->post_author );
+		if ( wp_is_post_revision( $revision ) ) {
+			$revision_author_id = $revision->post_author;
+		} elseif ( !$revision_author_id = get_post_meta( $revision->ID, '_edit_last', true ) ) {
+			$revision_author_id = $revision->post_author;
+		}
+		$name = get_the_author_meta( 'display_name', $revision_author_id );
 
 		if ( 'form-table' == $format ) {
 			if ( $left )
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 23340)
+++ wp-includes/post.php	(working copy)
@@ -2866,7 +2866,7 @@
 	$where = array( 'ID' => $post_ID );
 
 	if ( $update ) {
-		do_action( 'pre_post_update', $post_ID );
+		do_action( 'pre_post_update', $post_ID, $data );
 		if ( false === $wpdb->update( $wpdb->posts, $data, $where ) ) {
 			if ( $wp_error )
 				return new WP_Error('db_update_error', __('Could not update post in the database'), $wpdb->last_error);
@@ -2900,6 +2900,8 @@
 		$wpdb->update( $wpdb->posts, array( 'post_name' => $data['post_name'] ), $where );
 	}
 
+	update_post_meta( $post_ID, '_edit_last', $user_ID );
+
 	if ( is_object_in_taxonomy($post_type, 'category') )
 		wp_set_post_categories( $post_ID, $post_category );
 
@@ -4920,9 +4922,24 @@
 	$return['post_date']     = isset($post['post_modified']) ? $post['post_modified'] : '';
 	$return['post_date_gmt'] = isset($post['post_modified_gmt']) ? $post['post_modified_gmt'] : '';
 
+	$return['post_author']   = get_post_meta( $post['ID'], '_edit_last', true );
+	$return['comment_count'] = 1; // The comment_count field stores the revisioning system version
+
 	return $return;
 }
 
+function _wp_insert_post_data_revision_version( $data, $post_array ) {
+	if ( 'revision' != $data['post_type'] ) {
+		return $data;
+	}
+
+	if ( isset( $post_array['comment_count'] ) ) {
+		$data['comment_count'] = (int) $post_array['comment_count'];
+	}
+
+	return $data;
+}
+
 /**
  * Saves an already existing post as a post revision.
  *
@@ -4937,7 +4954,7 @@
  * @param int $post_id The ID of the post to save as a revision.
  * @return mixed Null or 0 if error, new revision ID, if success.
  */
-function wp_save_post_revision( $post_id ) {
+function wp_save_post_revision( $post_id, $new_data = null ) {
 	// We do autosaves manually with wp_create_post_autosave()
 	if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
 		return;
@@ -4955,6 +4972,21 @@
 	if ( !post_type_supports($post['post_type'], 'revisions') )
 		return;
 
+	// if new data is supplied, check that it is different from last saved revision
+	if( is_array( $new_data ) ) {
+		$post_has_changed = false;
+		foreach( array_keys( _wp_post_revision_fields() ) as $field ) {
+			if( normalize_whitespace( $new_data[ $field ] ) != normalize_whitespace( $post[$field] ) ) {
+				error_log( 'post changed' );
+				$post_has_changed = true;
+				break;
+			}
+		}
+		//don't save revision if post unchanged
+		if( ! $post_has_changed )
+			return;
+	}
+
 	$return = _wp_put_post_revision( $post );
 
 	// WP_POST_REVISIONS = true (default), -1
@@ -5235,9 +5267,60 @@
 
 	if ( !$revisions = get_children( $args ) )
 		return array();
+
+	$revisions = wp_fix_post_revision_authors( $revisions, $args );
 	return $revisions;
 }
 
+function wp_fix_post_revision_authors( $revisions, $args ) {
+	$keys = array_keys( $revisions );
+	if ( 'DESC' == strtoupper( $args['order'] ) ) {
+		$keys = array_reverse( $keys );
+	}
+
+	$previous_author = false;
+	foreach ( $keys as $key ) {
+		if ( is_array( $revisions[$key] ) && isset( $revisions[$key]['comment_count'] ) ) {
+			$revision_version = $revisions[$key]['comment_count'];
+			$is_array = true;
+		} elseif ( is_object( $revisions[$key] ) && isset( $revisions[$key]->comment_count ) ) {
+			$revision_version = $revisions[$key]->comment_count;
+			$is_array = false;
+		} else {
+			continue;
+		}
+
+		if ( 1 == $revision_version ) {
+			$post_author_name = get_the_author_meta( 'display_name', $revisions[$key]->post_author );
+			continue;
+		}
+
+		if ( $is_array ) {
+			// swap
+			list(
+				$previous_author,
+				$revisions[$key]['post_author']
+			) = array(
+				$revisions[$key]['post_author'],
+				false === $previous_author ? $revisions[$key]['post_author'] : $previous_author
+			);
+			$revisions[$key]['comment_count'] = 1; // in case this data gets cached somewhere, flag it as having the fixed post_author
+		} else {
+			// swap
+			list(
+				$previous_author,
+				$revisions[$key]->post_author
+			) = array(
+				$revisions[$key]->post_author,
+				false === $previous_author ? $revisions[$key]->post_author : $previous_author
+			);
+			$revisions[$key]->comment_count = 1; // in case this data gets cached somewhere, flag it as having the fixed post_author
+		}
+	}
+
+	return $revisions;
+}
+
 function _set_preview($post) {
 
 	if ( ! is_object($post) )
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 23340)
+++ wp-includes/comment.php	(working copy)
@@ -1615,6 +1615,8 @@
 		return false;
 	if ( !$post = get_post($post_id) )
 		return false;
+	if ( 'revision' == $post->post_type )
+		return false;
 
 	$old = (int) $post->comment_count;
 	$new = (int) $wpdb->get_var( $wpdb->prepare("SELECT COUNT(*) FROM $wpdb->comments WHERE comment_post_ID = %d AND comment_approved = '1'", $post_id) );
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 23340)
+++ wp-admin/includes/post.php	(working copy)
@@ -241,8 +241,6 @@
 
 	add_meta( $post_ID );
 
-	update_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );
-
 	wp_update_post( $post_data );
 
 	// Now that we have an ID we can fix any attachment anchor hrefs
@@ -568,8 +566,6 @@
 
 	add_meta( $post_ID );
 
-	add_post_meta( $post_ID, '_edit_last', $GLOBALS['current_user']->ID );
-
 	// Now that we have an ID we can fix any attachment anchor hrefs
 	_fix_attachment_links( $post_ID );
 
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 23340)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -603,7 +603,8 @@
  * @param object $post
  */
 function post_revisions_meta_box($post) {
-	wp_list_post_revisions();
+	$args = array( 'parent' => true );
+	wp_list_post_revisions( $post, $args );
 }
 
 // -- Page related Meta Boxes
