Index: wp-admin/includes/class-wp-posts-list-table.php
===================================================================
--- wp-admin/includes/class-wp-posts-list-table.php	(revision 21372)
+++ wp-admin/includes/class-wp-posts-list-table.php	(working copy)
@@ -269,12 +269,40 @@
 		if ( post_type_supports( $post_type, 'author' ) )
 			$posts_columns['author'] = __( 'Author' );
 
-		if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'category' ) )
+		$this->taxonomy_columns = array();
+
+		if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'category' ) ) {
 			$posts_columns['categories'] = __( 'Categories' );
+			$this->taxonomy_columns[] = 'categories';
+		}
 
-		if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'post_tag' ) )
+		if ( empty( $post_type ) || is_object_in_taxonomy( $post_type, 'post_tag' ) ) {
 			$posts_columns['tags'] = __( 'Tags' );
+			$this->taxonomy_columns[] = 'tags';
+		}
 
+		$post_type_object = get_post_type_object( $post_type );
+		$registered_taxonomies = get_object_taxonomies( $post_type );
+
+		if ( $post_type_object->show_taxonomy_columns && is_array( $post_type_object->show_taxonomy_columns ) )
+			$taxonomies = $post_type_object->show_taxonomy_columns;
+		elseif ( $post_type_object->show_taxonomy_columns )
+			$taxonomies = $registered_taxonomies;
+		else
+			$taxonomies = array();
+
+		$custom_taxonomies = array_diff( $taxonomies, array( 'category', 'post_tag' ) );
+		$this->taxonomy_columns = array_merge( $this->taxonomy_columns, $custom_taxonomies );
+		$this->taxonomy_columns = apply_filters( 'show_taxonomy_columns', $this->taxonomy_columns, $post_type );
+
+		foreach ( $this->taxonomy_columns as $taxonomy ) {
+			if ( ! in_array( $taxonomy, $registered_taxonomies ) )
+				continue;
+
+			$taxonomy_object = get_taxonomy( $taxonomy );
+			$posts_columns[ $taxonomy ] = $taxonomy_object->labels->name;
+		}
+
 		$post_status = !empty( $_REQUEST['post_status'] ) ? $_REQUEST['post_status'] : 'all';
 		if ( post_type_supports( $post_type, 'comments' ) && !in_array( $post_status, array( 'pending', 'draft', 'future' ) ) )
 			$posts_columns['comments'] = '<span class="vers"><img alt="' . esc_attr__( 'Comments' ) . '" src="' . esc_url( admin_url( 'images/comment-grey-bubble.png' ) ) . '" /></span>';
@@ -529,7 +557,7 @@
 				}
 				else {
 					$attributes = 'class="post-title page-title column-title"' . $style;
-					
+
 					$pad = str_repeat( '&#8212; ', $level );
 ?>
 			<td <?php echo $attributes ?>><strong><?php if ( $can_edit_post && $post->post_status != 'trash' ) { ?><a class="row-title" href="<?php echo $edit_link; ?>" title="<?php echo esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $title ) ); ?>"><?php echo $pad; echo $title ?></a><?php } else { echo $pad; echo $title; }; _post_states( $post ); ?></strong>
@@ -603,43 +631,29 @@
 				echo '</td>';
 			break;
 
-			case 'categories':
-			?>
-			<td <?php echo $attributes ?>><?php
-				$categories = get_the_category();
-				if ( !empty( $categories ) ) {
-					$out = array();
-					foreach ( $categories as $c ) {
-						$out[] = sprintf( '<a href="%s">%s</a>',
-							esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'category_name' => $c->slug ), 'edit.php' ) ),
-							esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'category', 'display' ) )
-						);
-					}
-					/* translators: used between list items, there is a space after the comma */
-					echo join( __( ', ' ), $out );
-				} else {
-					_e( 'Uncategorized' );
-				}
-			?></td>
-			<?php
-			break;
+			case ( in_array( $column_name, $this->taxonomy_columns ) ) :
+				$taxonomy = $column_name;
+				if ( 'categories' == $column_name )
+					$taxonomy = 'category';
+				elseif ( 'tags' == $column_name )
+					$taxonomy = 'post_tag';
 
-			case 'tags':
+				$taxonomy_object = get_taxonomy( $taxonomy );
 			?>
 			<td <?php echo $attributes ?>><?php
-				$tags = get_the_tags( $post->ID );
-				if ( !empty( $tags ) ) {
+				$terms = get_the_terms( $post->ID, $taxonomy );
+				if ( !empty( $terms ) ) {
 					$out = array();
-					foreach ( $tags as $c ) {
+					foreach ( $terms as $t ) {
 						$out[] = sprintf( '<a href="%s">%s</a>',
-							esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'tag' => $c->slug ), 'edit.php' ) ),
-							esc_html( sanitize_term_field( 'name', $c->name, $c->term_id, 'tag', 'display' ) )
+							esc_url( add_query_arg( array( 'post_type' => $post->post_type, $taxonomy_object->query_var => $t->slug ), 'edit.php' ) ),
+							esc_html( sanitize_term_field( 'name', $t->name, $t->term_id, $taxonomy, 'display' ) )
 						);
 					}
 					/* translators: used between list items, there is a space after the comma */
 					echo join( __( ', ' ), $out );
 				} else {
-					_e( 'No Tags' );
+					echo $taxonomy_object->labels->no_items;
 				}
 			?></td>
 			<?php
@@ -679,8 +693,8 @@
 			?></td>
 			<?php
 			break;
+			}
 		}
-	}
 	?>
 		</tr>
 	<?php
Index: wp-includes/post.php
===================================================================
--- wp-includes/post.php	(revision 21372)
+++ wp-includes/post.php	(working copy)
@@ -980,7 +980,8 @@
 		'_builtin' => false, '_edit_link' => 'post.php?post=%d', 'hierarchical' => false,
 		'public' => false, 'rewrite' => true, 'has_archive' => false, 'query_var' => true,
 		'supports' => array(), 'register_meta_box_cb' => null,
-		'taxonomies' => array(), 'show_ui' => null, 'menu_position' => null, 'menu_icon' => null,
+		'taxonomies' => array(), 'show_taxonomy_columns' => false,
+		'show_ui' => null, 'menu_position' => null, 'menu_icon' => null,
 		'can_export' => true,
 		'show_in_nav_menus' => null, 'show_in_menu' => null, 'show_in_admin_bar' => null,
 		'delete_with_user' => null,
Index: wp-includes/taxonomy.php
===================================================================
--- wp-includes/taxonomy.php	(revision 21372)
+++ wp-includes/taxonomy.php	(working copy)
@@ -416,6 +416,7 @@
 		'search_items' => array( __( 'Search Tags' ), __( 'Search Categories' ) ),
 		'popular_items' => array( __( 'Popular Tags' ), null ),
 		'all_items' => array( __( 'All Tags' ), __( 'All Categories' ) ),
+		'no_items' => array( __( 'No Tags' ), __( 'No Categories' ) ),
 		'parent_item' => array( null, __( 'Parent Category' ) ),
 		'parent_item_colon' => array( null, __( 'Parent Category:' ) ),
 		'edit_item' => array( __( 'Edit Tag' ), __( 'Edit Category' ) ),
