Index: wp-includes/taxonomy.php
===================================================================
--- wp-includes/taxonomy.php	(revision 20037)
+++ wp-includes/taxonomy.php	(working copy)
@@ -43,73 +43,80 @@
 
 	register_taxonomy( 'category', 'post', array(
 		'hierarchical' => true,
-		'query_var' => 'category_name',
-		'rewrite' => $rewrite['category'],
-		'public' => true,
-		'show_ui' => true,
-		'_builtin' => true,
+		'query_var'    => 'category_name',
+		'rewrite'      => $rewrite['category'],
+		'public'       => true,
+		'show_ui'      => true,
+		'_builtin'     => true,
+		'input'        => 'checkbox',
 	) );
 
 	register_taxonomy( 'post_tag', 'post', array(
-	 	'hierarchical' => false,
-		'query_var' => 'tag',
-		'rewrite' => $rewrite['post_tag'],
-		'public' => true,
-		'show_ui' => true,
-		'_builtin' => true,
+	 	'hierarchical'  => false,
+		'query_var'     => 'tag',
+		'rewrite'       => $rewrite['post_tag'],
+		'public'        => true,
+		'show_ui'       => true,
+		'_builtin'      => true,
+		'input'         => 'text',
 	) );
 
 	register_taxonomy( 'nav_menu', 'nav_menu_item', array(
-		'public' => false,
-		'hierarchical' => false,
-		'labels' => array(
-			'name' => __( 'Navigation Menus' ),
-			'singular_name' => __( 'Navigation Menu' ),
+		'public'            => false,
+		'hierarchical'      => false,
+		'labels'            => array(
+			'name'             => __( 'Navigation Menus' ),
+			'singular_name'    => __( 'Navigation Menu' ),
 		),
-		'query_var' => false,
-		'rewrite' => false,
-		'show_ui' => false,
-		'_builtin' => true,
+		'query_var'         => false,
+		'rewrite'           => false,
+		'show_ui'           => false,
+		'_builtin'          => true,
 		'show_in_nav_menus' => false,
+		'input'             => null,
 	) );
 
 	register_taxonomy( 'link_category', 'link', array(
-		'hierarchical' => false,
-		'labels' => array(
-			'name' => __( 'Link Categories' ),
-			'singular_name' => __( 'Link Category' ),
-			'search_items' => __( 'Search Link Categories' ),
-			'popular_items' => null,
-			'all_items' => __( 'All Link Categories' ),
-			'edit_item' => __( 'Edit Link Category' ),
-			'update_item' => __( 'Update Link Category' ),
-			'add_new_item' => __( 'Add New Link Category' ),
-			'new_item_name' => __( 'New Link Category Name' ),
+		'hierarchical'                => false,
+		'labels'                      => array(
+			'name'                       => __( 'Link Categories' ),
+			'singular_name'              => __( 'Link Category' ),
+			'search_items'               => __( 'Search Link Categories' ),
+			'popular_items'              => null,
+			'all_items'                  => __( 'All Link Categories' ),
+			'edit_item'                  => __( 'Edit Link Category' ),
+			'update_item'                => __( 'Update Link Category' ),
+			'add_new_item'               => __( 'Add New Link Category' ),
+			'new_item_name'              => __( 'New Link Category Name' ),
 			'separate_items_with_commas' => null,
-			'add_or_remove_items' => null,
-			'choose_from_most_used' => null,
+			'add_or_remove_items'        => null,
+			'choose_from_most_used'      => null,
 		),
-		'query_var' => false,
-		'rewrite' => false,
-		'public' => false,
-		'show_ui' => false,
-		'_builtin' => true,
+		'query_var'                   => false,
+		'rewrite'                     => false,
+		'public'                      => false,
+		'show_ui'                     => false,
+		'_builtin'                    => true,
+		'input'                       => null,
 	) );
 
 	register_taxonomy( 'post_format', 'post', array(
-		'public' => true,
-		'hierarchical' => false,
-		'labels' => array(
-			'name' => _x( 'Format', 'post format' ),
-			'singular_name' => _x( 'Format', 'post format' ),
+		'public'            => true,
+		'hierarchical'      => false,
+		'labels'            => array(
+			'name'             => _x( 'Format', 'post format' ),
+			'singular_name'    => _x( 'Format', 'post format' ),
 		),
-		'query_var' => true,
-		'rewrite' => $rewrite['post_format'],
-		'show_ui' => false,
-		'_builtin' => true,
+		'query_var'         => true,
+		'rewrite'           => $rewrite['post_format'],
+		'show_ui'           => false,
+		'_builtin'          => true,
 		'show_in_nav_menus' => current_theme_supports( 'post-formats' ),
+		'input'             => null,
 	) );
+
 }
+
 add_action( 'init', 'create_initial_taxonomies', 0 ); // highest priority
 
 /**
@@ -292,6 +299,8 @@
  *
  * labels - An array of labels for this taxonomy. You can see accepted values in {@link get_taxonomy_labels()}. By default tag labels are used for non-hierarchical types and category labels for hierarchical ones.
  *
+ * input - the type of metabox to display on the post edit screen. Choices include text (tags), checkbox (categories), radio (exclusive), or dropdown (exclusive). Note: exclusive inputs limit the user to selecting only one term.
+ *
  * @package WordPress
  * @subpackage Taxonomy
  * @since 2.3.0
@@ -308,18 +317,21 @@
 	if ( ! is_array($wp_taxonomies) )
 		$wp_taxonomies = array();
 
-	$defaults = array(	'hierarchical' => false,
+	$defaults = array(	
+						'hierarchical'          => false,
 						'update_count_callback' => '',
-						'rewrite' => true,
-						'query_var' => $taxonomy,
-						'public' => true,
-						'show_ui' => null,
-						'show_tagcloud' => null,
-						'_builtin' => false,
-						'labels' => array(),
-						'capabilities' => array(),
-						'show_in_nav_menus' => null,
+						'rewrite'               => true,
+						'query_var'             => $taxonomy,
+						'public'                => true,
+						'show_ui'               => null,
+						'show_tagcloud'         => null,
+						'_builtin'              => false,
+						'labels'                => array(),
+						'capabilities'          => array(),
+						'show_in_nav_menus'     => null,
+						'input'                 => 'input',
 					);
+
 	$args = wp_parse_args($args, $defaults);
 
 	if ( false !== $args['query_var'] && !empty($wp) ) {
@@ -348,6 +360,10 @@
 
 	if ( is_null($args['show_ui']) )
 		$args['show_ui'] = $args['public'];
+		
+	//if no input is specified and UI is not used, set default to null to avoid confusion
+	if ( !$args['show_ui'] && is_null( $args['input'] ) )
+		$args['input'] = null;
 
 	// Whether to show this type in nav-menus.php. Defaults to the setting for public.
 	if ( null === $args['show_in_nav_menus'] )
@@ -1881,7 +1897,7 @@
 		$object_ids = array($object_ids);
 	$object_ids = array_map('intval', $object_ids);
 
-	$defaults = array('orderby' => 'name', 'order' => 'ASC', 'fields' => 'all');
+	$defaults = array( 'orderby' => 'name', 'order' => 'ASC', 'fields' => 'all' );
 	$args = wp_parse_args( $args, $defaults );
 
 	$terms = array();
@@ -2146,6 +2162,10 @@
 
 	if ( ! taxonomy_exists($taxonomy) )
 		return new WP_Error('invalid_taxonomy', __('Invalid Taxonomy'));
+	
+	//if this is an exclusive taxonomy, and users has passed more than 1 term, only accept the first
+	if ( is_array( $terms ) && in_array( get_taxonomy( $taxonomy )->input, array( 'dropdown', 'radio' ) ) )
+		$terms = array_shift( $terms );
 
 	if ( !is_array($terms) )
 		$terms = array($terms);
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 20037)
+++ wp-includes/post.php	(working copy)
@@ -2410,7 +2410,7 @@
  * @param bool $wp_error Optional. Allow return of WP_Error on failure.
  * @return int|WP_Error The value 0 or WP_Error on failure. The post ID on success.
  */
-function wp_insert_post($postarr, $wp_error = false) {
+function wp_insert_post($postarr, $wp_error = false) { 
 	global $wpdb, $user_ID;
 
 	$defaults = array('post_status' => 'draft', 'post_type' => 'post', 'post_author' => $user_ID,
@@ -2611,10 +2611,18 @@
 	if ( !empty($tax_input) ) {
 		foreach ( $tax_input as $taxonomy => $tags ) {
 			$taxonomy_obj = get_taxonomy($taxonomy);
-			if ( is_array($tags) ) // array = hierarchical, string = non-hierarchical.
+
+			// array = hierarchical, string = non-hierarchical.
+			if ( is_array($tags) ) 
 				$tags = array_filter($tags);
+			
+			//exclusive taxonomies pass IDs rather than slugs, typecast to prevent confusion
+			if ( $taxonomy_obj->input == 'radio' || $taxonomy_obj->input == 'dropdown' )
+				$tags = array( (int) $tags );
+
 			if ( current_user_can($taxonomy_obj->cap->assign_terms) )
 				wp_set_post_terms( $post_ID, $tags, $taxonomy );
+
 		}
 	}
 
Index: wp-admin/includes/template.php
===================================================================
--- wp-admin/includes/template.php	(revision 20037)
+++ wp-admin/includes/template.php	(working copy)
@@ -40,9 +40,13 @@
 			$name = 'post_category';
 		else
 			$name = 'tax_input['.$taxonomy.']';
-
+			
+		//if this is not a radio input, each checkbox should be individually named with []'s
+		if ( $input != 'radio' )
+			$name .= '[]';
+		
 		$class = in_array( $category->term_id, $popular_cats ) ? ' class="popular-category"' : '';
-		$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="checkbox" name="'.$name.'[]" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
+		$output .= "\n<li id='{$taxonomy}-{$category->term_id}'$class>" . '<label class="selectit"><input value="' . $category->term_id . '" type="'.$input.'" name="'.$name.'" id="in-'.$taxonomy.'-' . $category->term_id . '"' . checked( in_array( $category->term_id, $selected_cats ), true, false ) . disabled( empty( $args['disabled'] ), false, false ) . ' /> ' . esc_html( apply_filters('the_category', $category->name )) . '</label>';
 	}
 
 	function end_el( &$output, $category, $depth = 0, $args = array() ) {
@@ -87,7 +91,7 @@
 		'popular_cats' => false,
 		'walker' => null,
 		'taxonomy' => 'category',
-		'checked_ontop' => true
+		'checked_ontop' => true,
 	);
 	extract( wp_parse_args($args, $defaults), EXTR_SKIP );
 
@@ -120,6 +124,12 @@
 	} else {
 		$categories = (array) get_terms($taxonomy, array('get' => 'all'));
 	}
+	
+	//set input type
+	if ( $tax->input == 'radio' )
+		$args['input'] = 'radio';
+	else
+		$args['input'] = 'checkbox';
 
 	if ( $checked_ontop ) {
 		// Post process $categories rather than adding an exclude to the get_terms() query to keep the query the same across all posts (for any query cache)
Index: wp-admin/includes/meta-boxes.php
===================================================================
--- wp-admin/includes/meta-boxes.php	(revision 20037)
+++ wp-admin/includes/meta-boxes.php	(working copy)
@@ -232,51 +232,44 @@
 }
 
 /**
- * Display post format form elements.
- *
- * @since 3.1.0
- *
+ * Renders metabox for a given taxonomy
+ * Taxonomy should be passed via the initial filter as an argument within the box array
+ * @since 3.4
  * @param object $post
+ * @param array $box
  */
-function post_format_meta_box( $post, $box ) {
-	if ( current_theme_supports( 'post-formats' ) && post_type_supports( $post->post_type, 'post-formats' ) ) :
-	$post_formats = get_theme_support( 'post-formats' );
+function post_taxonomy_meta_box( $post, $box ) {
 
-	if ( is_array( $post_formats[0] ) ) :
-		$post_format = get_post_format( $post->ID );
-		if ( !$post_format )
-			$post_format = '0';
-		// Add in the current one if it isn't there yet, in case the current theme doesn't support it
-		if ( $post_format && !in_array( $post_format, $post_formats[0] ) )
-			$post_formats[0][] = $post_format;
-	?>
-	<div id="post-formats-select">
-		<input type="radio" name="post_format" class="post-format" id="post-format-0" value="0" <?php checked( $post_format, '0' ); ?> /> <label for="post-format-0"><?php _e('Standard'); ?></label>
-		<?php foreach ( $post_formats[0] as $format ) : ?>
-		<br /><input type="radio" name="post_format" class="post-format" id="post-format-<?php echo esc_attr( $format ); ?>" value="<?php echo esc_attr( $format ); ?>" <?php checked( $post_format, $format ); ?> /> <label for="post-format-<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>
-		<?php endforeach; ?><br />
-	</div>
-	<?php endif; endif;
+	//default to tags if no taxonomy is passed	
+	if ( !is_array( $box['args'] ) || !isset( $box['args']['taxonomy'] ) )
+		$box['args']['taxonomy'] = 'post_tag';
+			
+	$taxonomy = get_taxonomy( $box['args']['taxonomy'] );
+
+	if ( !$taxonomy )
+		return;
+
+	//try to call a native function for built-in input types
+	//otherwise, allow users to hook in and fire their own callback
+	if ( function_exists( "_{$taxonomy->input}_taxonomy_meta_box" ) )
+		call_user_func( "_{$taxonomy->input}_taxonomy_meta_box", $post, $taxonomy );
+	else
+		do_action( '{$taxonomy->input}_taxonomy_meta_box', $post, $taxonomy );
+	
 }
 
 /**
- * Display post tags form fields.
- *
- * @since 2.6.0
- *
- * @param object $post
+ * Help function to render text (tag-like) input taxonomy metaboxes
+ * @param object $post the post object
+ * @param object $taxonomy the taxonomy object
+ * @since 3.4
  */
-function post_tags_meta_box($post, $box) {
-	$defaults = array('taxonomy' => 'post_tag');
-	if ( !isset($box['args']) || !is_array($box['args']) )
-		$args = array();
-	else
-		$args = $box['args'];
-	extract( wp_parse_args($args, $defaults), EXTR_SKIP );
-	$tax_name = esc_attr($taxonomy);
-	$taxonomy = get_taxonomy($taxonomy);
+function _text_taxonomy_meta_box( $post, $taxonomy ) {
+
+	$tax_name = esc_attr( $taxonomy->name );
 	$disabled = !current_user_can($taxonomy->cap->assign_terms) ? 'disabled="disabled"' : '';
 	$comma = _x( ',', 'tag delimiter' );
+	
 ?>
 <div class="tagsdiv" id="<?php echo $tax_name; ?>">
 	<div class="jaxtag">
@@ -295,78 +288,248 @@
 	</div>
 	<div class="tagchecklist"></div>
 </div>
-<?php if ( current_user_can($taxonomy->cap->assign_terms) ) : ?>
+<?php if ( current_user_can( $taxonomy->cap->assign_terms ) ) : ?>
 <p class="hide-if-no-js"><a href="#titlediv" class="tagcloud-link" id="link-<?php echo $tax_name; ?>"><?php echo $taxonomy->labels->choose_from_most_used; ?></a></p>
-<?php endif; ?>
-<?php
+<?php endif;
 }
 
 /**
- * Display post categories form fields.
- *
- * @since 2.6.0
- *
- * @param object $post
+ * Helper function to create checkbox (category) input metaboxes
+ * @param object $post the post object
+ * @param object $taxonomy the taxonomy object
+ * @since 3.4
  */
-function post_categories_meta_box( $post, $box ) {
-	$defaults = array('taxonomy' => 'category');
-	if ( !isset($box['args']) || !is_array($box['args']) )
-		$args = array();
-	else
-		$args = $box['args'];
-	extract( wp_parse_args($args, $defaults), EXTR_SKIP );
-	$tax = get_taxonomy($taxonomy);
-
-	?>
-	<div id="taxonomy-<?php echo $taxonomy; ?>" class="categorydiv">
-		<ul id="<?php echo $taxonomy; ?>-tabs" class="category-tabs">
-			<li class="tabs"><a href="#<?php echo $taxonomy; ?>-all" tabindex="3"><?php echo $tax->labels->all_items; ?></a></li>
-			<li class="hide-if-no-js"><a href="#<?php echo $taxonomy; ?>-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li>
+function _checkbox_taxonomy_meta_box( $post, $taxonomy ) {
+?>
+	<div id="taxonomy-<?php echo $taxonomy->name; ?>" class="categorydiv">
+		<ul id="<?php echo $taxonomy->name; ?>-tabs" class="category-tabs">
+			<li class="tabs"><a href="#<?php echo $taxonomy->name; ?>-all" tabindex="3"><?php echo $taxonomy->labels->all_items; ?></a></li>
+			<li class="hide-if-no-js"><a href="#<?php echo $taxonomy->name; ?>-pop" tabindex="3"><?php _e( 'Most Used' ); ?></a></li>
 		</ul>
 
-		<div id="<?php echo $taxonomy; ?>-pop" class="tabs-panel" style="display: none;">
-			<ul id="<?php echo $taxonomy; ?>checklist-pop" class="categorychecklist form-no-clear" >
-				<?php $popular_ids = wp_popular_terms_checklist($taxonomy); ?>
+		<div id="<?php echo $taxonomy->name; ?>-pop" class="tabs-panel" style="display: none;">
+			<ul id="<?php echo $taxonomy->name; ?>checklist-pop" class="categorychecklist form-no-clear" >
+				<?php $popular_ids = wp_popular_terms_checklist( $taxonomy->name ); ?>
 			</ul>
 		</div>
 
-		<div id="<?php echo $taxonomy; ?>-all" class="tabs-panel">
-			<?php
-            $name = ( $taxonomy == 'category' ) ? 'post_category' : 'tax_input[' . $taxonomy . ']';
+		<div id="<?php echo $taxonomy->name; ?>-all" class="tabs-panel">
+<?php
+            $name = ( $taxonomy->name == 'category' ) ? 'post_category' : 'tax_input[' . $taxonomy->name . ']';
             echo "<input type='hidden' name='{$name}[]' value='0' />"; // Allows for an empty term set to be sent. 0 is an invalid Term ID and will be ignored by empty() checks.
             ?>
-			<ul id="<?php echo $taxonomy; ?>checklist" class="list:<?php echo $taxonomy?> categorychecklist form-no-clear">
-				<?php wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy, 'popular_cats' => $popular_ids ) ) ?>
+			<ul id="<?php echo $taxonomy->name; ?>checklist" class="list:<?php echo $taxonomy->name?> categorychecklist form-no-clear">
+				<?php wp_terms_checklist($post->ID, array( 'taxonomy' => $taxonomy->name, 'popular_cats' => $popular_ids ) ) ?>
 			</ul>
 		</div>
-	<?php if ( current_user_can($tax->cap->edit_terms) ) : ?>
-			<div id="<?php echo $taxonomy; ?>-adder" class="wp-hidden-children">
+<?php 	if ( current_user_can($taxonomy->cap->edit_terms) ) : ?>
+			<div id="<?php echo $taxonomy->name; ?>-adder" class="wp-hidden-children">
 				<h4>
-					<a id="<?php echo $taxonomy; ?>-add-toggle" href="#<?php echo $taxonomy; ?>-add" class="hide-if-no-js" tabindex="3">
+					<a id="<?php echo $taxonomy->name; ?>-add-toggle" href="#<?php echo $taxonomy->name; ?>-add" class="hide-if-no-js" tabindex="3">
 						<?php
 							/* translators: %s: add new taxonomy label */
-							printf( __( '+ %s' ), $tax->labels->add_new_item );
+							printf( __( '+ %s' ), $taxonomy->labels->add_new_item );
 						?>
 					</a>
 				</h4>
-				<p id="<?php echo $taxonomy; ?>-add" class="category-add wp-hidden-child">
-					<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>"><?php echo $tax->labels->add_new_item; ?></label>
-					<input type="text" name="new<?php echo $taxonomy; ?>" id="new<?php echo $taxonomy; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $tax->labels->new_item_name ); ?>" tabindex="3" aria-required="true"/>
-					<label class="screen-reader-text" for="new<?php echo $taxonomy; ?>_parent">
-						<?php echo $tax->labels->parent_item_colon; ?>
+				<p id="<?php echo $taxonomy->name; ?>-add" class="category-add wp-hidden-child">
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>"><?php echo $taxonomy->labels->add_new_item; ?></label>
+					<input type="text" name="new<?php echo $taxonomy->name; ?>" id="new<?php echo $taxonomy->name; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>" tabindex="3" aria-required="true"/>
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>_parent">
+						<?php echo $taxonomy->name->labels->parent_item_colon; ?>
 					</label>
-					<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy, 'hide_empty' => 0, 'name' => 'new'.$taxonomy.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $tax->labels->parent_item . ' &mdash;', 'tab_index' => 3 ) ); ?>
-					<input type="button" id="<?php echo $taxonomy; ?>-add-submit" class="add:<?php echo $taxonomy ?>checklist:<?php echo $taxonomy ?>-add button category-add-sumbit" value="<?php echo esc_attr( $tax->labels->add_new_item ); ?>" tabindex="3" />
-					<?php wp_nonce_field( 'add-'.$taxonomy, '_ajax_nonce-add-'.$taxonomy, false ); ?>
-					<span id="<?php echo $taxonomy; ?>-ajax-response"></span>
+					<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;', 'tab_index' => 3 ) ); ?>
+					<input type="button" id="<?php echo $taxonomy->name; ?>-add-submit" class="add:<?php echo $taxonomy->name ?>checklist:<?php echo $taxonomy->name ?>-add button category-add-sumbit" value="<?php echo esc_attr( $taxonomy->labels->add_new_item ); ?>" tabindex="3" />
+					<?php wp_nonce_field( 'add-'.$taxonomy->name, '_ajax_nonce-add-'.$taxonomy->name, false ); ?>
+					<span id="<?php echo $taxonomy->name; ?>-ajax-response"></span>
 				</p>
 			</div>
 		<?php endif; ?>
 	</div>
-	<?php
+<?php
 }
 
 /**
+ * Helper function to create radio (exclusive) input taxonomy metaboxes
+ * @param object $post the post object
+ * @param object $taxonomy the taxonomy object
+ * @since 3.4
+ */
+function _radio_taxonomy_meta_box( $post, $taxonomy ) {
+
+	$selected = wp_get_post_terms( $post->ID, $taxonomy->name );
+	if ( $selected )
+		$selected = array( $selected[0]->ID );
+		
+?>
+	<div id="taxonomy-<?php echo $taxonomy->name; ?>" class="categorydiv">
+		<ul id="<?php echo $taxonomy->name; ?>checklist" class="list:<?php echo $taxonomy->name?> categorychecklist form-no-clear">
+			<li id='<?php echo $taxonomy->name; ?>-none'><label class="selectit"><input value="" type="radio" name="tax_input[radio]" id="in-radio-none" <?php checked( !$selected ); ?> /> <?php _e( 'None' ); ?></label></li>
+<?php
+		
+	wp_terms_checklist( $post->ID, array( 
+		'taxonomy' => $taxonomy->name, 
+		'popular_cats' => $selected,
+	 ) );
+	 
+	 ?>
+	 	</ul>
+<?php 	if ( current_user_can($taxonomy->cap->edit_terms) ) : ?>
+			<div id="<?php echo $taxonomy->name; ?>-adder" class="wp-hidden-children">
+				<h4>
+					<a id="<?php echo $taxonomy->name; ?>-add-toggle" href="#<?php echo $taxonomy->name; ?>-add" class="hide-if-no-js" tabindex="3">
+						<?php
+							/* translators: %s: add new taxonomy label */
+							printf( __( '+ %s' ), $taxonomy->labels->add_new_item );
+						?>
+					</a>
+				</h4>
+				<p id="<?php echo $taxonomy->name; ?>-add" class="category-add wp-hidden-child">
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>"><?php echo $taxonomy->labels->add_new_item; ?></label>
+					<input type="text" name="new<?php echo $taxonomy->name; ?>" id="new<?php echo $taxonomy->name; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>" tabindex="3" aria-required="true"/>
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>_parent">
+						<?php echo $taxonomy->name->labels->parent_item_colon; ?>
+					</label>
+					<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;', 'tab_index' => 3 ) ); ?>
+					<input type="button" id="<?php echo $taxonomy->name; ?>-add-submit" class="add:<?php echo $taxonomy->name ?>checklist:<?php echo $taxonomy->name ?>-add button category-add-sumbit" value="<?php echo esc_attr( $taxonomy->labels->add_new_item ); ?>" tabindex="3" />
+					<?php wp_nonce_field( 'add-'.$taxonomy->name, '_ajax_nonce-add-'.$taxonomy->name, false ); ?>
+					<span id="<?php echo $taxonomy->name; ?>-ajax-response"></span>
+				</p>
+			</div>
+		<?php endif; ?>
+	 </div>
+<?php
+	 
+}
+
+/**
+ * Helper function to create dropdown (exclusive) input taxonomy metaboxes
+ * @param object $post the post object
+ * @param object $taxonomy the taxonomy object
+ * @since 3.4
+ */
+function _dropdown_taxonomy_meta_box( $post, $taxonomy ) {
+?>
+	<div id="taxonomy-<?php echo $taxonomy->name; ?>" class="categorydiv">
+<?php
+	
+	$selected = wp_get_post_terms( $post->ID, $taxonomy->name );
+	if ( $selected )
+		$selected = $selected[0]->term_id;
+		
+	wp_dropdown_categories( array( 
+		'taxonomy' => $taxonomy->name,
+		'show_option_none' => ' ',
+		'orderby' => 'slug',
+		'selected' => $selected,
+		'hierarchical' => $taxonomy->hierarchical,
+		'hide_empty' => false,
+		'name' => "tax_input[{$taxonomy->name}]",
+	) );
+	
+	if ( current_user_can($taxonomy->cap->edit_terms) ) :
+	?>
+			<div id="<?php echo $taxonomy->name; ?>-adder" class="wp-hidden-children">
+				<h4>
+					<a id="<?php echo $taxonomy->name; ?>-add-toggle" href="#<?php echo $taxonomy->name; ?>-add" class="hide-if-no-js" tabindex="3">
+						<?php
+							/* translators: %s: add new taxonomy label */
+							printf( __( '+ %s' ), $taxonomy->labels->add_new_item );
+						?>
+					</a>
+				</h4>
+				<p id="<?php echo $taxonomy->name; ?>-add" class="category-add wp-hidden-child">
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>"><?php echo $taxonomy->labels->add_new_item; ?></label>
+					<input type="text" name="new<?php echo $taxonomy->name; ?>" id="new<?php echo $taxonomy->name; ?>" class="form-required form-input-tip" value="<?php echo esc_attr( $taxonomy->labels->new_item_name ); ?>" tabindex="3" aria-required="true"/>
+					<label class="screen-reader-text" for="new<?php echo $taxonomy->name; ?>_parent">
+						<?php echo $taxonomy->name->labels->parent_item_colon; ?>
+					</label>
+					<?php wp_dropdown_categories( array( 'taxonomy' => $taxonomy->name, 'hide_empty' => 0, 'name' => 'new'.$taxonomy->name.'_parent', 'orderby' => 'name', 'hierarchical' => 1, 'show_option_none' => '&mdash; ' . $taxonomy->labels->parent_item . ' &mdash;', 'tab_index' => 3 ) ); ?>
+					<input type="button" id="<?php echo $taxonomy->name; ?>-add-submit" class="add:<?php echo $taxonomy->name ?>checklist:<?php echo $taxonomy->name ?>-add button category-add-sumbit" value="<?php echo esc_attr( $taxonomy->labels->add_new_item ); ?>" tabindex="3" />
+					<?php wp_nonce_field( 'add-'.$taxonomy->name, '_ajax_nonce-add-'.$taxonomy->name, false ); ?>
+					<span id="<?php echo $taxonomy->name; ?>-ajax-response"></span>
+				</p>
+			</div>
+	<?php endif; ?>
+	</div>
+<?php
+}
+
+/**
+ * Display post format form elements.
+ *
+ * @since 3.1.0
+ *
+ * @param object $post
+ */
+function post_format_meta_box( $post, $box ) {
+	
+	if ( !current_theme_supports( 'post-formats' ) || !post_type_supports( $post->post_type, 'post-formats' ) )
+		return;
+		
+	$post_formats = get_theme_support( 'post-formats' );
+
+	if ( !is_array( $post_formats[0] ) )
+		return;
+		
+	$post_format = get_post_format( $post->ID );
+		
+	if ( !$post_format )
+		$post_format = '0';
+	// Add in the current one if it isn't there yet, in case the current theme doesn't support it
+	if ( $post_format && !in_array( $post_format, $post_formats[0] ) )
+		$post_formats[0][] = $post_format;
+	
+	?>
+	<div id="post-formats-select">
+		<input type="radio" name="post_format" class="post-format" id="post-format-0" value="0" <?php checked( $post_format, '0' ); ?> /> <label for="post-format-0"><?php _e('Standard'); ?></label>
+		<?php foreach ( $post_formats[0] as $format ) : ?>
+		<br /><input type="radio" name="post_format" class="post-format" id="post-format-<?php echo esc_attr( $format ); ?>" value="<?php echo esc_attr( $format ); ?>" <?php checked( $post_format, $format ); ?> /> <label for="post-format-<?php echo esc_attr( $format ); ?>"><?php echo esc_html( get_post_format_string( $format ) ); ?></label>
+		<?php endforeach; ?><br />
+	</div>
+<?php
+}
+
+/**
+ * Display post tags form fields.
+ *
+ * @since 2.6.0
+ *
+ * @param object $post
+ * 
+ */
+function post_tags_meta_box($post, $box) {
+
+	if ( !isset( $box['args'] ) || !is_array( $box['args'] ) )
+		$box['args'] = array();
+
+	$box['args']['taxonomy'] = 'post_tag';
+	
+	_deprecated_function( 'post_tags_meta_box', '3.4', 'post_taxonomy_meta_box' );
+	post_taxonomy_meta_box( $post, $box );
+	
+}
+
+/**
+ * Display post categories form fields.
+ *
+ * @since 2.6.0
+ *
+ * @param object $post
+ */
+function post_categories_meta_box( $post, $box ) {
+
+	if ( !isset( $box['args'] ) || !is_array( $box['args'] ) )
+		$box['args'] = array();
+
+	$box['args']['taxonomy'] = 'category';
+
+	_deprecated_function( 'post_categories_meta_box', '3.4', 'post_taxonomy_meta_box' );
+	post_taxonomy_meta_box( $post, $box );
+
+}
+
+/**
  * Display post excerpt form fields.
  *
  * @since 2.6.0
Index: wp-admin/edit-form-advanced.php
===================================================================
--- wp-admin/edit-form-advanced.php	(revision 20037)
+++ wp-admin/edit-form-advanced.php	(working copy)
@@ -109,13 +109,9 @@
 	$taxonomy = get_taxonomy($tax_name);
 	if ( ! $taxonomy->show_ui )
 		continue;
-
-	$label = $taxonomy->labels->name;
-
-	if ( !is_taxonomy_hierarchical($tax_name) )
-		add_meta_box('tagsdiv-' . $tax_name, $label, 'post_tags_meta_box', null, 'side', 'core', array( 'taxonomy' => $tax_name ));
-	else
-		add_meta_box($tax_name . 'div', $label, 'post_categories_meta_box', null, 'side', 'core', array( 'taxonomy' => $tax_name ));
+	
+	add_meta_box( $tax_name . 'div', $taxonomy->labels->name, 'post_taxonomy_meta_box', null, 'side', 'core', array( 'taxonomy' => $tax_name ));
+	
 }
 
 if ( post_type_supports($post_type, 'page-attributes') )
