Index: wp-admin/includes/ms.php
===================================================================
--- wp-admin/includes/ms.php	(revision 18561)
+++ wp-admin/includes/ms.php	(working copy)
@@ -775,4 +775,19 @@
 <?php
 }
 
+/**
+ * Whether or not we have a large network
+ *
+ * @since 3.3.0
+ * @param string $using sites/users
+ */
+function wp_is_large_network( $using = 'sites' ) {
+	if ( 'users' == $using ) {
+		$count = get_user_count();
+		return apply_filters( 'wp_is_large_network', $count > 10000, 'users', $count );
+	}
+
+	$count = get_blog_count();
+	return apply_filters( 'wp_is_large_network', $count > 10000, 'sites', $count );
+}
 ?>
Index: wp-admin/includes/class-wp-ms-sites-list-table.php
===================================================================
--- wp-admin/includes/class-wp-ms-sites-list-table.php	(revision 18561)
+++ wp-admin/includes/class-wp-ms-sites-list-table.php	(working copy)
@@ -37,15 +37,13 @@
 
 		$like_s = esc_sql( like_escape( $s ) );
 
-		$large_network = false;
 		// If the network is large and a search is not being performed, show only the latest blogs with no paging in order
 		// to avoid expensive count queries.
-		if ( !$s && ( get_blog_count() >= 10000 ) ) {
+		if ( !$s && wp_is_large_network() ) {
 			if ( !isset($_REQUEST['orderby']) )
 				$_GET['orderby'] = $_REQUEST['orderby'] = '';
 			if ( !isset($_REQUEST['order']) )
 				$_GET['order'] = $_REQUEST['order'] = 'DESC';
-			$large_network = true;
 		}
 
 		$query = "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' ";
@@ -104,13 +102,13 @@
 		}
 
 		// Don't do an unbounded count on large networks
-		if ( ! $large_network )
+		if ( ! wp_is_large_network() )
 			$total = $wpdb->get_var( str_replace( 'SELECT *', 'SELECT COUNT( blog_id )', $query ) );
 
 		$query .= " LIMIT " . intval( ( $pagenum - 1 ) * $per_page ) . ", " . intval( $per_page );
 		$this->items = $wpdb->get_results( $query, ARRAY_A );
 
-		if ( $large_network )
+		if ( wp_is_large_network() )
 			$total = count($this->items);
 
 		$this->set_pagination_args( array(
@@ -127,6 +125,8 @@
 		$actions = array();
 		if ( current_user_can( 'delete_sites' ) )
 			$actions['delete'] = __( 'Delete' );
+		if ( current_user_can( 'promote_users' ) )
+			$actions['addusers'] = __( 'Add existing user' );
 		$actions['spam'] = _x( 'Mark as Spam', 'site' );
 		$actions['notspam'] = _x( 'Not Spam', 'site' );
 
Index: wp-admin/includes/class-wp-ms-users-list-table.php
===================================================================
--- wp-admin/includes/class-wp-ms-users-list-table.php	(revision 18561)
+++ wp-admin/includes/class-wp-ms-users-list-table.php	(working copy)
@@ -32,7 +32,10 @@
 			'fields' => 'all_with_meta'
 		);
 
-		$args['search'] = ltrim($args['search'], '*');
+		if ( wp_is_large_network( 'users' ) )
+			$args['search'] = ltrim( $args['search'], '*' );
+		else
+			$args['search'] = '*' . $args['search'] . '*';
 
 		if ( $role == 'super' ) {
 			$logins = implode( "', '", get_super_admins() );
@@ -41,7 +44,7 @@
 
 		// If the network is large and a search is not being performed, show only the latest users with no paging in order
 		// to avoid expensive count queries.
-		if ( !$usersearch && ( get_blog_count() >= 10000 ) ) {
+		if ( !$usersearch && wp_is_large_network( 'users' ) ) {
 			if ( !isset($_REQUEST['orderby']) )
 				$_GET['orderby'] = $_REQUEST['orderby'] = 'id';
 			if ( !isset($_REQUEST['order']) )
