Index: wp-includes/user.php
===================================================================
--- wp-includes/user.php	(revision 19735)
+++ wp-includes/user.php	(working copy)
@@ -973,6 +973,7 @@
  * <li>class - Class attribute of select element.</li>
  * <li>blog_id - ID of blog (Multisite only). Defaults to ID of current blog.</li>
  * <li>who - Which users to query. Currently only 'authors' is supported. Default is all users.</li>
+ * <li>number - Maximum number of users to list before switching to an alternate select box.  Default is 100</li>
  * </ol>
  *
  * @since 2.3.0
@@ -983,66 +984,124 @@
  */
 function wp_dropdown_users( $args = '' ) {
 	$defaults = array(
-		'show_option_all' => '', 'show_option_none' => '', 'hide_if_only_one_author' => '',
-		'orderby' => 'display_name', 'order' => 'ASC',
-		'include' => '', 'exclude' => '', 'multi' => 0,
-		'show' => 'display_name', 'echo' => 1,
-		'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '',
-		'blog_id' => $GLOBALS['blog_id'], 'who' => '', 'include_selected' => false
-	);
-
+                      'show_option_all' => '', 'show_option_none' => '', 'hide_if_only_one_author' => '',
+                      'orderby' => 'display_name', 'order' => 'ASC',
+                      'include' => '', 'exclude' => '', 'multi' => 0,
+                      'show' => 'display_name', 'echo' => 1,
+                      'selected' => 0, 'name' => 'user', 'class' => '', 'id' => '',
+                      'number' => 100,
+                      'blog_id' => $GLOBALS['blog_id'], 'who' => '', 'include_selected' => false
+                      );
+    
 	$defaults['selected'] = is_author() ? get_query_var( 'author' ) : 0;
-
+    
 	$r = wp_parse_args( $args, $defaults );
 	extract( $r, EXTR_SKIP );
-
-	$query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who' ) );
+    
+	$query_args = wp_array_slice_assoc( $r, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who', 'number' ) );
 	$query_args['fields'] = array( 'ID', $show );
-	$users = get_users( $query_args );
-
+	$user_search = new WP_User_Query($args);
+	
 	$output = '';
-	if ( !empty($users) && ( empty($hide_if_only_one_author) || count($users) > 1 ) ) {
+	if ( $user_search->get_total() && ( empty($hide_if_only_one_author) || $user_search->total_users > 1 ) ) {
 		$name = esc_attr( $name );
-		if ( $multi && ! $id )
-			$id = '';
-		else
-			$id = $id ? " id='" . esc_attr( $id ) . "'" : " id='$name'";
-
-		$output = "<select name='{$name}'{$id} class='$class'>\n";
-
-		if ( $show_option_all )
-			$output .= "\t<option value='0'>$show_option_all</option>\n";
-
-		if ( $show_option_none ) {
-			$_selected = selected( -1, $selected, false );
-			$output .= "\t<option value='-1'$_selected>$show_option_none</option>\n";
+		
+		if($user_search->get_total() <= $number) {
+			if ( $multi && ! $id )
+				$id = '';
+			else
+				$id = $id ? " id='" . esc_attr( $id ) . "'" : " id='$name'";
+			
+			$output = "<select name='{$name}'{$id} class='$class'>\n";
+            
+			if ( $show_option_all )
+				$output .= "\t<option value='0'>$show_option_all</option>\n";
+            
+			if ( $show_option_none ) {
+				$_selected = selected( -1, $selected, false );
+				$output .= "\t<option value='-1'$_selected>$show_option_none</option>\n";
+			}
+            
+			$found_selected = false;
+			foreach ( $user_search->get_results() as $user ) {
+				$user->ID = (int) $user->ID;
+				$_selected = selected( $user->ID, $selected, false );
+				if ( $_selected )
+					$found_selected = true;
+				$display = !empty($user->$show) ? $user->$show : '('. $user->user_login . ')';
+				$output .= "\t<option value='$user->ID'$_selected>" . esc_html($display) . "</option>\n";
+			}
+            
+			if ( $include_selected && ! $found_selected && ( $selected > 0 ) ) {
+				$user = get_userdata( $selected );
+				$_selected = selected( $user->ID, $selected, false );
+				$display = !empty($user->$show) ? $user->$show : '('. $user->user_login . ')';
+				$output .= "\t<option value='$user->ID'$_selected>" . esc_html($display) . "</option>\n";
+			}
+            
+			$output .= "</select>";
+		} else {
+			wp_enqueue_script( 'user-list' );
+            
+			$id = $id ? esc_attr( $id ) : $name;
+			$output = "<div class='user-list' id='{$id}-box'>\n";
+            
+			$display = null;
+            
+			if ( ( $selected > 0 ) ) {
+				if ( $selected_user = get_userdata( $selected ) ) {
+					if ( !$include_selected ) {
+						$exclude = wp_parse_id_list( $exclude );
+						$selected_args = wp_array_slice_assoc( $r, array( 'blog_id', 'exclude', 'who' ) );
+						$selected_args['include'] = $selected;
+						if ( !count( get_users( $selected_args ) ) )
+							$selected = null;
+					}
+					if ( !is_null( $selected ) ) {
+						$selected = $selected_user->ID;
+						$display = !empty( $selected_user->$show ) ? $selected_user->$show : '(' . $selected_user->user_login . ')';
+					}
+				} else
+					$selected = null;
+			}
+            
+			if ( $show_option_all ) {
+				$output .= "\t<input type='hidden' id='{$id}-option-all' value='" . esc_attr( $show_option_all ) . "' />\n";
+				if ( is_null( $selected ) || $selected == 0 ) {
+					$selected = 0;
+					$display = $show_option_all;
+				}
+			}
+            
+			if ( $show_option_none ) {
+				$output .= "\t<input type='hidden' id='{$id}-option-none' value='" . esc_attr( $show_option_none ) . "' />\n";
+				if ( is_null( $selected ) || $selected == -1 ) {
+					$selected = -1;
+					$display = $show_option_none;
+				}
+			}
+            
+			if ( is_null( $selected ) ) {
+				$selected_user = array_shift( $user_search->get_results() );
+				$selected = $selected_user->ID;
+				$display = !empty( $selected_user->$show ) ? $selected_user->$show : '(' . $selected_user->user_login . ')';
+			}
+            
+			$output .= "\t<input type='text'id='{$id}' value='" . esc_attr( $display ) . "' />\n" .
+            "\t<input type='hidden' name='{$name}' id='{$id}-value' value='" . esc_attr( $selected ) . "' />\n";
+			$output .= wp_nonce_field( 'user-search-' . $blog_id, "{$id}-nonce", false, false );
+			$output .= "<script type='text/javascript'>\n" .
+            "{$id}_query_options = " . json_encode( $query_args ) . "\n" .
+            '</script>';
+			$output .= "</div>";
 		}
-
-		$found_selected = false;
-		foreach ( (array) $users as $user ) {
-			$user->ID = (int) $user->ID;
-			$_selected = selected( $user->ID, $selected, false );
-			if ( $_selected )
-				$found_selected = true;
-			$display = !empty($user->$show) ? $user->$show : '('. $user->user_login . ')';
-			$output .= "\t<option value='$user->ID'$_selected>" . esc_html($display) . "</option>\n";
-		}
-
-		if ( $include_selected && ! $found_selected && ( $selected > 0 ) ) {
-			$user = get_userdata( $selected );
-			$_selected = selected( $user->ID, $selected, false );
-			$display = !empty($user->$show) ? $user->$show : '('. $user->user_login . ')';
-			$output .= "\t<option value='$user->ID'$_selected>" . esc_html($display) . "</option>\n";
-		}
-
-		$output .= "</select>";
 	}
-
+    
 	$output = apply_filters('wp_dropdown_users', $output);
-
+    
 	if ( $echo )
 		echo $output;
-
+    
 	return $output;
 }
 
Index: wp-includes/script-loader.php
===================================================================
--- wp-includes/script-loader.php	(revision 19735)
+++ wp-includes/script-loader.php	(working copy)
@@ -259,6 +259,8 @@
 	) );
 
 	$scripts->add( 'user-profile', "/wp-admin/js/user-profile$suffix.js", array( 'jquery', 'password-strength-meter' ), false, 1 );
+    
+	$scripts->add( 'user-list', "/wp-admin/js/user-list$suffix.js", array( 'jquery', 'jquery-ui-autocomplete' ), '20120111', 1 );
 
 	$scripts->add( 'admin-bar', "/wp-includes/js/admin-bar$suffix.js", array(), false, 1 );
 
Index: wp-admin/admin-ajax.php
===================================================================
--- wp-admin/admin-ajax.php	(revision 19735)
+++ wp-admin/admin-ajax.php	(working copy)
@@ -98,6 +98,7 @@
 	echo join( $results, "\n" );
 	die;
 	break;
+
 case 'wp-compression-test' :
 	if ( !current_user_can( 'manage_options' ) )
 		die('-1');
@@ -142,6 +143,30 @@
 
 	die('0');
 	break;
+case 'ajax-user-search' :
+	$list = array( );
+	if ( !empty( $_GET['term'] ) ) {
+		$defaults = array(
+                          'include' => '', 'exclude' => '',
+                          'show' => 'display_name',
+                          'number' => 20,
+                          'blog_id' => $GLOBALS['blog_id'], 'who' => ''
+                          );
+		$args = wp_parse_args( $_GET, $defaults );
+		$args['search'] = '*' . stripslashes( $_GET['term'] ) . '*';
+        
+		$search_args = wp_array_slice_assoc( $args, array( 'blog_id', 'include', 'exclude', 'orderby', 'order', 'who', 'search' ) );
+		$show = $args['show'];
+		check_ajax_referer( 'user-search-' . $args['blog_id'], 'nonce' );
+        
+		$user_query = new WP_User_Query( $search_args );
+		foreach ( $user_query->get_results() as $user ) {
+			$display = !empty( $user->$show ) ? $user->$show : '(' . $user->user_login . ')';
+			$list[] = array( 'value' => $display, 'id' => $user->ID );
+		}
+	}
+	die( json_encode( $list ) );
+	break;
 case 'imgedit-preview' :
 	$post_id = intval($_GET['postid']);
 	if ( empty($post_id) || !current_user_can('edit_post', $post_id) )
