Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 21626)
+++ wp-includes/post.php	(working copy)
@@ -53,12 +53,23 @@
 	register_post_type( 'attachment', array(
 		'labels' => array(
 			'name' => __( 'Media' ),
+			'name' => _x('Media', 'post type general name'),
+ 			'singular_name' => _x( 'Media Item', 'post type singular name' ),
+ 			'add_new' => _x( 'Add New', 'media item'),
+ 			'add_new_item' => __( 'Add New Media' ),
 			'edit_item' => __( 'Edit Media' ),
+			'new_item' => __( 'New Media Item' ),
+ 			'view_item' => __( 'View Attachment Page' ),
+ 			'search_items' => __( 'Search Media' ),
+ 			'not_found' => __( 'No media found.' ),
+ 			'not_found_in_trash' => __('No media found in Trash.'),
+ 			'parent_item_colon' => __('Parent:'),
+ 			'all_items' => __( 'All Media' ),
 		),
 		'public' => true,
-		'show_ui' => false,
+		'show_ui' => true,
 		'_builtin' => true, /* internal use only. don't use this when registering your own post type. */
-		'_edit_link' => 'media.php?attachment_id=%d', /* internal use only. don't use this when registering your own post type. */
+		'_edit_link' => 'post.php?post=%d', /* internal use only. don't use this when registering your own post type. */
 		'capability_type' => 'post',
 		'map_meta_cap' => true,
 		'hierarchical' => false,
@@ -66,7 +77,8 @@
 		'query_var' => false,
 		'show_in_nav_menus' => false,
 		'delete_with_user' => true,
-		'supports' => array( 'comments', 'author' ),
+		'supports' => array( 'title', 'editor', 'author', 'excerpt', 'comments' ),
+		'disables' => array( 'save', 'preview', 'post_status', 'visibility' )
 	) );
 
 	register_post_type( 'revision', array(
@@ -1075,7 +1087,7 @@
 		'capability_type' => 'post', 'capabilities' => array(), 'map_meta_cap' => null,
 		'_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false,
 		'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true,
-		'supports' => array(), 'register_meta_box_cb' => null,
+		'supports' => array(), 'disables' => array(), 'register_meta_box_cb' => null,
 		'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null,
 		'can_export' => true,
 		'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null,
@@ -1135,6 +1147,11 @@
 		add_post_type_support($post_type, array('title', 'editor'));
 	}
 
+	if ( ! empty($args->disables) ) {
+		disable_for_post_type($post_type, $args->disables);
+		unset($args->disables);
+	}
+
 	if ( false !== $args->query_var && !empty($wp) ) {
 		if ( true === $args->query_var )
 			$args->query_var = $post_type;
@@ -1492,6 +1509,66 @@
 }
 
 /**
+ * Disable long-existing features for a post type
+ *
+ * Can't later add post type support for certain things
+ *
+ * @since 3.5.0
+ * @param string $post_type The post type for which to remove the feature
+ * @param string|array $feature the feature being removed, can be an array of feature strings or a single string
+ */
+function disable_for_post_type( $post_type, $feature ) {
+	global $_wp_post_type_disabled;
+
+	$features = (array) $feature;
+	foreach ($features as $feature) {
+		if ( func_num_args() == 2 )
+			$_wp_post_type_disabled[$post_type][$feature] = true;
+		else
+			$_wp_post_type_disabled[$post_type][$feature] = array_slice( func_get_args(), 2 );
+	}
+}
+
+/**
+ * Get all the disabled post type features
+ *
+ * @since 3.5.0
+ * @param string $post_type The post type
+ * @return array
+ */
+
+function get_all_disabled_for_post_type( $post_type ) {
+	global $_wp_post_type_disabled;
+
+	if ( isset( $_wp_post_type_disabled[$post_type] ) )
+		return $_wp_post_type_disabled[$post_type];
+
+	return array();
+}
+
+/**
+ * Checks whether a post type disables a given feature
+ *
+ * @since 3.5.0
+ * @param string $post_type The post type being checked
+ * @param string $feature the feature being checked
+ * @return boolean
+ */
+
+function post_type_disables( $post_type, $feature ) {
+	global $_wp_post_type_disabled;
+
+	if ( !isset( $_wp_post_type_disabled[$post_type][$feature] ) )
+		return false;
+
+	// If no args passed then no extra checks need be performed
+	if ( func_num_args() <= 2 )
+		return true;
+
+	return true;
+}
+
+/**
  * Updates the post type for the post ID.
  *
  * The page or post cache will be cleaned for the post ID.
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 21626)
+++ wp-admin/includes/post.php	(working copy)
@@ -1083,7 +1083,7 @@
 
 	list($permalink, $post_name) = get_sample_permalink($post->ID, $new_title, $new_slug);
 
-	if ( 'publish' == $post->post_status ) {
+	if ( 'publish' == get_post_status( $post ) ) {
 		$ptype = get_post_type_object($post->post_type);
 		$view_post = $ptype->labels->view_item;
 		$title = __('Click to edit this part of the permalink');
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 21626)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -26,6 +26,7 @@
 </div>
 
 <div id="minor-publishing-actions">
+<?php if ( ! post_type_disables( $post->post_type, 'save' ) ) : ?>
 <div id="save-action">
 <?php if ( 'publish' != $post->post_status && 'future' != $post->post_status && 'pending' != $post->post_status ) { ?>
 <input <?php if ( 'private' == $post->post_status ) { ?>style="display:none"<?php } ?> type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save Draft'); ?>" class="button button-highlighted" />
@@ -34,7 +35,8 @@
 <?php } ?>
 <img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-loading" id="draft-ajax-loading" alt="" />
 </div>
-<?php if ( $post_type_object->public ) : ?>
+<?php endif; // doesn't disable save button ?>
+<?php if ( ! post_type_disables( $post->post_type, 'preview' ) && $post_type_object->public ) : ?>
 <div id="preview-action">
 <?php
 if ( 'publish' == $post->post_status ) {
@@ -57,7 +59,9 @@
 
 <div id="misc-publishing-actions">
 
+<?php if ( ! post_type_disables( $post->post_type, 'post_status' ) ) : ?>
 <div class="misc-pub-section"><label for="post_status"><?php _e('Status:') ?></label>
+
 <span id="post-status-display">
 <?php
 switch ( $post->post_status ) {
@@ -106,7 +110,9 @@
 
 <?php } ?>
 </div><?php // /misc-pub-section ?>
+<?php endif; // doesn't disable post_status ?>
 
+<?php if ( ! post_type_disables( $post->post_type, 'visibility' ) ) : ?>
 <div class="misc-pub-section" id="visibility">
 <?php _e('Visibility:'); ?> <span id="post-visibility-display"><?php
 
@@ -151,6 +157,7 @@
 <?php } ?>
 
 </div><?php // /misc-pub-section ?>
+<?php endif; // doesn't disable visibility ?>
 
 <?php
 // translators: Publish box date format, see http://php.net/date
@@ -204,7 +211,7 @@
 <div id="publishing-action">
 <img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" class="ajax-loading" id="ajax-loading" alt="" />
 <?php
-if ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) {
+if ( !in_array( $post->post_status, apply_filters( 'post_stati_published', array('publish', 'future', 'private', 'inherit') ) ) || 0 == $post->ID ) {
 	if ( $can_publish ) :
 		if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?>
 		<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Schedule') ?>" />
Index: wp-admin/includes/screen.php
===================================================================
--- wp-admin/includes/screen.php	(revision 21626)
+++ wp-admin/includes/screen.php	(working copy)
@@ -96,7 +96,7 @@
 	if ( $use_defaults ) {
 		$hidden = array();
 		if ( 'post' == $screen->base ) {
-			if ( 'post' == $screen->post_type || 'page' == $screen->post_type )
+			if ( 'post' == $screen->post_type || 'page' == $screen->post_type || 'attachment' == $screen->post_type )
 				$hidden = array('slugdiv', 'trackbacksdiv', 'postcustom', 'postexcerpt', 'commentstatusdiv', 'commentsdiv', 'authordiv', 'revisionsdiv');
 			else
 				$hidden = array( 'slugdiv' );
Index: wp-admin/post.php
===================================================================
--- wp-admin/post.php	(revision 21626)
+++ wp-admin/post.php	(working copy)
@@ -31,6 +31,7 @@
 if ( $post ) {
 	$post_type = $post->post_type;
 	$post_type_object = get_post_type_object( $post_type );
+	$parent_file = 'upload.php';
 }
 
 /**
@@ -148,6 +149,10 @@
 		$parent_file = "edit.php";
 		$submenu_file = "edit.php";
 		$post_new_file = "post-new.php";
+	} elseif ( 'attachment' === $post_type ) {
+ 		$parent_file = 'upload.php';
+ 		$submenu_file = 'upload.php';
+ 		$post_new_file = 'media-new.php';
 	} else {
 		if ( isset( $post_type_object ) && $post_type_object->show_in_menu && $post_type_object->show_in_menu !== true )
 			$parent_file = $post_type_object->show_in_menu;
Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 21626)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -73,7 +73,7 @@
 
 $notice = false;
 $form_extra = '';
-if ( 'auto-draft' == $post->post_status ) {
+if ( 'auto-draft' == get_post_status( $post ) ) {
 	if ( 'edit' == $action )
 		$post->post_title = '';
 	$autosave = false;
@@ -140,10 +140,10 @@
 if ( post_type_supports($post_type, 'comments') )
 	add_meta_box('commentstatusdiv', __('Discussion'), 'post_comment_status_meta_box', null, 'normal', 'core');
 
-if ( ('publish' == $post->post_status || 'private' == $post->post_status) && post_type_supports($post_type, 'comments') )
+if ( ('publish' == get_post_status( $post ) || 'private' == get_post_status( $post )) && post_type_supports($post_type, 'comments') )
 	add_meta_box('commentsdiv', __('Comments'), 'post_comment_meta_box', null, 'normal', 'core');
 
-if ( !( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) )
+if ( !( 'pending' == get_post_status( $post ) && !current_user_can( $post_type_object->cap->publish_posts ) ) )
 	add_meta_box('slugdiv', __('Slug'), 'post_slug_meta_box', null, 'normal', 'core');
 
 if ( post_type_supports($post_type, 'author') ) {
@@ -259,13 +259,13 @@
 <input type="hidden" id="originalaction" name="originalaction" value="<?php echo esc_attr( $form_action ) ?>" />
 <input type="hidden" id="post_author" name="post_author" value="<?php echo esc_attr( $post->post_author ); ?>" />
 <input type="hidden" id="post_type" name="post_type" value="<?php echo esc_attr( $post_type ) ?>" />
-<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status) ?>" />
+<input type="hidden" id="original_post_status" name="original_post_status" value="<?php echo esc_attr( $post->post_status ) ?>" />
 <input type="hidden" id="referredby" name="referredby" value="<?php echo esc_url(stripslashes(wp_get_referer())); ?>" />
 <?php if ( ! empty( $active_post_lock ) ) { ?>
 <input type="hidden" id="active_post_lock" value="<?php echo esc_attr( implode( ':', $active_post_lock ) ); ?>" />
 <?php
 }
-if ( 'draft' != $post->post_status )
+if ( 'draft' != get_post_status( $post ) )
 	wp_original_referer_field(true, 'previous');
 
 echo $form_extra;
@@ -292,10 +292,10 @@
 if ( !empty($shortlink) )
     $sample_permalink_html .= '<input id="shortlink" type="hidden" value="' . esc_attr($shortlink) . '" /><a href="#" class="button" onclick="prompt(&#39;URL:&#39;, jQuery(\'#shortlink\').val()); return false;">' . __('Get Shortlink') . '</a>';
 
-if ( $post_type_object->public && ! ( 'pending' == $post->post_status && !current_user_can( $post_type_object->cap->publish_posts ) ) ) { ?>
+if ( $post_type_object->public && ! ( 'pending' == get_post_status( $post ) && !current_user_can( $post_type_object->cap->publish_posts ) ) ) { ?>
 	<div id="edit-slug-box">
 	<?php
-		if ( ! empty($post->ID) && ! empty($sample_permalink_html) && 'auto-draft' != $post->post_status )
+		if ( ! empty($post->ID) && ! empty($sample_permalink_html) && 'auto-draft' != get_post_status( $post ) )
 			echo $sample_permalink_html;
 	?>
 	</div>
@@ -319,7 +319,7 @@
 	<td class="autosave-info">
 	<span class="autosave-message">&nbsp;</span>
 <?php
-	if ( 'auto-draft' != $post->post_status ) {
+	if ( 'auto-draft' != get_post_status( $post ) ) {
 		echo '<span id="last-edit">';
 		if ( $last_id = get_post_meta($post_ID, '_edit_last', true) ) {
 			$last_user = get_userdata($last_id);
