Index: wp-admin/admin-header.php
===================================================================
--- wp-admin/admin-header.php	(revision 25008)
+++ wp-admin/admin-header.php	(working copy)
@@ -93,6 +93,7 @@
 ?>
 </head>
 <body class="wp-admin wp-core-ui no-js <?php echo apply_filters( 'admin_body_class', '' ) . " $admin_body_class"; ?>">
+<?php wp_dropdown_terms( array() ); ?>
 <script type="text/javascript">
 	document.body.className = document.body.className.replace('no-js','js');
 </script>
Index: wp-includes/category-template.php
===================================================================
--- wp-includes/category-template.php	(revision 25008)
+++ wp-includes/category-template.php	(working copy)
@@ -263,17 +263,15 @@
 }
 
 /**
- * Display or retrieve the HTML dropdown list of categories.
+ * Display or retrieve the HTML dropdown list of terms.
  *
  * The list of arguments is below:
- *     'show_option_all' (string) - Text to display for showing all categories.
- *     'show_option_none' (string) - Text to display for showing no categories.
- *     'orderby' (string) default is 'ID' - What column to use for ordering the
- * categories.
- *     'order' (string) default is 'ASC' - What direction to order categories.
- *     'show_count' (bool|int) default is 0 - Whether to show how many posts are
- * in the category.
- *     'hide_empty' (bool|int) default is 1 - Whether to hide categories that
+ *     'show_option_all' (string) - Text to display for showing all terms.
+ *     'show_option_none' (string) - Text to display for showing no terms.
+ *     'orderby' (string) default is 'ID' - What column to use for ordering the terms.
+ *     'order' (string) default is 'ASC' - What direction to order terms.
+ *     'show_count' (bool|int) default is 0 - Whether to show how many posts are in the terms.
+ *     'hide_empty' (bool|int) default is 1 - Whether to hide terms that
  * don't have any posts attached to them.
  *     'child_of' (int) default is 0 - See {@link get_categories()}.
  *     'exclude' (string) - See {@link get_categories()}.
@@ -284,103 +282,116 @@
  *     'id' (string) - The ID attribute value for select element. Defaults to name if omitted.
  *     'class' (string) - The class attribute value for select element.
  *     'selected' (int) - Which category ID is selected.
- *     'taxonomy' (string) - The name of the taxonomy to retrieve. Defaults to category.
  *
  * The 'hierarchical' argument, which is disabled by default, will override the
  * depth argument, unless it is true. When the argument is false, it will
- * display all of the categories. When it is enabled it will use the value in
+ * display all of the terms. When it is enabled it will use the value in
  * the 'depth' argument.
  *
- * @since 2.1.0
- *
+ * @since 3.7.0
+ * 
+ * @param string $tax The taxonomy to create the dropdown for.
  * @param string|array $args Optional. Override default arguments.
  * @return string HTML content only if 'echo' argument is 0.
  */
-function wp_dropdown_categories( $args = '' ) {
+function wp_dropdown_terms( $taxonomy, $args = '' ) {
 	$defaults = array(
 		'show_option_all' => '', 'show_option_none' => '',
 		'orderby' => 'id', 'order' => 'ASC',
-		'show_count' => 0,
-		'hide_empty' => 1, 'child_of' => 0,
+		'show_count' => 0, 'hide_empty' => 1, 'child_of' => 0,
 		'exclude' => '', 'echo' => 1,
 		'selected' => 0, 'hierarchical' => 0,
 		'name' => 'cat', 'id' => '',
 		'class' => 'postform', 'depth' => 0,
-		'tab_index' => 0, 'taxonomy' => 'category',
-		'hide_if_empty' => false
+		'tab_index' => 0, 'hide_if_empty' => false
 	);
 
 	$defaults['selected'] = ( is_category() ) ? get_query_var( 'cat' ) : 0;
 
-	// Back compat.
-	if ( isset( $args['type'] ) && 'link' == $args['type'] ) {
-		_deprecated_argument( __FUNCTION__, '3.0', '' );
-		$args['taxonomy'] = 'link_category';
-	}
-
 	$r = wp_parse_args( $args, $defaults );
 
-	if ( !isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) {
+	if ( ! isset( $r['pad_counts'] ) && $r['show_count'] && $r['hierarchical'] ) {
 		$r['pad_counts'] = true;
 	}
 
-	extract( $r );
+	// Back compat.
+	if ( ! empty( $r['show_option_all'] ) )
+		$r['show_option_all'] = apply_filters( 'list_cats', $r['show_option_all'] );
+	if ( ! empty( $r['show_option_none'] ) )
+		$r['show_option_none'] = apply_filters( 'list_cats', $r['show_option_none'] );
 
-	$tab_index_attribute = '';
-	if ( (int) $tab_index > 0 )
-		$tab_index_attribute = " tabindex=\"$tab_index\"";
+	$terms = get_terms( $taxonomy, $r );
+	$name = esc_attr( $r['name'] );
+	$class = esc_attr( $r['class'] );
+	$id = $r['id'] ? esc_attr( $r['id'] ) : $name;
+	$tab_index_attribute = ( (int) $r['tab_index'] > 0 ) ? " tabindex='{$r['tab_index']}'" : '';
+	$show_option_all = esc_html( apply_filters( 'list_terms_show_all', $r['show_option_all'] ) );
+	$show_option_none = esc_html( apply_filters( 'list_terms_show_none', $r['show_option_none'] ) );
+	$depth = ( $r['hierarchical'] ) ? $r['depth'] : -1; // Walk the depth only if heirarchical.
 
-	$categories = get_terms( $taxonomy, $r );
-	$name = esc_attr( $name );
-	$class = esc_attr( $class );
-	$id = $id ? esc_attr( $id ) : $name;
+	$output = "<select name='$name' id='$id' class='$class' $tab_index_attribute>\n";
 
-	if ( ! $r['hide_if_empty'] || ! empty($categories) )
-		$output = "<select name='$name' id='$id' class='$class' $tab_index_attribute>\n";
-	else
-		$output = '';
+	if ( empty( $terms ) ) {
+		if ( $r['hide_if_empty'] )
+			return '';
+		elseif ( $show_option_none )
+			$output .= "\t<option value='-1' selected='selected'>$show_option_none</option>\n";
+	} else {
 
-	if ( empty($categories) && ! $r['hide_if_empty'] && !empty($show_option_none) ) {
-		$show_option_none = apply_filters( 'list_cats', $show_option_none );
-		$output .= "\t<option value='-1' selected='selected'>$show_option_none</option>\n";
-	}
-
-	if ( ! empty( $categories ) ) {
-
 		if ( $show_option_all ) {
-			$show_option_all = apply_filters( 'list_cats', $show_option_all );
-			$selected = ( '0' === strval($r['selected']) ) ? " selected='selected'" : '';
+			$selected = ( '0' === strval( $r['selected'] ) ) ? " selected='selected'" : '';
 			$output .= "\t<option value='0'$selected>$show_option_all</option>\n";
 		}
 
 		if ( $show_option_none ) {
-			$show_option_none = apply_filters( 'list_cats', $show_option_none );
 			$selected = ( '-1' === strval($r['selected']) ) ? " selected='selected'" : '';
 			$output .= "\t<option value='-1'$selected>$show_option_none</option>\n";
 		}
 
-		if ( $hierarchical )
-			$depth = $r['depth'];  // Walk the full depth.
-		else
-			$depth = -1; // Flat.
-
-		$output .= walk_category_dropdown_tree( $categories, $depth, $r );
+		$output .= walk_category_dropdown_tree( $terms, $depth, $r );
 	}
+	
+	$output .= "</select>\n";
 
-	if ( ! $r['hide_if_empty'] || ! empty($categories) )
-		$output .= "</select>\n";
-
+	// Back compat.
 	$output = apply_filters( 'wp_dropdown_cats', $output );
+	$output = apply_filters( 'wp_dropdown_terms', $output );
 
-	if ( $echo )
+	if ( $r['echo'] )
 		echo $output;
 
 	return $output;
 }
 
 /**
- * Display or retrieve the HTML list of categories.
+ * Display or retrieve the HTML dropdown list of categories.
  *
+ * The list of arguments matches {@link wp_dropdown_terms()}.
+ *
+ * @since 2.1.0
+ *
+ * @param string|array $args Optional. Override default arguments.
+ * @return string HTML content only if 'echo' argument is 0.
+ */
+function wp_dropdown_categories( $args = '' ) {
+	$taxonomy = 'category';
+
+	// Back compat.
+	if ( isset( $args['type'] ) && 'link' === $args['type'] ) {
+		_deprecated_argument( __FUNCTION__, '3.0', '' );
+		$taxonomy = 'link_category';
+	} elseif ( isset( $args['taxonomy'] ) && ! empty( $args['taxonomy'] ) ) {
+		_deprecated_argument( __FUNCTION__, '3.7', '' );
+		$taxonomy = $args['taxonomy'];
+		unset( $args['taxonomy'] );
+	}
+
+	return wp_dropdown_terms( $args, $taxonomy );
+}
+
+/**
+ * Display or retrieve the HTML list of a taxonomy's terms.
+ *
  * The list of arguments is below:
  *     'show_option_all' (string) - Text to display for showing all categories.
  *     'orderby' (string) default is 'ID' - What column to use for ordering the
@@ -491,6 +502,25 @@
 }
 
 /**
+ * Display or retrieve the HTML list of a taxonomy's terms.
+ *
+ * The list of arguments matches wp_list_categories() with the exception of
+ * 'taxonomy', which is its own function argument here.
+ *
+ * @since 3.5
+ *
+ * @param string $taxonomy Taxonomy name
+ * @param string|array $args Optional. Override default arguments.
+ * @return string HTML content only if 'echo' argument is 0.
+ */
+function wp_list_terms( $taxonomy, $args = '' ) {
+	$args = wp_parse_args( $args );
+	$args['taxonomy'] = $taxonomy;
+
+	return wp_list_categories( $args );
+}
+
+/**
  * Display tag cloud.
  *
  * The text size is set by the 'smallest' and 'largest' arguments, which will
