diff --git wp-admin/admin-ajax.php wp-admin/admin-ajax.php
index 5eb33e1..a2048dc 100644
--- wp-admin/admin-ajax.php
+++ wp-admin/admin-ajax.php
@@ -319,6 +319,38 @@ function _wp_ajax_add_hierarchical_term() {
 
 $id = isset($_POST['id'])? (int) $_POST['id'] : 0;
 switch ( $action = $_POST['action'] ) :
+case 'delete-post-list-item' : 
+	$post = get_post( $id );
+	if ( ! $post ) {
+		die( (string) time() );
+	}
+	
+	if ( ! current_user_can( 'delete_post', $post->ID ) ) {
+		die( '-1' );
+	}
+	
+	$post_type = $_POST['post_type'];
+	
+	if ( ! empty( $_POST['trash'] ) ) {
+		check_ajax_referer( "trash-{$post_type}_{$post->ID}" );
+		$status = get_post_status( $post->ID );
+		if ( $status != 'trash' && ! wp_trash_post( $post->ID ) ) {
+			die( '0' );
+		}
+	} elseif ( ! empty( $_POST['delete'] ) ) {
+		check_ajax_referer( "delete-{$post_type}_{$post->ID}" );
+		if ( ! wp_delete_post( $post->ID ) ) {
+			die( '0' );
+		}
+	} elseif ( ! empty( $_POST['untrash'] ) ) {
+		if ( ! wp_untrash_post( $post->ID ) ) {
+			die( '0' );
+		}
+	} else {
+		die( '-1' );
+	}
+	die( (string) time() );
+	break;
 case 'delete-comment' : // On success, die with time() instead of 1
 	if ( !$comment = get_comment( $id ) )
 		die( (string) time() );
diff --git wp-admin/edit.php wp-admin/edit.php
index 5e0154f..fb1620a 100644
--- wp-admin/edit.php
+++ wp-admin/edit.php
@@ -261,4 +261,5 @@ if ( $wp_list_table->has_items() )
 </div>
 
 <?php
+wp_post_trashnotice();
 include('./admin-footer.php');
diff --git wp-admin/includes/class-wp-posts-list-table.php wp-admin/includes/class-wp-posts-list-table.php
index 801fb96..2d8a1bf 100644
--- wp-admin/includes/class-wp-posts-list-table.php
+++ wp-admin/includes/class-wp-posts-list-table.php
@@ -75,6 +75,7 @@ class WP_Posts_List_Table extends WP_List_Table {
 
 		parent::WP_List_Table( array(
 			'plural' => 'posts',
+			'singular' => 'post-list-item',
 		) );
 	}
 
@@ -162,7 +163,7 @@ class WP_Posts_List_Table extends WP_List_Table {
 			if ( !in_array( $status_name, $avail_post_stati ) )
 				continue;
 
-			if ( empty( $num_posts->$status_name ) )
+			if ( $status_name != 'trash' && empty( $num_posts->$status_name ) )
 				continue;
 
 			if ( isset($_REQUEST['post_status']) && $status_name == $_REQUEST['post_status'] )
@@ -544,11 +545,11 @@ class WP_Posts_List_Table extends WP_List_Table {
 				}
 				if ( current_user_can( $post_type_object->cap->delete_post, $post->ID ) ) {
 					if ( 'trash' == $post->post_status )
-						$actions['untrash'] = "<a title='" . esc_attr( __( 'Restore this item from the Trash' ) ) . "' href='" . wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-' . $post->post_type . '_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";
+						$actions['untrash'] = "<a class='delete:the-list:post-" . get_the_ID() . "::untrash=1' title='" . esc_attr( __( 'Restore this item from the Trash' ) ) . "' href='" . wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-' . $post->post_type . '_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";
 					elseif ( EMPTY_TRASH_DAYS )
-						$actions['trash'] = "<a class='submitdelete' title='" . esc_attr( __( 'Move this item to the Trash' ) ) . "' href='" . get_delete_post_link( $post->ID ) . "'>" . __( 'Trash' ) . "</a>";
+						$actions['trash'] = "<a class='delete:the-list:post-" . get_the_ID() . "::trash=1 submitdelete' title='" . esc_attr( __( 'Move this item to the Trash' ) ) . "' href='" . get_delete_post_link( $post->ID ) . "'>" . __( 'Trash' ) . "</a>";
 					if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS )
-						$actions['delete'] = "<a class='submitdelete' title='" . esc_attr( __( 'Delete this item permanently' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>";
+						$actions['delete'] = "<a class='delete:the-list:post-" . get_the_ID() . "::delete=1 submitdelete' title='" . esc_attr( __( 'Delete this item permanently' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>";
 				}
 				if ( in_array( $post->post_status, array( 'pending', 'draft' ) ) ) {
 					if ( $can_edit_post )
diff --git wp-admin/includes/template.php wp-admin/includes/template.php
index 8a1e995..a3f05c3 100644
--- wp-admin/includes/template.php
+++ wp-admin/includes/template.php
@@ -288,6 +288,10 @@ function get_inline_data($post) {
 	<div class="ss">' . mysql2date( 's', $post->post_date, false ) . '</div>
 	<div class="post_password">' . esc_html( $post->post_password ) . '</div>';
 
+	if ( $post->post_status = 'trash' ) {
+		echo '<div class="_wp_trash_meta_status">' . get_post_meta( $post->ID, '_wp_trash_meta_status', true ) . '</div>';
+	}
+
 	if ( $post_type_object->hierarchical )
 		echo '<div class="post_parent">' . $post->post_parent . '</div>';
 
@@ -408,6 +412,19 @@ function wp_comment_trashnotice() {
 }
 
 /**
+ * Output 'undo move to trash' text for posts
+ *
+ * @since 3.2.0
+ */
+function wp_post_trashnotice() {
+?>
+<div class="hidden" id="trash-undo-holder">
+	<div class="trash-undo-inside"><?php printf(__('%s moved to the trash.'), '<strong></strong>'); ?> <span class="undo untrash"><a href="#"><?php _e('Undo'); ?></a></span></div>
+</div>
+<?php
+}
+
+/**
  * {@internal Missing Short Description}}
  *
  * @since 1.2.0
diff --git wp-admin/js/inline-edit-post.dev.js wp-admin/js/inline-edit-post.dev.js
index 1a257c6..fecfbfb 100644
--- wp-admin/js/inline-edit-post.dev.js
+++ wp-admin/js/inline-edit-post.dev.js
@@ -1,4 +1,99 @@
 (function($) {
+var inlineEditPost, postList;
+
+postList = {
+	theList : {},
+	postType : userSettings.typenow,
+	init : function() {
+		var t = this;
+		t.theList = $('#the-list').wpList({
+			alt : '',
+			delBefore : t.delBefore,
+			delAfter : t.delAfter,
+			addColor : 'none'
+		}).bind('wpListDelEnd', function(e, s){
+			var id = s.element.replace(/[^0-9]+/g, '');
+			if (s.target.className.indexOf(':trash=1') != -1)
+				$('#undo-' + id).fadeIn(300, function(){});
+		});
+	},
+	delBefore : function(settings, list) {
+		var cl = $(settings.target).attr('class'), el, colspan, undoRow, title, id;
+		settings.data.post_type = typenow;
+		if (cl.indexOf(':trash=1') != -1) {
+			id = cl.replace(/.*?post-([0-9]+).*/, '$1');
+			el = $('#post-' + id);
+			el.find('.check-column :checkbox').attr('checked', ''); // Uncheck the row so as not to be affected by Bulk Edits.
+			note = $('#trash-undo-holder').html();
+			colspan = el.children(':visible').length;
+			title = el.find('.post_title').text();
+			undoRow = $('<tr id="undo-' + id + '" class="undo untrash" style="display:none;"><td colspan="' + colspan + '">' + note + '</td></tr>').
+				insertBefore(el).
+				find('strong').
+					text(title).end().
+				find('.undo a').
+					attr('href', 'post.php?action=untrash&c=' + id + '&_wpnonce=' + settings.data._ajax_nonce).
+					attr('class', 'delete:the-list:post-' + id + '::untrash=1').
+					click(function(){
+						list.wpList.del(this);
+						$('#undo-' + id).css('backgroundColor', '#ceb').fadeOut(350, function(){
+							$(this).remove();
+							$('#post-' + id).css('backgroundColor', '').fadeIn(300, function(){});
+						});
+						return false;
+					});
+		}
+		
+		return settings;
+	},
+	updateCount : function(counts) {
+		var index, el, count, url;
+		
+		for (index in counts) {
+			el = $('.subsubsub .' + index + ' .count');
+			count = el.text().replace(/[^0-9]+/g, '') * 1;
+			count += counts[index];
+			el.text('(' + count + ')');
+		}
+	},
+	delAfter : function(r, settings) {
+		var counts = {},
+			action = $(settings.target).parent(),
+			id = $(settings.target).attr('class').replace(/.*?post-([0-9]+).*/, '$1'),
+			tr = $('#post-' + id),			
+			status = tr.find('._status').text(),
+			sticky = tr.find('.sticky').text();
+	
+		if (action.is('span.trash')) {
+			counts['all'] = -1;
+			counts['trash'] = 1;
+			counts[status] = -1;
+			if (sticky) {
+				counts['sticky'] = -1;
+			}
+		} else if (action.is('span.untrash')) {
+			counts['all'] = 1;
+			counts['trash'] = -1;
+			
+			status = tr.find('._wp_trash_meta_status').text();
+			
+			if (status != 'trash') {
+				counts[status] = 1;
+			}
+			
+			if (sticky) {
+				counts['sticky'] = 1;
+			}
+		} else if (action.is('span.delete')) {
+			counts['trash'] = -1;
+		}
+		
+		postList.updateCount(counts);
+		
+		return true;
+	}
+};
+
 inlineEditPost = {
 
 	init : function(){
@@ -282,5 +377,5 @@ inlineEditPost = {
 	}
 };
 
-$(document).ready(function(){inlineEditPost.init();});
+$(document).ready(function(){inlineEditPost.init(); postList.init();});
 })(jQuery);
diff --git wp-includes/script-loader.php wp-includes/script-loader.php
index 1d72dd5..d048167 100644
--- wp-includes/script-loader.php
+++ wp-includes/script-loader.php
@@ -387,7 +387,7 @@ function wp_default_scripts( &$scripts ) {
 		$scripts->add( 'theme-preview', "/wp-admin/js/theme-preview$suffix.js", array( 'thickbox', 'jquery' ), '20100407' );
 		$scripts->add_data( 'theme-preview', 'group', 1 );
 
-		$scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'suggest' ), '20100707' );
+		$scripts->add( 'inline-edit-post', "/wp-admin/js/inline-edit-post$suffix.js", array( 'jquery', 'suggest', 'wp-lists' ), '20100707' );
 		$scripts->add_data( 'inline-edit-post', 'group', 1 );
 		$scripts->localize( 'inline-edit-post', 'inlineEditL10n', array(
 			'error' => __('Error while saving the changes.'),
