diff --git wp-admin/admin-ajax.php wp-admin/admin-ajax.php
index d5a0d1e..ea9fc3f 100644
--- wp-admin/admin-ajax.php
+++ wp-admin/admin-ajax.php
@@ -189,7 +189,7 @@ endif;
  * @param int $comment_id
  * @return die
  */
-function _wp_ajax_delete_comment_response( $comment_id ) {
+function _wp_ajax_delete_comment_response( $comment_id, $delta = -1 ) {
 	$total = (int) @$_POST['_total'];
 	$per_page = (int) @$_POST['_per_page'];
 	$page = (int) @$_POST['_page'];
@@ -198,47 +198,35 @@ function _wp_ajax_delete_comment_response( $comment_id ) {
 	if ( !$total || !$per_page || !$page || !$url )
 		die( (string) time() );
 
-	if ( --$total < 0 ) // Take the total from POST and decrement it (since we just deleted one)
+	$total += $delta;
+	if ( $total < 0 )
 		$total = 0;
 
-	if ( 0 != $total % $per_page && 1 != mt_rand( 1, $per_page ) ) // Only do the expensive stuff on a page-break, and about 1 other time per page
-		die( (string) time() );
-
-	$post_id = 0;
-	$status = 'total_comments'; // What type of comment count are we looking for?
-	$parsed = parse_url( $url );
-	if ( isset( $parsed['query'] ) ) {
-		parse_str( $parsed['query'], $query_vars );
-		if ( !empty( $query_vars['comment_status'] ) )
-			$status = $query_vars['comment_status'];
-		if ( !empty( $query_vars['p'] ) )
-			$post_id = (int) $query_vars['p'];
-	}
-
-	$comment_count = wp_count_comments($post_id);
-	$time = time(); // The time since the last comment count
-
-	if ( isset( $comment_count->$status ) ) // We're looking for a known type of comment count
-		$total = $comment_count->$status;
-	// else use the decremented value from above
-
-	$page_links = paginate_links( array(
-		'base' => add_query_arg( 'apage', '%#%', $url ),
-		'format' => '',
-		'prev_text' => __('&laquo;'),
-		'next_text' => __('&raquo;'),
-		'total' => ceil($total / $per_page),
-		'current' => $page
-	) );
-	$x = new WP_Ajax_Response( array(
+	$response = array(
 		'what' => 'comment',
 		'id' => $comment_id, // here for completeness - not used
 		'supplemental' => array(
-			'pageLinks' => $page_links,
+			'time' => time(),
+			'l10nTotal' => sprintf( _n( '1 item', '%s items', $total ), number_format_i18n( $total ) ),
 			'total' => $total,
-			'time' => $time
-		)
-	) );
+		),
+	);
+	
+	$page_gap = ( $delta == 1 ) ? 1 : 0;
+	
+	if ( $page_gap == $total % $per_page ) {
+		set_current_screen( 'edit-comments' );
+
+		$wp_list_table = _get_list_table('WP_Comments_List_Table');
+		$wp_list_table->prepare_items();
+		
+		$response['supplemental']['pageLinks'] = $wp_list_table->pagination( 'top', false );
+		$response['supplemental']['pageLinksBottom'] = $wp_list_table->pagination( 'bottom', false );
+		$response['supplemental']['total_pages'] = number_format_i18n( $wp_list_table->get_pagination_arg( 'total_pages' ) );
+	}
+
+	$x = new WP_Ajax_Response( $response );
+	
 	$x->send();
 }
 
@@ -330,7 +318,8 @@ case 'delete-comment' : // On success, die with time() instead of 1
 
 	check_ajax_referer( "delete-comment_$id" );
 	$status = wp_get_comment_status( $comment->comment_ID );
-
+	
+	$delta = -1;
 	if ( isset($_POST['trash']) && 1 == $_POST['trash'] ) {
 		if ( 'trash' == $status )
 			die( (string) time() );
@@ -339,6 +328,8 @@ case 'delete-comment' : // On success, die with time() instead of 1
 		if ( 'trash' != $status )
 			die( (string) time() );
 		$r = wp_untrash_comment( $comment->comment_ID );
+		if (  $_POST['comment_status'] != 'trash' ) //undo trash
+			$delta = 1;
 	} elseif ( isset($_POST['spam']) && 1 == $_POST['spam'] ) {
 		if ( 'spam' == $status )
 			die( (string) time() );
@@ -347,6 +338,8 @@ case 'delete-comment' : // On success, die with time() instead of 1
 		if ( 'spam' != $status )
 			die( (string) time() );
 		$r = wp_unspam_comment( $comment->comment_ID );
+		if ( $_POST['comment_status'] != 'spam' ) // undo spam
+			$delta = 1;
 	} elseif ( isset($_POST['delete']) && 1 == $_POST['delete'] ) {
 		$r = wp_delete_comment( $comment->comment_ID );
 	} else {
@@ -354,7 +347,7 @@ case 'delete-comment' : // On success, die with time() instead of 1
 	}
 
 	if ( $r ) // Decide if we need to send back '1' or a more complicated response including page links and comment counts
-		_wp_ajax_delete_comment_response( $comment->comment_ID );
+		_wp_ajax_delete_comment_response( $comment->comment_ID, $delta );
 	die( '0' );
 	break;
 case 'delete-tag' :
diff --git wp-admin/edit-comments.php wp-admin/edit-comments.php
index 40ef4a4..ac3de48 100644
--- wp-admin/edit-comments.php
+++ wp-admin/edit-comments.php
@@ -228,9 +228,9 @@ if ( isset($_REQUEST['approved']) || isset($_REQUEST['deleted']) || isset($_REQU
 <input type="hidden" name="comment_status" value="<?php echo esc_attr($comment_status); ?>" />
 <input type="hidden" name="pagegen_timestamp" value="<?php echo esc_attr(current_time('mysql', 1)); ?>" />
 
-<input type="hidden" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('total_items') ); ?>" />
-<input type="hidden" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('per_page') ); ?>" />
-<input type="hidden" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('page') ); ?>" />
+<input type="hidden" autocomplete="off" name="_total" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('total_items') ); ?>" />
+<input type="hidden" autocomplete="off" name="_per_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('per_page') ); ?>" />
+<input type="hidden" autocomplete="off" name="_page" value="<?php echo esc_attr( $wp_list_table->get_pagination_arg('page') ); ?>" />
 
 <?php if ( isset($_REQUEST['paged']) ) { ?>
 	<input type="hidden" name="paged" value="<?php echo esc_attr( absint( $_REQUEST['paged'] ) ); ?>" />
diff --git wp-admin/includes/class-wp-comments-list-table.php wp-admin/includes/class-wp-comments-list-table.php
index 0c34b1d..af35fdc 100644
--- wp-admin/includes/class-wp-comments-list-table.php
+++ wp-admin/includes/class-wp-comments-list-table.php
@@ -47,7 +47,9 @@ class WP_Comments_List_Table extends WP_List_Table {
 		if ( !in_array( $comment_status, array( 'all', 'moderated', 'approved', 'spam', 'trash' ) ) )
 			$comment_status = 'all';
 
-		$comment_type = !empty( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';
+		$comment_type = isset( $_REQUEST['comment_type'] ) ? $_REQUEST['comment_type'] : '';
+		if ( ! in_array( $comment_type, array( '', 'pings', 'comment' ) ) )
+			$comment_type = '';
 
 		$search = ( isset( $_REQUEST['s'] ) ) ? $_REQUEST['s'] : '';
 
diff --git wp-admin/includes/class-wp-list-table.php wp-admin/includes/class-wp-list-table.php
index 1ece746..2388d58 100644
--- wp-admin/includes/class-wp-list-table.php
+++ wp-admin/includes/class-wp-list-table.php
@@ -467,9 +467,10 @@ class WP_List_Table {
 	 * @since 3.1.0
 	 * @access protected
 	 */
-	function pagination( $which ) {
+	function pagination( $which, $echo = true ) {
+		global $current_screen;
 		if ( empty( $this->_pagination_args ) )
-			return;
+			return '';
 
 		extract( $this->_pagination_args );
 
@@ -477,7 +478,11 @@ class WP_List_Table {
 
 		$current = $this->get_pagenum();
 
-		$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+		if ( defined( 'DOING_AJAX' ) && DOING_AJAX ) {
+			$current_url = wp_get_referer();
+		} else {
+			$current_url = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+		}
 		
 		$current_url = remove_query_arg( array( 'hotkeys_highlight_last', 'hotkeys_highlight_first' ), $current_url );
 
@@ -536,7 +541,10 @@ class WP_List_Table {
 
 		$this->_pagination = "<div class='tablenav-pages{$page_class}'>$output</div>";
 
-		echo $this->_pagination;
+		if ( $echo )
+			echo $this->_pagination;
+		else
+			return $this->_pagination;
 	}
 
 	/**
diff --git wp-admin/js/edit-comments.dev.js wp-admin/js/edit-comments.dev.js
index 463c77e..7acae5a 100644
--- wp-admin/js/edit-comments.dev.js
+++ wp-admin/js/edit-comments.dev.js
@@ -4,9 +4,9 @@ var theList, theExtraList, toggleWithKeyboard = false;
 setCommentsList = function() {
 	var totalInput, perPageInput, pageInput, lastConfidentTime = 0, dimAfter, delBefore, updateTotalCount, delAfter;
 
-	totalInput = $('.tablenav input[name="_total"]', '#comments-form');
-	perPageInput = $('.tablenav input[name="_per_page"]', '#comments-form');
-	pageInput = $('.tablenav input[name="_page"]', '#comments-form');
+	totalInput = $('input[name="_total"]', '#comments-form');
+	perPageInput = $('input[name="_per_page"]', '#comments-form');
+	pageInput = $('input[name="_page"]', '#comments-form');
 
 	dimAfter = function( r, settings ) {
 		var c = $('#' + settings.element);
@@ -33,11 +33,13 @@ setCommentsList = function() {
 	// Send current total, page, per_page and url
 	delBefore = function( settings, list ) {
 		var cl = $(settings.target).attr('className'), id, el, n, h, a, author, action = false;
-
+		
 		settings.data._total = totalInput.val() || 0;
 		settings.data._per_page = perPageInput.val() || 0;
-		settings.data._page = pageInput.val() || 0;
+		settings.data._page = settings.data.paged = pageInput.val() || 0;
 		settings.data._url = document.location.href;
+		settings.data.comment_status = $('input[name=comment_status]', '#comments-form').val();
+		settings.data.s = $.query.get('s');
 
 		if ( cl.indexOf(':trash=1') != -1 )
 			action = 'trash';
@@ -85,17 +87,15 @@ setCommentsList = function() {
 	};
 
 	// Updates the current total (as displayed visibly)
-	updateTotalCount = function( total, time, setConfidentTime ) {
+	updateTotalCount = function( total, time, setConfidentTime, l10nTotal ) {
 		if ( time < lastConfidentTime )
 			return;
 
 		if ( setConfidentTime )
 			lastConfidentTime = time;
-
+		
 		totalInput.val( total.toString() );
-		$('span.total-type-count').each( function() {
-			updateCount( $(this), total );
-		});
+		$('span.displaying-num').text(l10nTotal);
 	};
 
 	function dashboardTotals(n) {
@@ -138,7 +138,7 @@ setCommentsList = function() {
 		el.html(n);
 	}
 
-	// In admin-ajax.php, we send back the unix time stamp instead of 1 on success
+	// In admin-ajax.php, we send back the unix time stamp as well as localized total items on success
 	delAfter = function( r, settings ) {
 		var total, pageLinks, N, untrash = $(settings.target).parent().is('span.untrash'), unspam = $(settings.target).parent().is('span.unspam'), spam, trash;
 
@@ -191,20 +191,25 @@ setCommentsList = function() {
 			if ( total < 0 )
 				total = 0;
 
-			if ( ( 'object' == typeof r ) && lastConfidentTime < settings.parsed.responses[0].supplemental.time ) {
-				pageLinks = settings.parsed.responses[0].supplemental.pageLinks || '';
-				if ( $.trim( pageLinks ) )
-					$('.tablenav-pages').find( '.page-numbers' ).remove().end().append( $( pageLinks ) );
-				else
-					$('.tablenav-pages').find( '.page-numbers' ).remove();
-
-				updateTotalCount( total, settings.parsed.responses[0].supplemental.time, true );
-			} else {
-				updateTotalCount( total, r, false );
+			if 	( ( 'object' == typeof r ) && lastConfidentTime < settings.parsed.responses[0].supplemental.time ) {
+				parsedResponse = settings.parsed.responses[0].supplemental;
+				pageLinks = parsedResponse.pageLinks;
+				if (typeof pageLinks !== 'undefined') {
+					if ( $.trim( pageLinks ) ) {
+						$('.top .tablenav-pages').html( pageLinks );
+						$('.bottom .tablenav-pages').html( parsedResponse.pageLinksBottom );
+
+						// redirect if there's a new last page
+						if (parsedResponse.total_pages < $.query.get('paged'))
+							window.location = $('.tablenav-pages a.last-page').attr('href');
+					} else {
+						$('.tablenav-pages').remove();
+					}
+				}
+				updateTotalCount( parsedResponse.total, parsedResponse.time, true, parsedResponse.l10nTotal ); 
 			}
 		}
-
-
+		
 		if ( ! theExtraList || theExtraList.size() == 0 || theExtraList.children().size() == 0 || untrash || unspam ) {
 			return;
 		}
@@ -217,7 +222,7 @@ setCommentsList = function() {
 	var refillTheExtraList = function(ev) {
 		// var args = $.query.get(), total_pages = listTable.get_total_pages(), per_page = $('input[name=_per_page]', '#comments-form').val(), r;
 		var args = $.query.get(), total_pages = $('.total-pages').text(), per_page = $('input[name=_per_page]', '#comments-form').val(), r;
-		
+
 		if (! args.paged)
 			args.paged = 1;
 		
