Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 21284)
+++ wp-includes/post.php	(working copy)
@@ -2830,12 +2830,20 @@
  * @param string $post_status no uniqueness checks are made if the post is still draft or pending
  * @param string $post_type
  * @param integer $post_parent
+ * @param string $real_status Because this function bails on non-published statuses, this gives
+ *     the ability to pass a fake "publish" status via $post_status while sending the real status
+ *     to the wp_unique_post_slug filter
  * @return string unique slug for the post, based on $post_name (with a -1, -2, etc. suffix)
  */
-function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent ) {
+function wp_unique_post_slug( $slug, $post_ID, $post_status, $post_type, $post_parent, $real_status = null ) {
 	if ( in_array( $post_status, array( 'draft', 'pending', 'auto-draft' ) ) )
 		return $slug;
 
+	// If $real_status string was passed, we can now return the $post_status to
+	// the real status.
+	if ( $real_status && is_string( $real_status ) )
+		$post_status = $real_status;
+
 	global $wpdb, $wp_rewrite;
 
 	$original_slug = $slug;
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 21284)
+++ wp-admin/includes/post.php	(working copy)
@@ -1034,7 +1034,7 @@
 	if ( !is_null($name) )
 		$post->post_name = sanitize_title($name ? $name : $title, $post->ID);
 
-	$post->post_name = wp_unique_post_slug($post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent);
+	$post->post_name = wp_unique_post_slug( $post->post_name, $post->ID, $post->post_status, $post->post_type, $post->post_parent, $original_status );
 
 	$post->filter = 'sample';
 
