diff --git wp-admin/upload.php wp-admin/upload.php
index d172327..5e5a185 100644
--- wp-admin/upload.php
+++ wp-admin/upload.php
@@ -36,6 +36,11 @@ if ( $doaction ) {
 			$location = remove_query_arg( array( 'trashed', 'untrashed', 'deleted', 'message', 'ids', 'posted' ), $referer );
 	}
 
+	$errors = array();
+
+	// Escape item titles displayed in error messages.
+	add_filter( 'the_title', 'esc_html' );
+
 	switch ( $doaction ) {
 		case 'find_detached':
 			if ( !current_user_can('edit_posts') )
@@ -94,11 +99,19 @@ if ( $doaction ) {
 				break;
 			foreach ( (array) $post_ids as $post_id ) {
 				if ( !current_user_can( 'delete_post', $post_id ) )
-					wp_die( __( 'You are not allowed to move this post to the trash.' ) );
+					$errors[] = sprintf( __( 'You are not allowed to move "%s" to the trash.' ), get_the_title( $post_id ) );
 
 				if ( !wp_trash_post( $post_id ) )
-					wp_die( __( 'Error in moving to trash...' ) );
+					$errors[] = sprintf( __( 'There was a problem moving "%s" to the trash.' ), get_the_title( $post_id ) );
+			}
+
+			if( ! empty( $errors ) ) {
+				$wp_err = new WP_Error();
+				foreach( $errors as $err )
+					$wp_err->add( 'bulk_media_trash_error', $err );
+				wp_die( $wp_err );
 			}
+
 			$location = add_query_arg( array( 'trashed' => count( $post_ids ), 'ids' => join( ',', $post_ids ) ), $location );
 			break;
 		case 'untrash':
@@ -106,23 +119,42 @@ if ( $doaction ) {
 				break;
 			foreach ( (array) $post_ids as $post_id ) {
 				if ( !current_user_can( 'delete_post', $post_id ) )
-					wp_die( __( 'You are not allowed to move this post out of the trash.' ) );
+					$errors[] = sprintf( __( 'You are not allowed to move "%s" out of the trash.' ), get_the_title( $post_id ) );
 
 				if ( !wp_untrash_post( $post_id ) )
-					wp_die( __( 'Error in restoring from trash...' ) );
+					$errors[] = sprintf( __( 'There was a problem restoring "%s" from the trash.' ), get_the_title( $post_id ) );
+			}
+
+			if( ! empty( $errors ) ) {
+				$wp_err = new WP_Error();
+				foreach( $errors as $err )
+					$wp_err->add( 'bulk_media_untrash_error', $err );
+				wp_die( $wp_err );
 			}
+
 			$location = add_query_arg( 'untrashed', count( $post_ids ), $location );
 			break;
 		case 'delete':
 			if ( !isset( $post_ids ) )
 				break;
 			foreach ( (array) $post_ids as $post_id_del ) {
+				if( !get_post( $post_id_del ) )
+					continue;
+
 				if ( !current_user_can( 'delete_post', $post_id_del ) )
-					wp_die( __( 'You are not allowed to delete this post.' ) );
+					$errors[] = sprintf( __( 'You are not allowed to delete "%s".' ), get_the_title( $post_id_del ) );
 
 				if ( !wp_delete_attachment( $post_id_del ) )
-					wp_die( __( 'Error in deleting...' ) );
+					$errors[] = sprintf( __( 'There was a problem deleting "%s".' ), get_the_title( $post_id_del ) );
 			}
+
+			if( ! empty( $errors ) ) {
+				$wp_err = new WP_Error();
+				foreach( $errors as $err )
+					$wp_err->add( 'bulk_media_delete_error', $err );
+				wp_die( $wp_err );
+			}
+
 			$location = add_query_arg( 'deleted', count( $post_ids ), $location );
 			break;
 	}
