Index: wp-admin/includes/user.php
===================================================================
--- wp-admin/includes/user.php	(revision 17140)
+++ wp-admin/includes/user.php	(working copy)
@@ -380,4 +380,32 @@
 	echo '</p></div>';
 }
 
-?>
+/**
+ * Display a dropdown when deleting or removing a user from current site,
+ * allowing to reassign their posts and links to another user.
+ *
+ * @since 3.1.0
+ *
+ * @param array $user User object.
+ * @param array $selected_users IDs of users to delete or remove.
+ * @return null
+ */
+function _reassign_dropdown( $user, $selected_users ) {
+	static $counter = 0;
+	?>
+	<li><input type="hidden" name="users[]" value="<?php echo esc_attr( $user->ID ); ?>" /><?php printf( __('ID #%1s: %2s'), $user->ID, $user->user_login ); ?></li>
+	<fieldset><p><legend><?php printf( __( "What should be done with posts and links owned by <em>%s</em>?" ), $user->user_login ); ?></legend></p>
+	<ul style="list-style:none;">
+		<li><label><input type="radio" id="delete_option0" name="delete_option[<?php echo $user->ID; ?>]" value="delete" checked="checked" />
+		<?php _e( 'Delete all posts and links.' ); ?></label></li>
+		<li><label><input type="radio" id="delete_option1" name="delete_option[<?php echo $user->ID; ?>]" value="reassign" />
+		<?php echo __( 'Attribute all posts and links to:' ) . '</label>'; ?>
+		<?php wp_dropdown_users( array(
+			'exclude' => array_diff( $selected_users, array( $user->ID ) ),
+			'id' => "reassign{$counter}",
+			'name' => "reassign[{$user->ID}]" ) ); ?></li>
+	</ul></fieldset><?php
+	$counter++;
+}
+
+?>
\ No newline at end of file
Index: wp-admin/network/site-users.php
===================================================================
--- wp-admin/network/site-users.php	(revision 17140)
+++ wp-admin/network/site-users.php	(working copy)
@@ -55,6 +55,8 @@
 }
 $default_role = get_blog_option( $id, 'default_role' );
 
+$referer = remove_query_arg( array( 'action', 'remove_count' ), wp_get_referer() );
+
 $action = $wp_list_table->current_action();
 
 if ( $action ) {
@@ -100,26 +102,83 @@
 			}
 			break;
 		
-		case 'remove':
+		case 'doremove':
 			if ( !current_user_can('remove_users')  )
-				die(__('You can&#8217;t remove users.'));
-			check_admin_referer( 'bulk-users' );
-			
+				die( __('You can&#8217;t remove users.') );
+			check_admin_referer( 'remove-users' );
+
 			$update = 'remove';
 			if ( isset( $_REQUEST['users'] ) ) {
 				$userids = $_REQUEST['users'];
 
-				foreach ( $userids as $user_id ) {
+				$remove_count = 0;
+				foreach ( (array) $userids as $user_id ) {
 					$user_id = (int) $user_id;
-					remove_user_from_blog( $user_id, $id );
+					switch ( $_REQUEST['delete_option'][$user_id] ) {
+					case 'delete':
+						remove_user_from_blog( $user_id, $id );
+						break;
+					case 'reassign':
+						remove_user_from_blog( $user_id, $id, $_REQUEST['reassign'][$user_id] );
+						break;
+					}
+					++$remove_count;
 				}
-			} elseif ( isset( $_GET['user'] ) ) {
-				remove_user_from_blog( $_GET['user'] );
 			} else {
 				$update = 'err_remove';
 			}
+			$referer = add_query_arg( array( 'remove_count' => $remove_count, 'id' => $id ), $referer );
 			break;
 
+		case 'remove':
+			if ( !current_user_can('remove_users')  )
+				die( __('You can&#8217;t remove users.') );
+			check_admin_referer( 'bulk-users' );
+
+			if ( empty($_REQUEST['users']) )
+				$userids = array( intval($_REQUEST['user']) );
+			else
+				$userids = $_REQUEST['users'];
+
+			require_once( '../admin-header.php' );
+			?>
+			<form action="" method="post" name="updateusers" id="updateusers">
+			<input type="hidden" name="id" value="<?php echo esc_attr( $_REQUEST['id'] ); ?>" />
+			<?php wp_nonce_field('remove-users') ?>
+
+			<div class="wrap">
+			<?php screen_icon('users'); ?>
+			<h2><?php _e('Remove Users from Site'); ?></h2>
+			<p><?php _e('You have specified these users for removal:'); ?></p>
+			<ul>
+			<?php
+				$go_remove = false;
+			 	foreach ( $userids as $id ) {
+					$id = (int) $id;
+			 		$user = new WP_User($id);
+					if ( $id == $current_user->id && ! is_super_admin() ) {
+						echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login ) . "</li>\n";
+					} elseif ( ! current_user_can('remove_user', $id) ) {
+						echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
+					} else {
+						_reassign_dropdown( $user, $userids );
+						$go_remove = true;
+					}
+			 	}
+		 	?>
+			</ul>
+			<?php if ( $go_remove ) : ?>
+					<input type="hidden" name="action" value="doremove" />
+					<?php submit_button( __('Confirm Removal'), 'secondary' ); ?>
+			<?php else : ?>
+				<p><?php _e('There are no valid users selected for removal.'); ?></p>
+			<?php endif; ?>
+			</div>
+			</form><?php
+			require_once( '../admin-footer.php' );
+			exit();
+			break;
+
 		case 'promote':
 			check_admin_referer( 'bulk-users' );
 			$editable_roles = get_editable_roles();
@@ -146,7 +205,7 @@
 	}
 	
 	restore_current_blog();
-	wp_redirect( add_query_arg( 'update', $update, wp_get_referer() ) );
+	wp_redirect( add_query_arg( 'update', $update, $referer ) );
 	exit();
 }
 
@@ -199,7 +258,8 @@
 		echo '<div id="message" class="error"><p>' . __( 'Select a user to change role.' ) . '</p></div>';
 		break;
 	case 'remove':
-		echo '<div id="message" class="updated"><p>' . __( 'User removed from this site.' ) . '</p></div>';
+		$remove_count = isset($_GET['remove_count']) ? (int) $_GET['remove_count'] : 0;
+		echo '<div id="message" class="updated"><p>' . sprintf( _n( 'User removed from this site.', '%s users removed from this site.', $remove_count ), $remove_count ) . '</p></div>';
 		break;
 	case 'err_remove':
 		echo '<div id="message" class="error"><p>' . __( 'Select a user to remove.' ) . '</p></div>';
Index: wp-admin/users.php
===================================================================
--- wp-admin/users.php	(revision 17140)
+++ wp-admin/users.php	(working copy)
@@ -33,7 +33,7 @@
 if ( empty($_REQUEST) ) {
 	$referer = '<input type="hidden" name="wp_http_referer" value="'. esc_attr(stripslashes($_SERVER['REQUEST_URI'])) . '" />';
 } elseif ( isset($_REQUEST['wp_http_referer']) ) {
-	$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count'), stripslashes($_REQUEST['wp_http_referer']));
+	$redirect = remove_query_arg(array('wp_http_referer', 'updated', 'delete_count', 'remove_count'), stripslashes($_REQUEST['wp_http_referer']));
 	$referer = '<input type="hidden" name="wp_http_referer" value="' . esc_attr($redirect) . '" />';
 } else {
 	$redirect = 'users.php';
@@ -95,13 +95,13 @@
 	}
 
 	if ( ! current_user_can( 'delete_users' ) )
-		wp_die(__('You can&#8217;t delete users.'));
+		wp_die( __('You can&#8217;t delete users.') );
 
 	$userids = $_REQUEST['users'];
 	$update = 'del';
 	$delete_count = 0;
 
-	foreach ( (array) $userids as $id) {
+	foreach ( (array) $userids as $id ) {
 		$id = (int) $id;
 
 		if ( ! current_user_can( 'delete_user', $id ) )
@@ -111,20 +111,19 @@
 			$update = 'err_admin_del';
 			continue;
 		}
-		switch ( $_REQUEST['delete_option'] ) {
+
+		switch ( $_REQUEST['delete_option'][$id] ) {
 		case 'delete':
-			if ( current_user_can('delete_user', $id) )
-				wp_delete_user($id);
+			wp_delete_user($id);
 			break;
 		case 'reassign':
-			if ( current_user_can('delete_user', $id) )
-				wp_delete_user($id, $_REQUEST['reassign_user']);
+			wp_delete_user($id, $_REQUEST['reassign'][$id]);
 			break;
 		}
 		++$delete_count;
 	}
 
-	$redirect = add_query_arg( array('delete_count' => $delete_count, 'update' => $update), $redirect);
+	$redirect = add_query_arg( array( 'delete_count' => $delete_count, 'update' => $update ), $redirect );
 	wp_redirect($redirect);
 	exit();
 
@@ -145,7 +144,7 @@
 		$errors = new WP_Error( 'edit_users', __( 'You can&#8217;t delete users.' ) );
 
 	if ( empty($_REQUEST['users']) )
-		$userids = array(intval($_REQUEST['user']));
+		$userids = array( intval($_REQUEST['user']) );
 	else
 		$userids = $_REQUEST['users'];
 
@@ -166,23 +165,17 @@
 		$id = (int) $id;
 		$user = new WP_User($id);
 		if ( $id == $current_user->ID ) {
-			echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login) . "</li>\n";
+			echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be deleted.</strong>'), $id, $user->user_login ) . "</li>\n";
+		} elseif ( ! current_user_can('delete_user', $id) ) {
+			echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
 		} else {
-			echo "<li><input type=\"hidden\" name=\"users[]\" value=\"" . esc_attr($id) . "\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
+			_reassign_dropdown( $user, $userids );
 			$go_delete = true;
 		}
 	}
 	?>
 	</ul>
 <?php if ( $go_delete ) : ?>
-	<fieldset><p><legend><?php _e('What should be done with posts and links owned by this user?'); ?></legend></p>
-	<ul style="list-style:none;">
-		<li><label><input type="radio" id="delete_option0" name="delete_option" value="delete" checked="checked" />
-		<?php _e('Delete all posts and links.'); ?></label></li>
-		<li><input type="radio" id="delete_option1" name="delete_option" value="reassign" />
-		<?php echo '<label for="delete_option1">'.__('Attribute all posts and links to:').'</label>';
-		wp_dropdown_users( array( 'exclude' => array_diff( $userids, array($current_user->ID) ) ) ); ?></li>
-	</ul></fieldset>
 	<input type="hidden" name="action" value="dodelete" />
 	<?php submit_button( __('Confirm Deletion'), 'secondary' ); ?>
 <?php else : ?>
@@ -202,26 +195,38 @@
 		exit;
 	}
 
-	if ( !current_user_can('remove_users')  )
-		die(__('You can&#8217;t remove users.'));
+	if ( ! current_user_can('remove_users') )
+		die( __('You can&#8217;t remove users.') );
 
 	$userids = $_REQUEST['users'];
+	$update = 'remove';
+	$remove_count = 0;
 
-	$update = 'remove';
- 	foreach ( $userids as $id ) {
+ 	foreach ( (array) $userids as $id ) {
 		$id = (int) $id;
-		if ( $id == $current_user->id && !is_super_admin() ) {
-			$update = 'err_admin_remove';
+
+		if ( ! current_user_can('remove_user', $id) ) {
+			wp_die( __('You can&#8217;t remove that user.') );
 			continue;
 		}
-		if ( !current_user_can('remove_user', $id) ) {
+
+		if ( $id == $current_user->id && !is_super_admin() ) {
 			$update = 'err_admin_remove';
 			continue;
 		}
-		remove_user_from_blog($id, $blog_id);
+
+		switch ( $_REQUEST['delete_option'][$id] ) {
+		case 'delete':
+			remove_user_from_blog( $id, $blog_id );
+			break;
+		case 'reassign':
+			remove_user_from_blog( $id, $blog_id, $_REQUEST['reassign'][$id] );
+			break;
+		}
+		++$remove_count;
 	}
 
-	$redirect = add_query_arg( array('update' => $update), $redirect);
+	$redirect = add_query_arg( array( 'remove_count' => $remove_count, 'update' => $update ), $redirect );
 	wp_redirect($redirect);
 	exit;
 
@@ -236,11 +241,11 @@
 		exit();
 	}
 
-	if ( !current_user_can('remove_users') )
-		$error = new WP_Error('edit_users', __('You can&#8217;t remove users.'));
+	if ( !current_user_can( 'remove_users' ) )
+		$error = new WP_Error( 'edit_users', __('You can&#8217;t remove users.') );
 
 	if ( empty($_REQUEST['users']) )
-		$userids = array(intval($_REQUEST['user']));
+		$userids = array( intval($_REQUEST['user']) );
 	else
 		$userids = $_REQUEST['users'];
 
@@ -260,12 +265,12 @@
  	foreach ( $userids as $id ) {
 		$id = (int) $id;
  		$user = new WP_User($id);
-		if ( $id == $current_user->id && !is_super_admin() ) {
-			echo "<li>" . sprintf(__('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login) . "</li>\n";
-		} elseif ( !current_user_can('remove_user', $id) ) {
-			echo "<li>" . sprintf(__('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login) . "</li>\n";
+		if ( $id == $current_user->id && ! is_super_admin() ) {
+			echo "<li>" . sprintf( __('ID #%1s: %2s <strong>The current user will not be removed.</strong>'), $id, $user->user_login ) . "</li>\n";
+		} elseif ( ! current_user_can('remove_user', $id) ) {
+			echo "<li>" . sprintf( __('ID #%1s: %2s <strong>You don\'t have permission to remove this user.</strong>'), $id, $user->user_login ) . "</li>\n";
 		} else {
-			echo "<li><input type=\"hidden\" name=\"users[]\" value=\"{$id}\" />" . sprintf(__('ID #%1s: %2s'), $id, $user->user_login) . "</li>\n";
+			_reassign_dropdown( $user, $userids );
 			$go_remove = true;
 		}
  	}
@@ -299,7 +304,7 @@
 		case 'del':
 		case 'del_many':
 			$delete_count = isset($_GET['delete_count']) ? (int) $_GET['delete_count'] : 0;
-			$messages[] = '<div id="message" class="updated"><p>' . sprintf(_n('%s user deleted', '%s users deleted', $delete_count), $delete_count) . '</p></div>';
+			$messages[] = '<div id="message" class="updated"><p>' . sprintf( _n('%s user deleted', '%s users deleted', $delete_count), $delete_count ) . '</p></div>';
 			break;
 		case 'add':
 			$messages[] = '<div id="message" class="updated"><p>' . __('New user created.') . '</p></div>';
@@ -316,7 +321,8 @@
 			$messages[] = '<div id="message" class="updated"><p>' . __('Other users have been deleted.') . '</p></div>';
 			break;
 		case 'remove':
-			$messages[] = '<div id="message" class="updated fade"><p>' . __('User removed from this site.') . '</p></div>';
+			$remove_count = isset($_GET['remove_count']) ? (int) $_GET['remove_count'] : 0;
+			$messages[] = '<div id="message" class="updated fade"><p>' . sprintf( _n('User removed from this site.', '%s users removed from this site.', $remove_count), $remove_count ) . '</p></div>';
 			break;
 		case 'err_admin_remove':
 			$messages[] = '<div id="message" class="error"><p>' . __("You can't remove the current user.") . '</p></div>';
