Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 12748)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -135,7 +135,7 @@
 if ( $authors && count( $authors ) > 1 )
 	add_meta_box('authordiv', __('Author'), 'post_author_meta_box', $post_type, 'normal', 'core');
 
-if ( 0 < $post_ID && wp_get_post_revisions( $post_ID ) )
+if ( post_type_supports($post_type, 'revisions') && 0 < $post_ID && wp_get_post_revisions( $post_ID ) )
 	add_meta_box('revisionsdiv', __('Revisions'), 'post_revisions_meta_box', $post_type, 'normal', 'core');
 
 do_action('do_meta_boxes', $post_type, 'normal', $post);
Index: wp-admin/revision.php
===================================================================
--- wp-admin/revision.php	(revision 12748)
+++ wp-admin/revision.php	(working copy)
@@ -11,14 +11,21 @@
 
 wp_enqueue_script('list-revisions');
 
-wp_reset_vars(array('revision', 'left', 'right', 'diff', 'action'));
+wp_reset_vars(array('revision', 'left', 'right', 'diff', 'action', 'post_type'));
+
+if ( empty($post_type) )
+	$post_type = 'post';
+
+if ( 'post' != $post_type )
+	$parent_file = $submenu_file = $redirect = "edit.php?post_type=$post_type";
+else
+	$parent_file = $submenu_file = $redirect = 'edit.php';
+
 $revision_id = absint($revision);
 $diff        = absint($diff);
 $left        = absint($left);
 $right       = absint($right);
 
-$parent_file = $redirect = 'edit.php';
-
 switch ( $action ) :
 case 'delete' : // stubs
 case 'edit' :
@@ -115,9 +122,12 @@
 	if ( !constant('WP_POST_REVISIONS') && !wp_is_post_autosave( $revision ) ) // Revisions disabled and we're not looking at an autosave
 		break;
 
+	$post_type_object = get_post_type_object($post->post_type);
+
 	$post_title = '<a href="' . get_edit_post_link() . '">' . get_the_title() . '</a>';
 	$revision_title = wp_post_revision_title( $revision, false );
-	$h2 = sprintf( __( 'Post Revision for &#8220;%1$s&#8221; created on %2$s' ), $post_title, $revision_title );
+	$h2 = sprintf( __( '%s Revision for &#8220;%1$s&#8221; created on %2$s' ), $post_type_object->label, $post_title, $revision_title ); // @TODO singular? for post_type
+	$title = sprintf(__( '%s Revisions' ), $post_type_object->label );  // @TODO singular? for post_type
 
 	// Sets up the diff radio buttons
 	$left  = $revision->ID;
@@ -127,22 +137,14 @@
 	break;
 endswitch;
 
-if ( !$redirect && !in_array( $post->post_type, array( 'post', 'page' ) ) )
-	$redirect = 'edit.php';
+if ( !$redirect && !post_type_supports($post_type, 'revisions') )
+	$redirect = "edit.php?post_type=$post_type";
 
 if ( $redirect ) {
 	wp_redirect( $redirect );
 	exit;
 }
 
-if ( 'page' == $post->post_type ) {
-	$submenu_file = 'edit-pages.php';
-	$title = __( 'Page Revisions' );
-} else {
-	$submenu_file = 'edit.php';
-	$title = __( 'Post Revisions' );
-}
-
 require_once( 'admin-header.php' );
 
 ?>
Index: wp-includes/link-template.php
===================================================================
--- wp-includes/link-template.php	(revision 12748)
+++ wp-includes/link-template.php	(working copy)
@@ -689,7 +689,13 @@
 	if ( !current_user_can( $post_type_object->edit_cap, $post->ID ) )
 		return;
 
-	return apply_filters( 'get_edit_post_link', admin_url( sprintf($post_type_object->_edit_link . $action, $post->ID) ), $post->ID, $context );
+	if ( 'revision' == $post->post_type && $revision_parent = get_post($post->post_parent) ) {
+		$url = admin_url( sprintf($post_type_object->_edit_link . $action, $revision_parent->post_type, $post->ID) );
+	} else {
+		$url = admin_url( sprintf($post_type_object->_edit_link . $action, $post->ID) );
+	}
+
+	return apply_filters( 'get_edit_post_link', $url, $post->ID, $context );
 }
 
 /**
Index: wp-includes/post-template.php
===================================================================
--- wp-includes/post-template.php	(revision 12748)
+++ wp-includes/post-template.php	(working copy)
@@ -1260,17 +1260,17 @@
 	extract( wp_parse_args( $args, $defaults ), EXTR_SKIP );
 
 	switch ( $type ) {
-	case 'autosave' :
-		if ( !$autosave = wp_get_post_autosave( $post->ID ) )
-			return;
-		$revisions = array( $autosave );
-		break;
-	case 'revision' : // just revisions - remove autosave later
-	case 'all' :
-	default :
-		if ( !$revisions = wp_get_post_revisions( $post->ID ) )
-			return;
-		break;
+		case 'autosave' :
+			if ( !$autosave = wp_get_post_autosave( $post->ID ) )
+				return;
+			$revisions = array( $autosave );
+			break;
+		case 'revision' : // just revisions - remove autosave later
+		case 'all' :
+		default :
+			if ( !$revisions = wp_get_post_revisions( $post->ID ) )
+				return;
+			break;
 	}
 
 	/* translators: post revision: 1: when, 2: author name */
@@ -1326,6 +1326,7 @@
 	<div class="alignleft">
 		<input type="submit" class="button-secondary" value="<?php esc_attr_e( 'Compare Revisions' ); ?>" />
 		<input type="hidden" name="action" value="diff" />
+		<input type="hidden" name="post_type" value="<?php echo esc_attr($GLOBALS['post_type']); ?>" />
 	</div>
 </div>
 
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 12748)
+++ wp-includes/post.php	(working copy)
@@ -15,12 +15,10 @@
  * Creates the initial post types when 'init' action is fired.
  */
 function create_initial_post_types() {
-	register_post_type( 'post', array('label' => __('Posts'), 'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false) );
-	register_post_type( 'page', array('label' => __('Pages'),'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'page', 'hierarchical' => true) );
-	register_post_type( 'attachment', array('label' => __('Media'), 'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'media.php?attachment_id=%d', 'capability_type' => 'post', 'hierarchical' => false) );
-	register_post_type( 'revision', array('label' => __('Revisions'),'exclude_from_search' => true, '_builtin' => true, '_edit_link' => 'revision.php?revision=%d', 'capability_type' => 'post', 'hierarchical' => false) );
-	add_post_type_support('post', array('post-thumbnails', 'excerpts', 'trackbacks', 'custom-fields', 'comments') );
-	add_post_type_support('page', array('post-thumbnails', 'page-attributes', 'custom-fields', 'comments') );
+	register_post_type( 'post', array('label' => __('Posts'), 'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'supports' => array('post-thumbnails', 'excerpts', 'trackbacks', 'custom-fields', 'comments', 'revisions') ) );
+	register_post_type( 'page', array('label' => __('Pages'), 'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'page', 'hierarchical' => true, 'supports' => array('post-thumbnails', 'page-attributes', 'custom-fields', 'comments', 'revisions')) );
+	register_post_type( 'attachment', array('label' => __('Media'), 'exclude_from_search' => false, '_builtin' => true, '_edit_link' => 'media.php?attachment_id=%d', 'capability_type' => 'post', 'hierarchical' => false ) );
+	register_post_type( 'revision', array('label' => __('Revisions'),'exclude_from_search' => true, '_builtin' => true, '_edit_link' => 'revision.php?post_type=%s&revision=%d', 'capability_type' => 'post', 'hierarchical' => false) );
 
 	register_post_status( 'publish', array('label' => _x('Published', 'post'), 'exclude_from_search' => false, '_builtin' => true, 'label_count' => _n_noop('Published <span class="count">(%s)</span>', 'Published <span class="count">(%s)</span>')) );
 	register_post_status( 'future', array('label' => _x('Scheduled', 'post'), 'exclude_from_search' => false, '_builtin' => true, 'label_count' => _n_noop('Scheduled <span class="count">(%s)</span>', 'Scheduled <span class="count">(%s)</span>')) );
@@ -655,7 +653,7 @@
 		$wp_post_types = array();
 
 	// Args prefixed with an underscore are reserved for internal use.
-	$defaults = array('label' => false, 'exclude_from_search' => true, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => false, '_show' => false);
+	$defaults = array('label' => false, 'exclude_from_search' => true, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => false, '_show' => false, 'support' => array());
 	$args = wp_parse_args($args, $defaults);
 	$args = (object) $args;
 
@@ -676,6 +674,11 @@
 	if ( !$args->_builtin && $args->public )
 		$args->_show = true;
 
+	if ( ! empty($args->supports) ) {
+		add_post_type_support($post_type, $args->supports);
+		unset($args->supports);
+	}
+
 	$wp_post_types[$post_type] = $args;
 
 	return $args;
@@ -3940,7 +3943,7 @@
 	if ( !$post = get_post( $post_id, ARRAY_A ) )
 		return;
 
-	if ( !in_array( $post['post_type'], array( 'post', 'page' ) ) )
+	if ( !post_type_supports($post['post_type'], 'revisions') )
 		return;
 
 	$return = _wp_put_post_revision( $post );
