Index: wp-admin/edit-comments.php
===================================================================
--- wp-admin/edit-comments.php	(revision 8795)
+++ wp-admin/edit-comments.php	(working copy)
@@ -100,7 +100,8 @@
 $stati = array(
 		'moderated' => sprintf(__ngettext('Awaiting Moderation (%s)', 'Awaiting Moderation (%s)', number_format_i18n($num_comments->moderated) ), "<span class='comment-count'>" . number_format_i18n($num_comments->moderated) . "</span>"),
 		'approved' => _c('Approved|plural'),
-		'spam' => sprintf(__ngettext('Spam (%s)', 'Spam (%s)', number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>")
+		'spam' => sprintf(__ngettext('Spam (%s)', 'Spam (%s)', number_format_i18n($num_comments->spam) ), "<span class='spam-comment-count'>" . number_format_i18n($num_comments->spam) . "</span>"),
+		'deleted' => sprintf(__ngettext('Deleted (%s)', 'Deleted (%s)', number_format_i18n($num_comments->deleted) ), "<span class='deleted-comment-count'>" . number_format_i18n($num_comments->deleted) . "</span>")
 	);
 $class = ( '' === $comment_status ) ? ' class="current"' : '';
 $status_links[] = "<li><a href=\"edit-comments.php\"$class>".__('Show All Comments')."</a>";
@@ -183,7 +184,11 @@
 <?php if ( 'spam' != $comment_status ): ?>
 <option value="markspam"><?php _e('Mark as Spam'); ?></option>
 <?php endif; ?>
+<?php if ( 'deleted' != $comment_status ): ?>
 <option value="delete"><?php _e('Delete'); ?></option>
+<?php else : ?>
+<option value="delete"><?php _e('Delete Permenantly'); ?></option>
+<?php endif; ?>
 </select>
 <input type="submit" name="doaction" value="Apply" class="button-secondary apply" />
 <?php do_action('manage_comments_nav', $comment_status); ?>
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 8795)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -182,7 +182,7 @@
 	if ( $_POST['new'] == $current )
 		die('1');
 
-	if ( in_array( $current, array( 'unapproved', 'spam' ) ) ) {
+	if ( in_array( $current, array( 'unapproved', 'spam', 'deleted' ) ) ) {
 		check_ajax_referer( "approve-comment_$id" );
 		if ( wp_set_comment_status( $comment->comment_ID, 'approve' ) )
 			die('1');
Index: wp-admin/wp-admin.css
===================================================================
--- wp-admin/wp-admin.css	(revision 8795)
+++ wp-admin/wp-admin.css	(working copy)
@@ -249,7 +249,7 @@
 	display: none;
 }
 
-.unapproved .approve, .spam .approve {
+.unapproved .approve, .spam .approve, .deleted .approve {
 	display: inline;
 }
 
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 8795)
+++ wp-admin/includes/template.php	(working copy)
@@ -948,6 +948,8 @@
 		$approved = "comment_approved = '1'";
 	elseif ( 'spam' == $status )
 		$approved = "comment_approved = 'spam'";
+	elseif ( 'deleted' == $status )
+		$approved = "comment_approved = 'deleted'";
 	else
 		$approved = "( comment_approved = '0' OR comment_approved = '1' )";
 
@@ -1021,7 +1023,10 @@
 		$actions['edit']      = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . __('Edit comment') . "'>". __('Edit') . '</a> | ';
 		if ( 'spam' != $the_comment_status )
 			$actions['spam']      = "<a href='$spam_url' class='delete:the-comment-list:comment-$comment->comment_ID::spam=1 vim-s vim-destructive' title='" . __( 'Mark this comment as spam' ) . "'>" . __( 'Spam' ) . '</a> | ';
-		$actions['delete']    = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID delete vim-d vim-destructive'>" . __('Delete') . '</a>';
+		if ( 'deleted' == $the_comment_status )
+			$actions['delete']    = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID delete vim-d vim-destructive'>" . __('Delete Permanently') . '</a>';
+		else
+			$actions['delete']    = "<a href='$delete_url' class='delete:the-comment-list:comment-$comment->comment_ID delete vim-d vim-destructive'>" . __('Delete') . '</a>';
 
 		if ( $comment_status ) { // not looking at all comments
 			if ( 'approved' == $the_comment_status ) {
@@ -1033,7 +1038,7 @@
 			}
 		}
 
-		if ( 'spam' != $the_comment_status )
+		if ( 'spam' != $the_comment_status && 'deleted' != $the_comment_status )
 			$actions['reply'] = '<span class="hide-if-no-js"> | <a onclick="commentReply.open(\''.$comment->comment_ID.'\',\''.$post->ID.'\',this);return false;" class="vim-r" title="'.__('Reply to this comment').'" href="#">' . __('Reply') . '</a></span>';
 
 		$actions = apply_filters( 'comment_row_actions', $actions, $comment );
Index: wp-admin/js/edit-comments.js
===================================================================
--- wp-admin/js/edit-comments.js	(revision 8795)
+++ wp-admin/js/edit-comments.js	(working copy)
@@ -67,6 +67,17 @@
 			if ( n < 0 ) { n = 0; }
 			a.html( n.toString() );
 		});
+		$('li span.deleted-comment-count' ).each( function() {
+			var a = $(this);
+			var n = parseInt(a.html(),10);
+			if ( $(settings.target).parents( 'span.delete' ).size() && !$('#' + settings.element).is('.deleted') ) { // we deleted a comment
+				n = n + 1;
+			} else if ( $('#' + settings.element).is('.deleted') ) { // we approved or deleted a deleted comment
+				n = n - 1;
+			}
+			if ( n < 0 ) { n = 0; }
+			a.html( n.toString() );
+		});
 	
 		if ( theExtraList.size() == 0 || theExtraList.children().size() == 0 ) {
 			return;
Index: wp-includes/comment.php
===================================================================
--- wp-includes/comment.php	(revision 8795)
+++ wp-includes/comment.php	(working copy)
@@ -540,7 +540,7 @@
 
 	$total = 0;
 	$stats = array( );
-	$approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam');
+	$approved = array('0' => 'moderated', '1' => 'approved', 'spam' => 'spam', 'deleted' => 'deleted');
 	foreach( (array) $count as $row_num => $row ) {
 		$total += $row['num_comments'];
 		$stats[$approved[$row['comment_approved']]] = $row['num_comments'];
@@ -577,10 +577,16 @@
 	do_action('delete_comment', $comment_id);
 
 	$comment = get_comment($comment_id);
+	
+	if ($comment->comment_approved == 'deleted' && $wpdb->query($wpdb->prepare("DELETE FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id))) {
+		return true;
+	}
+	else if ($wpdb->query($wpdb->prepare("UPDATE $wpdb->comments SET comment_approved='deleted' WHERE comment_ID = %d LIMIT 1", $comment_id))) {
+		wp_schedule_single_event(time()+(60*60*24*30), 'wp_delete_comment', array($comment_id));
+		return true;
+	}
+	else return false;
 
-	if ( ! $wpdb->query( $wpdb->prepare("DELETE FROM $wpdb->comments WHERE comment_ID = %d LIMIT 1", $comment_id) ) )
-		return false;
-
 	$post_id = $comment->comment_post_ID;
 	if ( $post_id && $comment->comment_approved == 1 )
 		wp_update_comment_count($post_id);
@@ -590,6 +596,7 @@
 	do_action('wp_set_comment_status', $comment_id, 'delete');
 	return true;
 }
+add_action('wp_delete_comment','wp_delete_comment');	// Needed for scheduled deletion using wp_cron.
 
 /**
  * The status of a comment by ID.
@@ -614,6 +621,8 @@
 		return 'unapproved';
 	elseif ( $approved == 'spam' )
 		return 'spam';
+	elseif ( $approved == 'deleted' )
+		return 'deleted';
 	else
 		return false;
 }
@@ -816,6 +825,7 @@
 				$comment = get_comment($comment_id);
 				wp_notify_postauthor($comment_id, $comment->comment_type);
 			}
+			wp_unschedule_event(wp_next_scheduled('wp_delete_comment', array($comment_id)), 'wp_delete_comment', array($comment_id));	// Unschedule comment for deletion, if scheduled
 			break;
 		case 'spam':
 			$query = $wpdb->prepare("UPDATE $wpdb->comments SET comment_approved='spam' WHERE comment_ID = %d LIMIT 1", $comment_id);
