Index: wp-admin/css/wp-admin.dev.css
===================================================================
--- wp-admin/css/wp-admin.dev.css	(revision 18621)
+++ wp-admin/css/wp-admin.dev.css	(working copy)
@@ -3206,7 +3206,11 @@
 	border-style: solid;
 }
 
+#timestampdiv input[type=radio] {
+	margin-right: 10px;
+}
 
+
 /*------------------------------------------------------------------------------
   11.1 - Custom Fields
 ------------------------------------------------------------------------------*/
Index: wp-admin/includes/post.php
===================================================================
--- wp-admin/includes/post.php	(revision 18621)
+++ wp-admin/includes/post.php	(working copy)
@@ -101,10 +101,20 @@
 	if (!isset( $post_data['ping_status'] ))
 		$post_data['ping_status'] = 'closed';
 
-	foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
-		if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
-			$post_data['edit_date'] = '1';
-			break;
+	// publish_immediately radio box is only displayed when editing scheduled post
+	// so it's safe to assume that when we encounter this value, the new status is 'publish'
+	if ( ! empty( $post_data['publish_immediately'] ) ) {
+		$post_data['post_status'] = 'publish';
+
+		// cancel the scheduled date
+		$post_data['post_date'] = current_time( 'mysql' );
+		$post_data['post_date_gmt'] = '';
+	} else {
+		foreach ( array('aa', 'mm', 'jj', 'hh', 'mn') as $timeunit ) {
+			if ( !empty( $post_data['hidden_' . $timeunit] ) && $post_data['hidden_' . $timeunit] != $post_data[$timeunit] ) {
+				$post_data['edit_date'] = '1';
+				break;
+			}
 		}
 	}
 
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 18621)
+++ wp-admin/includes/template.php	(working copy)
@@ -596,6 +596,7 @@
 
 	$time_adj = current_time('timestamp');
 	$post_date = ($for_post) ? $post->post_date : $comment->comment_date;
+	$radio_boxes = ( $post->post_status == 'future' ); // only display radio boxes if post is scheduled
 	$jj = ($edit) ? mysql2date( 'd', $post_date, false ) : gmdate( 'd', $time_adj );
 	$mm = ($edit) ? mysql2date( 'm', $post_date, false ) : gmdate( 'm', $time_adj );
 	$aa = ($edit) ? mysql2date( 'Y', $post_date, false ) : gmdate( 'Y', $time_adj );
@@ -624,6 +625,12 @@
 	$minute = '<input type="text" ' . ( $multi ? '' : 'id="mn" ' ) . 'name="mn" value="' . $mn . '" size="2" maxlength="2"' . $tab_index_attribute . ' autocomplete="off" />';
 
 	echo '<div class="timestamp-wrap">';
+
+	if ( $radio_boxes ) {
+		echo '<label for="publish-immediately"><input type="radio" name="publish_immediately" value="1" id="publish-immediately" />' . __( 'Immediately' ) . '</label><br />';
+		echo '<input type="radio" id="publish-future" name="publish_immediately" value="0" checked="checked" />';
+	}
+
 	/* translators: 1: month input, 2: day input, 3: year input, 4: hour input, 5: minute input */
 	printf(__('%1$s%2$s, %3$s @ %4$s : %5$s'), $month, $day, $year, $hour, $minute);
 
Index: wp-admin/js/post.dev.js
===================================================================
--- wp-admin/js/post.dev.js	(revision 18621)
+++ wp-admin/js/post.dev.js	(working copy)
@@ -258,6 +258,15 @@
 		});
 	}
 
+	$('#aa, #mm, #jj, #hh, #mn').change( function() {
+		$('#publish-future').attr('checked', true);
+		updateText();
+	});
+
+	$('#timestampdiv input[type=radio]').change(function(){
+		updateText();
+	});
+
 	// categories
 	$('.categorydiv').each( function(){
 		var this_id = $(this).attr('id'), noSyncChecks = false, syncChecks, catAddAfter, taxonomyParts, taxonomy, settingName;
@@ -383,17 +392,19 @@
 				$('.timestamp-wrap', '#timestampdiv').removeClass('form-invalid');
 			}
 
-			if ( attemptedDate > currentDate && $('#original_post_status').val() != 'future' ) {
+			if ( ( attemptedDate <= currentDate && $('#original_post_status').val() != 'publish' ) || $('#publish-immediately').is(':checked') ) {
+				publishOn = postL10n.publishOn;
+				$('#publish').val( postL10n.publish );
+			} else if ( attemptedDate > currentDate && attemptedDate.toUTCString() != originalDate.toUTCString() ) {
 				publishOn = postL10n.publishOnFuture;
 				$('#publish').val( postL10n.schedule );
-			} else if ( attemptedDate <= currentDate && $('#original_post_status').val() != 'publish' ) {
-				publishOn = postL10n.publishOn;
-				$('#publish').val( postL10n.publish );
 			} else {
 				publishOn = postL10n.publishOnPast;
 				$('#publish').val( postL10n.update );
 			}
-			if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack
+			if ( $('#publish-immediately').is(':checked') ) {
+				$('#timestamp').html(postL10n.publishImmediately);
+			} else if ( originalDate.toUTCString() == attemptedDate.toUTCString() ) { //hack
 				$('#timestamp').html(stamp);
 			} else {
 				$('#timestamp').html(
@@ -404,6 +415,7 @@
 					hh + ':' +
 					mn + '</b> '
 				);
+				$('#publish-future').attr('checked', true);
 			}
 
 			if ( $('input:radio:checked', '#post-visibility-select').val() == 'private' ) {
@@ -502,6 +514,7 @@
 			$('#hh').val($('#hidden_hh').val());
 			$('#mn').val($('#hidden_mn').val());
 			$('#timestampdiv').siblings('a.edit-timestamp').show();
+			$('#publish-future').attr('checked', true);
 			updateText();
 			return false;
 		});
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 18621)
+++ wp-includes/post.php	(working copy)
@@ -2680,11 +2680,8 @@
 		$post_cats = $post['post_category'];
 
 	// Drafts shouldn't be assigned a date unless explicitly done so by the user
-	if ( isset( $post['post_status'] ) && in_array($post['post_status'], array('draft', 'pending', 'auto-draft')) && empty($postarr['edit_date']) &&
-			 ('0000-00-00 00:00:00' == $post['post_date_gmt']) )
-		$clear_date = true;
-	else
-		$clear_date = false;
+	$clear_date = isset( $post['post_status'] ) && in_array( $post['post_status'], array( 'draft', 'pending', 'auto-draft' ) ) && empty( $postarr['edit_date'] )
+					&& ( '0000-00-00 00:00:00' == $post['post_date_gmt'] );
 
 	// Merge old and new fields with new fields overwriting old ones.
 	$postarr = array_merge($post, $postarr);
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 18621)
+++ wp-includes/script-loader.php	(working copy)
@@ -300,7 +300,8 @@
 			'publicSticky' => __('Public, Sticky'),
 			'password' => __('Password Protected'),
 			'privatelyPublished' => __('Privately Published'),
-			'published' => __('Published')
+			'published' => __('Published'),
+			'publishImmediately' => __('Publish <b>immediately</b>'),
 		) );
 
 		$scripts->add( 'link', "/wp-admin/js/link$suffix.js", array('wp-lists', 'postbox'), '20110524', 1 );
