Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 14266)
+++ wp-includes/post.php	(working copy)
@@ -15,6 +15,7 @@
  * Creates the initial post types when 'init' action is fired.
  */
 function create_initial_post_types() {
+
 	register_post_type( 'post', array(	'label' => __('Posts'),
 										'singular_label' => __('Post'),
 										'public' => true,
@@ -73,7 +74,7 @@
 												'rewrite' => false,
 												'query_var' => false,
 											) );
-
+																					
 	register_post_status( 'publish', array(	'label' => _x('Published', 'post'),
 											'public' => true,
 											'_builtin' => true, /* internal use only. */
@@ -89,13 +90,16 @@
 	register_post_status( 'draft', array(	'label' => _x('Draft', 'post'),
 											'protected' => true,
 											'_builtin' => true, /* internal use only. */
-											'label_count' => _n_noop('Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>')
+											'label_count' => _n_noop('Draft <span class="count">(%s)</span>', 'Drafts <span class="count">(%s)</span>'),
+											'show_in_select_ui' => true
 										) );
 
 	register_post_status( 'pending', array(	'label' => _x('Pending', 'post'),
 											'protected' => true,
 											'_builtin' => true, /* internal use only. */
-											'label_count' => _n_noop('Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>')
+											'label_count' => _n_noop('Pending <span class="count">(%s)</span>', 'Pending <span class="count">(%s)</span>'),
+											'show_in_select_ui' => true,
+											'display_label' => 'Pending Review'
 										) );
 
 	register_post_status( 'private', array(	'label' => _x('Private', 'post'),
@@ -114,6 +118,7 @@
 	register_post_status( 'auto-draft', array(	'label' => 'auto-draft',
 											'internal' => true,
 											'_builtin' => true, /* internal use only. */
+											'display_label' => 'Draft'
 										) );
 
 	register_post_status( 'inherit', array(	'label' => 'inherit',
@@ -521,6 +526,42 @@
 	return $status;
 }
 
+function post_type_can_have_status($post_type, $status){
+	global $wp_post_statuses;
+	
+	$post_type_object = get_post_type_object($post_type);
+	
+	if( $status == 'draft') :
+		$return = true;
+	elseif( is_array($post_type_object->allowed_status) ) :
+		if( in_array($status, $post_type_object->allowed_status) ) 
+			$return = true;
+		else
+			$return = false;
+	else :	
+		$status_obj = $wp_post_statuses[$status];
+		
+		if( empty($status_obj) )
+			$return = false;
+		elseif( is_array($status_obj->post_type) ){
+			if( in_array($post_type, $status_obj->post_type) )
+				$return = true;
+			else
+				$return = false;
+		}elseif( $status_obj->internal === true )
+			$return = false;
+		else
+			$return = true;
+	
+	endif;
+	
+	return $return;
+}
+
+	
+
+
+
 /**
  * Register a post type. Do not use before init.
  *
@@ -550,13 +591,22 @@
 		$wp_post_statuses = array();
 
 	// Args prefixed with an underscore are reserved for internal use.
-	$defaults = array('label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'show_in_admin_all' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'single_view_cap' => null);
+	$defaults = array('post_type' => false, 'edit_cap' => null, 'show_in_select_ui' => false, 'display_label' => false, 'label' => false, 'label_count' => false, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => null, 'internal' => null, 'protected' => null, 'private' => null, 'show_in_admin_all' => null, 'publicly_queryable' => null, 'show_in_admin_status_list' => null, 'show_in_admin_all_list' => null, 'single_view_cap' => null);
 	$args = wp_parse_args($args, $defaults);
 	$args = (object) $args;
 
 	$post_status = sanitize_user($post_status, true);
 	$args->name = $post_status;
 
+	if ( null === $args->post_type )
+		$args->post_type = false; 
+	
+	if ( null === $args->edit_cap )
+		$args->edit_cap = null;
+	
+	if ( null === $args->show_in_select_ui )
+		$args->show_in_select_ui = false;
+
 	if ( null === $args->public && null === $args->internal && null === $args->protected && null === $args->private )
 		$args->internal = true;
 
@@ -589,6 +639,9 @@
 
 	if ( false === $args->label )
 		$args->label = $post_status;
+		
+	if ( null === $args->display_label || $args->display_label == false )
+		$args->display_label = $args->label;
 
 	if ( false === $args->label_count )
 		$args->label_count = array( $args->label, $args->label );
@@ -797,12 +850,15 @@
 		$wp_post_types = array();
 
 	// Args prefixed with an underscore are reserved for internal use.
-	$defaults = array('label' => false, 'singular_label' => false, 'description' => '', 'publicly_queryable' => null, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => false, 'rewrite' => true, 'query_var' => true, 'supports' => array(), 'register_meta_box_cb' => null, 'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null, 'permalink_epmask' => EP_PERMALINK );
+	$defaults = array('allowed_status' => false, 'label' => false, 'singular_label' => false, 'description' => '', 'publicly_queryable' => null, 'exclude_from_search' => null, '_builtin' => false, '_edit_link' => 'post.php?post=%d', 'capability_type' => 'post', 'hierarchical' => false, 'public' => false, 'rewrite' => true, 'query_var' => true, 'supports' => array(), 'register_meta_box_cb' => null, 'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null, 'permalink_epmask' => EP_PERMALINK );
 	$args = wp_parse_args($args, $defaults);
 	$args = (object) $args;
 
 	$post_type = sanitize_user($post_type, true);
 	$args->name = $post_type;
+	
+	if( null === $args->allowed_status || empty($args->allowed_status) )
+		$args->status_restrict = false;
 
 	// If not set, default to the setting for public.
 	if ( null === $args->publicly_queryable )
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 14266)
+++ wp-includes/script-loader.php	(working copy)
@@ -301,6 +301,7 @@
 			'updatePage' => __('Update Page'),
 			'savePending' => __('Save as Pending'),
 			'saveDraft' => __('Save Draft'),
+			'saveDefault' => __('Save'),
 			'private' => __('Private'),
 			'public' => __('Public'),
 			'publicSticky' => __('Public, Sticky'),
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 14266)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -10,7 +10,7 @@
  * @param object $post
  */
 function post_submit_meta_box($post) {
-	global $action;
+	global $action, $wp_post_statuses;
 
 	$post_type = $post->post_type;
 	$post_type_object = get_post_type_object($post_type);
@@ -27,11 +27,13 @@
 
 <div id="minor-publishing-actions">
 <div id="save-action">
+<?php if( post_type_can_have_status($post_type, 'publish') ) : ?>
 <?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'); ?>" tabindex="4" class="button button-highlighted" />
 <?php } elseif ( 'pending' == $post->post_status && $can_publish ) { ?>
 <input type="submit" name="save" id="save-post" value="<?php esc_attr_e('Save as Pending'); ?>" tabindex="4" class="button button-highlighted" />
 <?php } ?>
+<?php endif; ?>
 </div>
 
 <div id="preview-action">
@@ -52,31 +54,12 @@
 </div><?php // /minor-publishing-actions ?>
 
 <div id="misc-publishing-actions">
-
 <div class="misc-pub-section<?php if ( !$can_publish ) { echo ' misc-pub-section-last'; } ?>"><label for="post_status"><?php _e('Status:') ?></label>
 <span id="post-status-display">
-<?php
-switch ( $post->post_status ) {
-	case 'private':
-		_e('Privately Published');
-		break;
-	case 'publish':
-		_e('Published');
-		break;
-	case 'future':
-		_e('Scheduled');
-		break;
-	case 'pending':
-		_e('Pending Review');
-		break;
-	case 'draft':
-	case 'auto-draft':
-		_e('Draft');
-		break;
-	case 'auto-draft':
-		_e('Unsaved');
-		break;
-}
+<?php 
+	$status = get_post_status_object($post->post_status);
+	if($status->label == 'auto-draft' ) _e('Draft');
+	else _e($status->label); 
 ?>
 </span>
 <?php if ( 'publish' == $post->post_status || 'private' == $post->post_status || $can_publish ) { ?>
@@ -84,20 +67,11 @@
 
 <div id="post-status-select" class="hide-if-js">
 <input type="hidden" name="hidden_post_status" id="hidden_post_status" value="<?php echo esc_attr( ('auto-draft' == $post->post_status ) ? 'draft' : $post->post_status); ?>" />
+
 <select name='post_status' id='post_status' tabindex='4'>
-<?php if ( 'publish' == $post->post_status ) : ?>
-<option<?php selected( $post->post_status, 'publish' ); ?> value='publish'><?php _e('Published') ?></option>
-<?php elseif ( 'private' == $post->post_status ) : ?>
-<option<?php selected( $post->post_status, 'private' ); ?> value='publish'><?php _e('Privately Published') ?></option>
-<?php elseif ( 'future' == $post->post_status ) : ?>
-<option<?php selected( $post->post_status, 'future' ); ?> value='future'><?php _e('Scheduled') ?></option>
-<?php endif; ?>
-<option<?php selected( $post->post_status, 'pending' ); ?> value='pending'><?php _e('Pending Review') ?></option>
-<?php if ( 'auto-draft' == $post->post_status ) : ?>
-<option<?php selected( $post->post_status, 'auto-draft' ); ?> value='draft'><?php _e('Draft') ?></option>
-<?php else : ?>
-<option<?php selected( $post->post_status, 'draft' ); ?> value='draft'><?php _e('Draft') ?></option>
-<?php endif; ?>
+
+	<?php output_post_status_select( $post->post_type, $post->ID ); ?>
+
 </select>
  <a href="#post_status" class="save-post-status hide-if-no-js button"><?php _e('OK'); ?></a>
  <a href="#post_status" class="cancel-post-status hide-if-no-js"><?php _e('Cancel'); ?></a>
@@ -106,6 +80,7 @@
 <?php } ?>
 </div><?php // /misc-pub-section ?>
 
+<?php if( post_type_can_have_status($post->post_type, 'private') ) : ?>
 <div class="misc-pub-section " id="visibility">
 <?php _e('Visibility:'); ?> <span id="post-visibility-display"><?php
 
@@ -151,10 +126,12 @@
 </div>
 <?php } ?>
 
-</div><?php // /misc-pub-section ?>
+</div>
+<?php endif; // /misc-pub-section for visbility ?>
 
 
-<?php
+<?php 
+
 // translators: Publish box date formt, see http://php.net/date
 $datef = __( 'M j, Y @ G:i' );
 if ( 0 != $post->ID ) {
@@ -177,13 +154,16 @@
 
 if ( $can_publish ) : // Contributors don't get to choose the date of publish ?>
 <div class="misc-pub-section curtime misc-pub-section-last">
+<?php if(post_type_can_have_status($post_type, 'future') ) : ?>
 	<span id="timestamp">
 	<?php printf($stamp, $date); ?></span>
 	<a href="#edit_timestamp" class="edit-timestamp hide-if-no-js" tabindex='4'><?php _e('Edit') ?></a>
-	<div id="timestampdiv" class="hide-if-js"><?php touch_time(($action == 'edit'),1,4); ?></div>
-</div><?php // /misc-pub-section ?>
 <?php endif; ?>
 
+	<div id="timestampdiv" <?php if(!post_type_can_have_status($post_type, 'future')) echo 'style="display: none;"'; ?> class="hide-if-js"><?php touch_time(($action == 'edit'),1,4); ?></div>
+</div><?php // /misc-pub-section ?>
+<?php endif; //end future post status ?>
+
 <?php do_action('post_submitbox_misc_actions'); ?>
 </div>
 <div class="clear"></div>
@@ -206,6 +186,7 @@
 <div id="publishing-action">
 <img src="<?php echo esc_url( admin_url( 'images/wpspin_light.gif' ) ); ?>" id="ajax-loading" style="visibility:hidden;" alt="" />
 <?php
+if( post_type_can_have_status($post_type, 'publish') === true ) :
 if ( !in_array( $post->post_status, array('publish', 'future', 'private') ) || 0 == $post->ID ) {
 	if ( $can_publish ) :
 		if ( !empty($post->post_date_gmt) && time() < strtotime( $post->post_date_gmt . ' +0000' ) ) : ?>
@@ -224,7 +205,11 @@
 		<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Update') ?>" />
 		<input name="save" type="submit" class="button-primary" id="publish" tabindex="5" accesskey="p" value="<?php esc_attr_e('Update') ?>" />
 <?php
-} ?>
+} 
+else: ?>
+		<input name="original_publish" type="hidden" id="original_publish" value="<?php esc_attr_e('Save') ?>" />
+		<input name="save" type="submit" class="button-primary" id="save_post" tabindex="5" accesskey="p" value="<?php esc_attr_e('Save') ?>" />
+<?php endif; ?>
 </div>
 <div class="clear"></div>
 </div>
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 14266)
+++ wp-admin/includes/template.php	(working copy)
@@ -8,6 +8,38 @@
  * @subpackage Administration
  */
 
+function output_post_status_select( $post_type, $id = null, $view_defaults = false ){
+	global $wp_post_statuses;
+	
+	$post = (!empty($id)) ? get_post( $id ) : null;
+	//$post_type = $post->post_type;
+	$post_type_object = get_post_type_object($post_type);
+
+	
+	foreach( $wp_post_statuses as $status => $args ):
+		if($status == 'auto-draft') continue;
+		
+		if(post_type_can_have_status($post_type, $status)){
+		
+			if( $view_defaults === true && in_array($status, array('publish', 'draft')) )
+				$continue = true;
+			
+			if( $status == $post->post_status || $args->show_in_select_ui === true || $continue === true ) {
+
+				$allowed_edit = true;
+					
+				if(	isset($args->edit_cap) && !current_user_can($args->edit_cap) )
+					$allowed_edit = false;
+				if( $allowed_edit === true ) { ?>
+					
+					<option<?php ( isset($post) ) ? selected( $post->post_status, $status ) : ''; ?> value='<?php echo ($status == 'auto-draft') ? 'draft' : $status; ?>'><?php _e($args->display_label); ?></option>;
+<?php			}
+			}
+		}
+		unset($continue);
+	endforeach;
+}
+
 /**
  * {@internal Missing Short Description}}
  *
@@ -847,7 +879,7 @@
  * @param string $screen
  */
 function inline_edit_row( $screen ) {
-	global $current_user, $mode;
+	global $current_user, $mode, $wp_post_statuses, $posts;
 
 	if ( is_string($screen) ) {
 		$screen = array('id' => 'edit-' . $screen, 'base' => 'edit', 'post_type' => $screen );
@@ -1099,15 +1131,9 @@
 <?php if ( $bulk ) : ?>
 					<option value="-1"><?php _e('&mdash; No Change &mdash;'); ?></option>
 <?php endif; // $bulk ?>
-				<?php if ( $can_publish ) : // Contributors only get "Unpublished" and "Pending Review" ?>
-					<option value="publish"><?php _e( 'Published' ); ?></option>
-					<option value="future"><?php _e( 'Scheduled' ); ?></option>
-<?php if ( $bulk ) : ?>
-					<option value="private"><?php _e('Private') ?></option>
-<?php endif; // $bulk ?>
-				<?php endif; ?>
-					<option value="pending"><?php _e( 'Pending Review' ); ?></option>
-					<option value="draft"><?php _e( 'Draft' ); ?></option>
+
+					<?php output_post_status_select( $screen->post_type, null, true); ?>
+					
 				</select>
 			</label>
 
@@ -1164,7 +1190,7 @@
 		<br class="clear" />
 	</p>
 	</td></tr>
-<?php
+<?php 
 	$bulk++;
 	} ?>
 	</tbody></table></form>
Index: wp-admin/js/post.dev.js
===================================================================
--- wp-admin/js/post.dev.js	(revision 14266)
+++ wp-admin/js/post.dev.js	(working copy)
@@ -432,10 +432,10 @@
 				$('#save-post').hide();
 			} else {
 				$('#save-post').show();
-				if ( $('option:selected', postStatus).val() == 'pending' ) {
-					$('#save-post').show().val( postL10n.savePending );
+				if ( $('option:selected', postStatus).val() == 'draft' ) {
+					$('#save-post').show().val( postL10n.saveDraft );
 				} else {
-					$('#save-post').show().val( postL10n.saveDraft );
+					$('#save-post').show().val( postL10n.saveDefault );
 				}
 			}
 			return true;
