diff --git wp-admin/includes/class-wp-ms-users-list-table.php wp-admin/includes/class-wp-ms-users-list-table.php
index c3bfec2..bd502ed 100644
--- wp-admin/includes/class-wp-ms-users-list-table.php
+++ wp-admin/includes/class-wp-ms-users-list-table.php
@@ -56,8 +56,10 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 
 		$mode = empty( $_REQUEST['mode'] ) ? 'list' : $_REQUEST['mode'];
 
-		// Query the user IDs for this page
-		$wp_user_search = new WP_User_Query( $args );
+		if ( $role == 'pending' )
+			$wp_user_search = new WP_Pending_User_Query( $args ); // Query for pending users
+		else
+			$wp_user_search = new WP_User_Query( $args ); // Query the user IDs for this page
 
 		$this->items = $wp_user_search->get_results();
 
@@ -68,11 +70,21 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 	}
 
 	function get_bulk_actions() {
+		global $role;
+		
 		$actions = array();
-		if ( current_user_can( 'delete_users' ) )
-			$actions['delete'] = __( 'Delete' );
-		$actions['spam'] = _x( 'Mark as Spam', 'user' );
-		$actions['notspam'] = _x( 'Not Spam', 'user' );
+		
+		if ( $role == 'pending' ) {
+			if ( current_user_can( 'delete_users' ) )
+				$actions['deletesignup'] = __( 'Delete' );
+			$actions['activate'] = _x( 'Activate', 'user' );
+			$actions['resend'] = __( 'Resend Email' );
+		} else {
+			if ( current_user_can( 'delete_users' ) )
+				$actions['delete'] = __( 'Delete' );
+			$actions['spam'] = _x( 'Mark as Spam', 'user' );
+			$actions['notspam'] = _x( 'Not Spam', 'user' );
+		}
 
 		return $actions;
 	}
@@ -87,13 +99,15 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 		$total_users = get_user_count();
 		$super_admins = get_super_admins();
 		$total_admins = count( $super_admins );
+		$total_pendings = get_pending_user_count();
 
-		$current_role = false;
-		$class = $role != 'super' ? ' class="current"' : '';
+		$class = in_array( $role, array( 'super', 'pending' ) ) ? '' : ' class="current"';
 		$role_links = array();
 		$role_links['all'] = "<a href='" . network_admin_url('users.php') . "'$class>" . sprintf( _nx( 'All <span class="count">(%s)</span>', 'All <span class="count">(%s)</span>', $total_users, 'users' ), number_format_i18n( $total_users ) ) . '</a>';
 		$class = $role == 'super' ? ' class="current"' : '';
 		$role_links['super'] = "<a href='" . network_admin_url('users.php?role=super') . "'$class>" . sprintf( _n( 'Super Admin <span class="count">(%s)</span>', 'Super Admins <span class="count">(%s)</span>', $total_admins ), number_format_i18n( $total_admins ) ) . '</a>';
+		$class = $role == 'pending' ? ' class="current"' : '';
+		$role_links['pending'] = "<a href='" . network_admin_url('users.php?role=pending') . "'$class>" . sprintf( _n( 'Pending Confirmation <span class="count">(%s)</span>', 'Pending Confirmation <span class="count">(%s)</span>', $total_pendings ), number_format_i18n( $total_pendings ) ) . '</a>';
 
 		return $role_links;
 	}
@@ -108,30 +122,43 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 	}
 
 	function get_columns() {
+		global $role;
+		
 		$users_columns = array(
 			'cb'         => '<input type="checkbox" />',
 			'username'   => __( 'Username' ),
-			'name'       => __( 'Name' ),
 			'email'      => __( 'E-mail' ),
 			'registered' => _x( 'Registered', 'user' ),
-			'blogs'      => __( 'Sites' )
 		);
+		
+		if ( $role != 'pending' ) {
+			$users_columns['name'] = __( 'Name' );
+			$users_columns['blogs'] = __( 'Sites' );
+		}
+		
 		$users_columns = apply_filters( 'wpmu_users_columns', $users_columns );
 
 		return $users_columns;
 	}
 
 	function get_sortable_columns() {
-		return array(
+		global $role;
+		
+		$sortables = array(
 			'username'   => 'login',
-			'name'       => 'name',
 			'email'      => 'email',
 			'registered' => 'id',
 		);
+		
+		if ( $role != 'pending' ) {
+			$sortables['name'] = 'name';
+		}
+		
+		return $sortables;
 	}
 
 	function display_rows() {
-		global $current_site, $mode;
+		global $current_site, $mode, $role;
 
 		$alt = '';
 		$super_admins = get_super_admins();
@@ -140,9 +167,14 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 
 			$status_list = array( 'spam' => 'site-spammed', 'deleted' => 'site-deleted' );
 
-			foreach ( $status_list as $status => $col ) {
-				if ( $user->$status )
-					$alt .= " $col";
+			if ( $role == 'pending' ) {				
+				$user->ID = $user->user_login;
+				$user->user_registered = $user->registered;
+			} else {
+				foreach ( $status_list as $status => $col ) {
+					if ( $user->$status )
+						$alt .= " $col";
+				}
 			}
 
 			?>
@@ -171,24 +203,44 @@ class WP_MS_Users_List_Table extends WP_List_Table {
 
 					case 'username':
 						$avatar	= get_avatar( $user->user_email, 32 );
-						if ( get_current_user_id() == $user->ID ) {
-							$edit_link = esc_url( network_admin_url( 'profile.php' ) );
+						if ( $role == 'pending' ) {
+							$activate_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'activatesignup' ) . '&amp;action=activatesignup&amp;user_login=' . $user->user_login ) ) );
+							$resend_link = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'resendsignup' ) . '&amp;action=resendsignup&amp;user_login=' . $user->user_login ) ) );
 						} else {
-							$edit_link = esc_url( network_admin_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), 'user-edit.php?user_id=' . $user->ID ) ) );
+							if ( get_current_user_id() == $user->ID ) {
+								$edit_link = esc_url( network_admin_url( 'profile.php' ) );
+							} else {
+								$edit_link = esc_url( network_admin_url( add_query_arg( 'wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), 'user-edit.php?user_id=' . $user->ID ) ) );
+							}
 						}
 
 						echo "<td $attributes>"; ?>
-							<?php echo $avatar; ?><strong><a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a><?php
+							<?php echo $avatar; ?><strong>
+								<?php if ( $role == 'pending' ): ?>
+									<?php echo stripslashes( $user->user_login ); ?>
+								<?php else: ?>
+									<a href="<?php echo $edit_link; ?>" class="edit"><?php echo stripslashes( $user->user_login ); ?></a>	
+								<?php endif ?>
+								<?php
 							if ( in_array( $user->user_login, $super_admins ) )
 								echo ' - ' . __( 'Super Admin' );
 							?></strong>
 							<br/>
 							<?php
 								$actions = array();
-								$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
+								if ( $role == 'pending' ) {
+									$actions['activate'] = '<a href="' . $activate_link . '">' . __( 'Activate' ) . '</a>';
+									$actions['resend'] = '<a href="' . $resend_link . '">' . __( 'Resend Email' ) . '</a>';
+								} else {
+									$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
+								}
 
 								if ( current_user_can( 'delete_user', $user->ID) && ! in_array( $user->user_login, $super_admins ) ) {
-									$actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
+									if ( $role == 'pending' ) {
+										$actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deletesignup' ) . '&amp;action=deletesignup&amp;user_login=' . $user->user_login ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
+									} else {
+										$actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( stripslashes( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'edit.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
+									}
 								}
 
 								echo $this->row_actions( $actions );
diff --git wp-admin/network/edit.php wp-admin/network/edit.php
index e785d38..5cadac7 100644
--- wp-admin/network/edit.php
+++ wp-admin/network/edit.php
@@ -18,6 +18,54 @@ if ( empty( $_GET['action'] ) ) {
 	exit;
 }
 
+function _wp_activate_by_user_login( $user_login ) {
+	global $wpdb;
+	
+	$key = $wpdb->get_var( $wpdb->prepare( "SELECT activation_key FROM {$wpdb->signups} WHERE active != 1 AND user_login = %s", $user_login ) );
+	if ( $key ) {
+		wpmu_activate_signup( $key );
+	}
+}
+
+function _wp_resend_by_user_login( $user_login ) {
+	global $wpdb;
+	
+	$user = $wpdb->get_row( $wpdb->prepare( "SELECT * FROM {$wpdb->signups} WHERE active !=1 AND user_login = %s", $user_login ) );
+	
+	if ( $user ) {
+		wpmu_signup_user_notification($user->user_login, $user->user_email, $user->activation_key, $user->meta);
+	}
+}
+
+function confirm_delete_signups( $signups ) {
+	global $wpdb;
+	
+	$current_user = wp_get_current_user();
+	if ( ! is_array( $signups ) ) {
+		return false;
+	}
+	
+	screen_icon();
+	?>
+	<h2><?php esc_html_e( 'Users' ); ?></h2>
+	<p><?php _e( 'Are you sure you want to delete the following users?' ); ?></p>
+	<form action="edit.php?action=dodeletesignup" method="post">
+	<input type="hidden" name="dodeletesignup" />
+	<?php
+	wp_nonce_field( 'ms-signups-delete' );
+	echo '<ul>';
+	foreach ( $signups as $delete_signup ) {
+		echo "<li><input type='hidden' name='user[]' value='{$delete_signup}'/>{$delete_signup}</li>\n";
+	}
+	echo '</ul>';
+
+	submit_button( __('Confirm Deletion'), 'delete' );
+	?>
+	</form>
+    <?php
+	return true;
+}
+
 function confirm_delete_users( $users ) {
 	$current_user = wp_get_current_user();
 	if ( !is_array( $users ) )
@@ -421,6 +469,30 @@ switch ( $_GET['action'] ) {
 
 							update_user_status( $val, 'spam', '0', 1 );
 						break;
+						
+						case 'activate':
+							$userfunction = 'all_activate';
+							_wp_activate_by_user_login( $val );
+						break;
+						
+						case 'resend':
+							$userfunction = 'all_resend';
+							_wp_resend_by_user_login( $val );
+						break;
+						
+						case 'deletesignup':
+							if ( ! current_user_can( 'delete_users' ) )
+								wp_die( __( 'You do not have permission to access this page.' ) );
+								
+							$title = __( 'Users' );
+							$parent_file = 'users.php';
+							require_once( '../admin-header.php' );
+							echo '<div class="wrap">';
+							confirm_delete_signups( $_POST['allusers'] );
+							echo '</div>';
+				            require_once( '../admin-footer.php' );
+				            exit();
+						break;
 					}
 				}
 			}
@@ -467,6 +539,71 @@ switch ( $_GET['action'] ) {
 		wp_redirect( add_query_arg( array( 'updated' => 'true', 'action' => $deletefunction ), network_admin_url( 'users.php' ) ) );
 		exit();
 	break;
+	
+	case 'activatesignup':
+		if ( ! current_user_can( 'manage_network_users' ) )
+			wp_die( __( 'You do not have permission to access this page.' ) );
+
+		check_admin_referer( 'activatesignup' );
+		
+		_wp_activate_by_user_login( $_GET['user_login'] );
+		
+		wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'activate' ), network_admin_url( 'users.php' ) ) );
+		exit();
+	break;
+	
+	case 'resendsignup':
+		if ( ! current_user_can( 'manage_network_users' ) )
+			wp_die( __( 'You do not have permission to access this page.' ) );
+
+		check_admin_referer( 'resendsignup' );
+		
+		_wp_resend_by_user_login( $_GET['user_login'] );
+	
+		wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => 'resend' ), network_admin_url( 'users.php' ) ) );
+		exit();
+	break;
+	
+	case 'deletesignup':
+		if ( ! current_user_can( 'manage_network_users' ) )
+			wp_die( __( 'You do not have permission to access this page.' ) );
+
+		check_admin_referer( 'deletesignup' );
+		
+		if ( ! empty( $_GET['user_login'] ) ) {
+			$title = __( 'Users' );
+			$parent_file = 'users.php';
+			require_once( '../admin-header.php' );
+			echo '<div class="wrap">';
+			confirm_delete_signups( array( $_GET['user_login'] ) );
+			echo '</div>';
+            require_once( '../admin-footer.php' );
+  		} else {
+			wp_redirect( add_query_arg( array( 'role' => 'pending' ), network_admin_url( 'users.php' ) ) );
+		}
+		exit();
+	break;
+	
+	case 'dodeletesignup':
+		if ( ! ( current_user_can( 'manage_network_users' ) && current_user_can( 'delete_users' ) ) )
+			wp_die( __( 'You do not have permission to access this page.' ) );
+
+		check_admin_referer( 'ms-signups-delete' );
+		
+		if ( ! empty( $_POST['user'] ) ) {
+			array_walk( $_POST['user'], array( &$wpdb, 'escape_by_ref' ) );
+			$wpdb->query( "DELETE FROM {$wpdb->signups} WHERE active != 1 AND user_login IN ('" . implode( "','", $_POST['user'] ) . "')" );
+		}
+
+		if ( count( $_POST['user'] ) > 1 ) {
+			$delete_action = 'all_delete';
+		} else {
+			$delete_action = 'delete';
+		}
+
+		wp_redirect( add_query_arg( array( 'role' => 'pending', 'updated' => 'true', 'action' => $delete_action ), network_admin_url( 'users.php' ) ) );
+		exit();
+	break;
 
 	default:
 		// Let plugins use us as a post handler easily
diff --git wp-admin/network/users.php wp-admin/network/users.php
index 15853dd..87eb130 100644
--- wp-admin/network/users.php
+++ wp-admin/network/users.php
@@ -58,6 +58,18 @@ if ( isset( $_REQUEST['updated'] ) && $_REQUEST['updated'] == 'true' && ! empty(
 			case 'add':
 				_e( 'User added.' );
 			break;
+			case 'activate':
+				_e( 'User activated.' );
+			break;
+			case 'resend':
+				_e( 'Activation instruction resent to user.');
+			break;
+			case 'all_activate':
+				_e( 'Users activated.' );
+			break;
+			case 'all_resend':
+				_e( 'Activation instruction resent to users.');
+			break;
 		}
 		?>
 	</p></div>
diff --git wp-includes/ms-functions.php wp-includes/ms-functions.php
index b3b21df..5622a56 100644
--- wp-includes/ms-functions.php
+++ wp-includes/ms-functions.php
@@ -156,6 +156,19 @@ function get_user_count() {
 }
 
 /**
+ * The number of pending users in your installation.
+ *
+ * The count is cached and updated twice daily. This is not a live count.
+ *
+ * @since 3.2
+ *
+ * @return int
+ */
+function get_pending_user_count() {
+	return get_site_option( 'pending_user_count' );
+}
+
+/**
  * The number of active sites on your installation.
  *
  * The count is cached and updated twice daily. This is not a live count.
@@ -2067,6 +2080,9 @@ function wp_update_network_counts() {
 
 	$count = $wpdb->get_var( $wpdb->prepare("SELECT COUNT(ID) as c FROM $wpdb->users WHERE spam = '0' AND deleted = '0'") );
 	update_site_option( 'user_count', $count );
+	
+	$count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(user_login) AS c FROM $wpdb->signups WHERE active != 1" ) );
+	update_site_option( 'pending_user_count', $count );
 }
 
 ?>
\ No newline at end of file
diff --git wp-includes/user.php wp-includes/user.php
index c30f7be..5e792a6 100644
--- wp-includes/user.php
+++ wp-includes/user.php
@@ -617,6 +617,87 @@ class WP_User_Query {
 	}
 }
 
+class WP_Pending_User_Query extends WP_User_Query {
+	function prepare_query() {
+		global $wpdb;
+
+		$qv = &$this->query_vars;
+		$this->query_fields = "{$wpdb->signups}.*";
+
+		$this->query_from = "FROM {$wpdb->signups}";
+		$this->query_where = "WHERE 1=1 AND active != 1";
+
+		// sorting
+		if ( in_array( $qv['orderby'], array( 'nicename', 'email' ) ) ) {
+			$orderby = 'user_' . $qv['orderby'];
+		} elseif ( in_array( $qv['orderby'], array( 'user_email', 'registered' ) ) ) {
+			$orderby = $qv['orderby'];
+		} else {
+			$orderby = 'user_login';
+		}
+
+		$qv['order'] = strtoupper( $qv['order'] );
+		if ( 'ASC' == $qv['order'] )
+			$order = 'ASC';
+		else
+			$order = 'DESC';
+		$this->query_orderby = "ORDER BY $orderby $order";
+
+		// limit
+		if ( $qv['number'] ) {
+			if ( $qv['offset'] )
+				$this->query_limit = $wpdb->prepare("LIMIT %d, %d", $qv['offset'], $qv['number']);
+			else
+				$this->query_limit = $wpdb->prepare("LIMIT %d", $qv['number']);
+		}
+
+		$search = trim( $qv['search'] );
+		if ( $search ) {
+			$leading_wild = ( ltrim($search, '*') != $search );
+			$trailing_wild = ( rtrim($search, '*') != $search );
+			if ( $leading_wild && $trailing_wild )
+				$wild = 'both';
+			elseif ( $leading_wild )
+				$wild = 'leading';
+			elseif ( $trailing_wild )
+				$wild = 'trailing';
+			else
+				$wild = false;
+			if ( $wild )
+				$search = trim($search, '*');
+
+			if ( false !== strpos( $search, '@') )
+				$search_columns = array('user_email');
+			else
+				$search_columns = array('user_login');
+
+			$this->query_where .= $this->get_search_sql( $search, $search_columns, $wild );
+		}
+
+		$blog_id = absint( $qv['blog_id'] );
+
+		do_action_ref_array( 'pre_user_query', array( &$this ) );
+	}
+	
+	/**
+	 * Execute the query, with the current variables
+	 *
+	 * @since 3.2.0
+	 * @access private
+	 */
+	function query() {
+		global $wpdb;
+		
+		$this->results = $wpdb->get_results("SELECT $this->query_fields $this->query_from $this->query_where $this->query_orderby $this->query_limit");
+
+		if ( !$this->results )
+			return;
+
+		if ( $this->query_vars['count_total'] )
+			$this->total_users = $wpdb->get_var("SELECT COUNT(*) $this->query_from $this->query_where");
+	}
+}
+
 /**
  * Retrieve list of users matching criteria.
  *
