Index: class-wp-comments-list-table.php
===================================================================
--- class-wp-comments-list-table.php	(revision 25762)
+++ class-wp-comments-list-table.php	(working copy)
@@ -273,6 +273,10 @@
 		);
 	}
 
+	function get_primary_column() {
+		return( 'comment' );
+	}
+
 	function display() {
 		extract( $this->_args );
 
@@ -381,70 +385,6 @@
 		</div>
 		<?php
 		}
-
-		if ( $user_can ) {
-			// preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash
-			$actions = array(
-				'approve' => '', 'unapprove' => '',
-				'reply' => '',
-				'quickedit' => '',
-				'edit' => '',
-				'spam' => '', 'unspam' => '',
-				'trash' => '', 'untrash' => '', 'delete' => ''
-			);
-
-			if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments
-				if ( 'approved' == $the_comment_status )
-					$actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=unapproved' class='vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
-				else if ( 'unapproved' == $the_comment_status )
-					$actions['approve'] = "<a href='$approve_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=approved' class='vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
-			} else {
-				$actions['approve'] = "<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
-				$actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
-			}
-
-			if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
-				$actions['spam'] = "<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';
-			} elseif ( 'spam' == $the_comment_status ) {
-				$actions['unspam'] = "<a href='$unspam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1' class='vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';
-			} elseif ( 'trash' == $the_comment_status ) {
-				$actions['untrash'] = "<a href='$untrash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1' class='vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';
-			}
-
-			if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {
-				$actions['delete'] = "<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::delete=1' class='delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';
-			} else {
-				$actions['trash'] = "<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';
-			}
-
-			if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
-				$actions['edit'] = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';
-				$actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick&nbsp;Edit' ) . '</a>';
-				$actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';
-			}
-
-			$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );
-
-			$i = 0;
-			echo '<div class="row-actions">';
-			foreach ( $actions as $action => $link ) {
-				++$i;
-				( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
-
-				// Reply and quickedit need a hide-if-no-js span when not added with ajax
-				if ( ( 'reply' == $action || 'quickedit' == $action ) && ! defined('DOING_AJAX') )
-					$action .= ' hide-if-no-js';
-				elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {
-					if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )
-						$action .= ' approve';
-					else
-						$action .= ' unapprove';
-				}
-
-				echo "<span class='$action'>$sep$link</span>";
-			}
-			echo '</div>';
-		}
 	}
 
 	function column_author( $comment ) {
@@ -512,6 +452,81 @@
 	function column_default( $comment, $column_name ) {
 		do_action( 'manage_comments_custom_column', $column_name, $comment->comment_ID );
 	}
+
+	function handle_actions( $comment, $column_name, $primary ) {
+		global $comment_status;
+		$post = get_post();
+
+		$user_can = $this->user_can;
+
+		$comment_url = esc_url( get_comment_link( $comment->comment_ID ) );
+		$the_comment_status = wp_get_comment_status( $comment->comment_ID );
+
+		if ( $user_can ) {
+			// preorder it: Approve | Reply | Quick Edit | Edit | Spam | Trash
+			$actions = array(
+				'approve' => '', 'unapprove' => '',
+				'reply' => '',
+				'quickedit' => '',
+				'edit' => '',
+				'spam' => '', 'unspam' => '',
+				'trash' => '', 'untrash' => '', 'delete' => ''
+			);
+
+			if ( $comment_status && 'all' != $comment_status ) { // not looking at all comments
+				if ( 'approved' == $the_comment_status )
+					$actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=unapproved' class='vim-u vim-destructive' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
+				else if ( 'unapproved' == $the_comment_status )
+					$actions['approve'] = "<a href='$approve_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:e7e7d3:action=dim-comment&amp;new=approved' class='vim-a vim-destructive' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
+			} else {
+				$actions['approve'] = "<a href='$approve_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=approved' class='vim-a' title='" . esc_attr__( 'Approve this comment' ) . "'>" . __( 'Approve' ) . '</a>';
+				$actions['unapprove'] = "<a href='$unapprove_url' data-wp-lists='dim:the-comment-list:comment-$comment->comment_ID:unapproved:e7e7d3:e7e7d3:new=unapproved' class='vim-u' title='" . esc_attr__( 'Unapprove this comment' ) . "'>" . __( 'Unapprove' ) . '</a>';
+			}
+
+			if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
+				$actions['spam'] = "<a href='$spam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::spam=1' class='vim-s vim-destructive' title='" . esc_attr__( 'Mark this comment as spam' ) . "'>" . /* translators: mark as spam link */ _x( 'Spam', 'verb' ) . '</a>';
+			} elseif ( 'spam' == $the_comment_status ) {
+				$actions['unspam'] = "<a href='$unspam_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:unspam=1' class='vim-z vim-destructive'>" . _x( 'Not Spam', 'comment' ) . '</a>';
+			} elseif ( 'trash' == $the_comment_status ) {
+				$actions['untrash'] = "<a href='$untrash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID:66cc66:untrash=1' class='vim-z vim-destructive'>" . __( 'Restore' ) . '</a>';
+			}
+
+			if ( 'spam' == $the_comment_status || 'trash' == $the_comment_status || !EMPTY_TRASH_DAYS ) {
+				$actions['delete'] = "<a href='$delete_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::delete=1' class='delete vim-d vim-destructive'>" . __( 'Delete Permanently' ) . '</a>';
+			} else {
+				$actions['trash'] = "<a href='$trash_url' data-wp-lists='delete:the-comment-list:comment-$comment->comment_ID::trash=1' class='delete vim-d vim-destructive' title='" . esc_attr__( 'Move this comment to the trash' ) . "'>" . _x( 'Trash', 'verb' ) . '</a>';
+			}
+
+			if ( 'spam' != $the_comment_status && 'trash' != $the_comment_status ) {
+				$actions['edit'] = "<a href='comment.php?action=editcomment&amp;c={$comment->comment_ID}' title='" . esc_attr__( 'Edit comment' ) . "'>". __( 'Edit' ) . '</a>';
+				$actions['quickedit'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\',\'edit\' );return false;" class="vim-q" title="'.esc_attr__( 'Quick Edit' ).'" href="#">' . __( 'Quick&nbsp;Edit' ) . '</a>';
+				$actions['reply'] = '<a onclick="commentReply.open( \''.$comment->comment_ID.'\',\''.$post->ID.'\' );return false;" class="vim-r" title="'.esc_attr__( 'Reply to this comment' ).'" href="#">' . __( 'Reply' ) . '</a>';
+			}
+
+			$actions = apply_filters( 'comment_row_actions', array_filter( $actions ), $comment );
+
+			$i = 0;
+			echo '<div class="row-actions">';
+			foreach ( $actions as $action => $link ) {
+				++$i;
+				( ( ( 'approve' == $action || 'unapprove' == $action ) && 2 === $i ) || 1 === $i ) ? $sep = '' : $sep = ' | ';
+
+				// Reply and quickedit need a hide-if-no-js span when not added with ajax
+				if ( ( 'reply' == $action || 'quickedit' == $action ) && ! defined('DOING_AJAX') )
+					$action .= ' hide-if-no-js';
+				elseif ( ( $action == 'untrash' && $the_comment_status == 'trash' ) || ( $action == 'unspam' && $the_comment_status == 'spam' ) ) {
+					if ( '1' == get_comment_meta( $comment->comment_ID, '_wp_trash_meta_status', true ) )
+						$action .= ' approve';
+					else
+						$action .= ' unapprove';
+				}
+
+				echo "<span class='$action'>$sep$link</span>";
+			}
+			echo '</div>';
+		}
+	}
+
 }
 
 /**
Index: class-wp-list-table.php
===================================================================
--- class-wp-list-table.php	(revision 25762)
+++ class-wp-list-table.php	(working copy)
@@ -600,6 +600,15 @@
 	}
 
 	/**
+	 * Get name of primary column.
+	 *
+	 * @return string
+	 */
+    function get_primary_column() {
+		return( '' );
+	}
+
+	/**
 	 * Get a list of all, hidden and sortable columns, with filter applied
 	 *
 	 * @since 3.1.0
@@ -628,8 +637,10 @@
 			$sortable[$id] = $data;
 		}
 
-		$this->_column_headers = array( $columns, $hidden, $sortable );
+		$primary = $this->get_primary_column();
 
+		$this->_column_headers = array( $columns, $hidden, $sortable, $primary );
+
 		return $this->_column_headers;
 	}
 
@@ -849,10 +860,13 @@
 	 * @param object $item The current item
 	 */
 	function single_row_columns( $item ) {
-		list( $columns, $hidden ) = $this->get_column_info();
-
+		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
 		foreach ( $columns as $column_name => $column_display_name ) {
-			$class = "class='$column_name column-$column_name'";
+			if ( $primary == $column_name ) {
+				$class = "class='$column_name column-$column_name has-row-actions'";
+			} else {
+				$class = "class='$column_name column-$column_name'";
+			}
 
 			$style = '';
 			if ( in_array( $column_name, $hidden ) )
@@ -868,6 +882,9 @@
 			elseif ( method_exists( $this, 'column_' . $column_name ) ) {
 				echo "<td $attributes>";
 				echo call_user_func( array( $this, 'column_' . $column_name ), $item );
+				if( $primary == $column_name ) {
+					echo $this->handle_actions( $item, $column_name, $primary );
+				}
 				echo "</td>";
 			}
 			else {
@@ -879,6 +896,12 @@
 	}
 
 	/**
+	 * Generate and display row actions links
+	 */
+	function handle_actions( $post, $column_name, $primary_column ) {
+	}
+
+	/**
 	 * Handle an incoming ajax request (called from admin-ajax.php)
 	 *
 	 * @since 3.1.0
Index: class-wp-media-list-table.php
===================================================================
--- class-wp-media-list-table.php	(revision 25762)
+++ class-wp-media-list-table.php	(working copy)
@@ -194,10 +194,15 @@
 	<tr id='post-<?php echo $post->ID; ?>' class='<?php echo trim( $alt . ' author-' . $post_owner . ' status-' . $post->post_status ); ?>' valign="top">
 <?php
 
-list( $columns, $hidden ) = $this->get_column_info();
+list( $columns, $hidden, $sortable, $primary_column ) = $this->get_column_info();
 foreach ( $columns as $column_name => $column_display_name ) {
-	$class = "class='$column_name column-$column_name'";
 
+	if( $primary_column == $column_name ) {
+		$class = "class='$column_name column-$column_name has-row-actions'";
+	} else {
+		$class = "class='$column_name column-$column_name'";
+	}
+
 	$style = '';
 	if ( in_array( $column_name, $hidden ) )
 		$style = ' style="display:none;"';
@@ -257,7 +262,9 @@
 ?>
 			</p>
 <?php
-		echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
 ?>
 		</td>
 <?php
@@ -270,6 +277,9 @@
 				esc_url( add_query_arg( array( 'author' => get_the_author_meta('ID') ), 'upload.php' ) ),
 				get_the_author()
 			);
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
 		?></td>
 <?php
 		break;
@@ -276,8 +286,12 @@
 
 	case 'desc':
 ?>
-		<td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?></td>
+		<td <?php echo $attributes ?>><?php echo has_excerpt() ? $post->post_excerpt : ''; ?>
 <?php
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
+		echo '</td>';
 		break;
 
 	case 'date':
@@ -296,8 +310,12 @@
 			}
 		}
 ?>
-		<td <?php echo $attributes ?>><?php echo $h_time ?></td>
+		<td <?php echo $attributes ?>><?php echo $h_time ?>
 <?php
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
+		echo '</td>';
 		break;
 
 	case 'parent':
@@ -318,7 +336,6 @@
 					echo $title;
 				} ?></strong>,
 				<?php echo get_the_time( __( 'Y/m/d' ) ); ?>
-			</td>
 <?php
 		} else {
 ?>
@@ -328,9 +345,13 @@
 					onclick="findPosts.open( 'media[]','<?php echo $post->ID ?>' ); return false;"
 					href="#the-list">
 					<?php _e( 'Attach' ); ?></a>
-			<?php } ?></td>
+			<?php } ?>
 <?php
 		}
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
+		echo '</td>';
 		break;
 
 	case 'comments':
@@ -344,8 +365,11 @@
 		$this->comments_bubble( $post->ID, $pending_comments );
 ?>
 			</div>
-		</td>
 <?php
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
+		echo '</td>';
 		break;
 
 	default:
@@ -378,12 +402,21 @@
 			} else {
 				echo '&#8212;';
 			}
+
+			if( $primary_column == $column_name ) {
+				echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+			}
 			echo '</td>';
 			break;
 		}
 ?>
 		<td <?php echo $attributes ?>>
-			<?php do_action( 'manage_media_custom_column', $column_name, $post->ID ); ?>
+<?php
+		do_action( 'manage_media_custom_column', $column_name, $post->ID );
+		if( $primary_column == $column_name ) {
+			echo $this->row_actions( $this->_get_row_actions( $post, $att_title ) );
+		}
+?>
 		</td>
 <?php
 		break;
@@ -394,6 +427,10 @@
 <?php endwhile;
 	}
 
+    function get_primary_column() {
+		return( 'title' );
+	}
+
 	function _get_row_actions( $post, $att_title ) {
 		$actions = array();
 
Index: class-wp-ms-sites-list-table.php
===================================================================
--- class-wp-ms-sites-list-table.php	(revision 25762)
+++ class-wp-ms-sites-list-table.php	(working copy)
@@ -167,6 +167,10 @@
 		);
 	}
 
+	function get_primary_column() {
+		return( 'blogname' );
+	}
+
 	function display_rows() {
 		global $current_site, $mode;
 
@@ -204,9 +208,10 @@
 
 			$blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];
 
-			list( $columns, $hidden ) = $this->get_column_info();
+			list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
 
 			foreach ( $columns as $column_name => $column_display_name ) {
+				$is_primary = ( $primary == $column_name );
 				$style = '';
 				if ( in_array( $column_name, $hidden ) )
 					$style = ' style="display:none;"';
@@ -230,7 +235,12 @@
 					break;
 
 					case 'blogname':
-						echo "<td class='column-$column_name $column_name'$style>"; ?>
+						if( $is_primary ) {
+							echo "<td class='column-$column_name $column_name has-row-actions'$style>";
+						} else {
+							echo "<td class='column-$column_name $column_name'$style>";
+						}
+					?>
 							<a href="<?php echo esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ); ?>" class="edit"><?php echo $blogname . $blog_state; ?></a>
 							<?php
 							if ( 'list' != $mode ) {
@@ -239,42 +249,8 @@
 								restore_current_blog();
 							}
 
-							// Preordered.
-							$actions = array(
-								'edit' => '', 'backend' => '',
-								'activate' => '', 'deactivate' => '',
-								'archive' => '', 'unarchive' => '',
-								'spam' => '', 'unspam' => '',
-								'delete' => '',
-								'visit' => '',
-							);
+							$this->handle_actions( $blog, $column_name, $primary );
 
-							$actions['edit']	= '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';
-							$actions['backend']	= "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';
-							if ( $current_site->blog_id != $blog['blog_id'] ) {
-								if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )
-									$actions['activate']	= '<span class="activate"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=activateblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ), 'confirm' ) ) . '">' . __( 'Activate' ) . '</a></span>';
-								else
-									$actions['deactivate']	= '<span class="activate"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deactivateblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Deactivate' ) . '</a></span>';
-
-								if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )
-									$actions['unarchive']	= '<span class="archive"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unarchiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Unarchive' ) . '</a></span>';
-								else
-									$actions['archive']	= '<span class="archive"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=archiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';
-
-								if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )
-									$actions['unspam']	= '<span class="spam"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unspamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';
-								else
-									$actions['spam']	= '<span class="spam"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=spamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';
-
-								if ( current_user_can( 'delete_site', $blog['blog_id'] ) )
-									$actions['delete']	= '<span class="delete"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deleteblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Delete' ) . '</a></span>';
-							}
-
-							$actions['visit']	= "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'], '/' ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';
-
-							$actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname );
-							echo $this->row_actions( $actions );
 					?>
 						</td>
 					<?php
@@ -286,7 +262,9 @@
 								$date = 'Y/m/d';
 							else
 								$date = 'Y/m/d \<\b\r \/\> g:i:s a';
-							echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] ); ?>
+							echo ( $blog['last_updated'] == '0000-00-00 00:00:00' ) ? __( 'Never' ) : mysql2date( $date, $blog['last_updated'] );
+							$this->handle_actions( $blog, $column_name, $primary );
+						?>
 						</td>
 					<?php
 					break;
@@ -296,6 +274,8 @@
 							echo '&#x2014;';
 						else
 							echo mysql2date( $date, $blog['registered'] );
+
+						$this->handle_actions( $blog, $column_name, $primary );
 						?>
 						</td>
 					<?php
@@ -318,6 +298,7 @@
 								if ( $blogusers_warning != '' )
 									echo '<strong>' . $blogusers_warning . '</strong><br />';
 							}
+							$this->handle_actions( $blog, $column_name, $primary );
 							?>
 						</td>
 					<?php
@@ -326,7 +307,9 @@
 				case 'plugins': ?>
 					<?php if ( has_filter( 'wpmublogsaction' ) ) {
 					echo "<td valign='top' class='$column_name column-$column_name'$style>";
-						do_action( 'wpmublogsaction', $blog['blog_id'] ); ?>
+						do_action( 'wpmublogsaction', $blog['blog_id'] );
+						$this->handle_actions( $blog, $column_name, $primary );
+						?>
 					</td>
 					<?php }
 					break;
@@ -334,6 +317,7 @@
 				default:
 					echo "<td class='$column_name column-$column_name'$style>";
 					do_action( 'manage_sites_custom_column', $column_name, $blog['blog_id'] );
+					$this->handle_actions( $blog, $column_name, $primary );
 					echo "</td>";
 					break;
 				}
@@ -343,4 +327,47 @@
 			<?php
 		}
 	}
+
+	function handle_actions( $blog, $column_name, $primary ) {
+		global $current_site;
+		if( $primary == $column_name ) {
+			$blogname = ( is_subdomain_install() ) ? str_replace( '.'.$current_site->domain, '', $blog['domain'] ) : $blog['path'];
+			// Preordered.
+			$actions = array(
+				'edit' => '', 'backend' => '',
+				'activate' => '', 'deactivate' => '',
+				'archive' => '', 'unarchive' => '',
+				'spam' => '', 'unspam' => '',
+				'delete' => '',
+				'visit' => '',
+			);
+
+			$actions['edit']	= '<span class="edit"><a href="' . esc_url( network_admin_url( 'site-info.php?id=' . $blog['blog_id'] ) ) . '">' . __( 'Edit' ) . '</a></span>';
+			$actions['backend']	= "<span class='backend'><a href='" . esc_url( get_admin_url( $blog['blog_id'] ) ) . "' class='edit'>" . __( 'Dashboard' ) . '</a></span>';
+			if ( $current_site->blog_id != $blog['blog_id'] ) {
+				if ( get_blog_status( $blog['blog_id'], 'deleted' ) == '1' )
+					$actions['activate']	= '<span class="activate"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=activateblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to activate the site %s' ), $blogname ) ) ), 'confirm' ) ) . '">' . __( 'Activate' ) . '</a></span>';
+				else
+					$actions['deactivate']	= '<span class="activate"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deactivateblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to deactivate the site %s' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Deactivate' ) . '</a></span>';
+
+				if ( get_blog_status( $blog['blog_id'], 'archived' ) == '1' )
+					$actions['unarchive']	= '<span class="archive"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unarchiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to unarchive the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Unarchive' ) . '</a></span>';
+				else
+					$actions['archive']	= '<span class="archive"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=archiveblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to archive the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Archive', 'verb; site' ) . '</a></span>';
+
+				if ( get_blog_status( $blog['blog_id'], 'spam' ) == '1' )
+					$actions['unspam']	= '<span class="spam"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=unspamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to unspam the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Not Spam', 'site' ) . '</a></span>';
+				else
+					$actions['spam']	= '<span class="spam"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=spamblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to mark the site %s as spam.' ), $blogname ) ) ), 'confirm') ) . '">' . _x( 'Spam', 'site' ) . '</a></span>';
+
+				if ( current_user_can( 'delete_site', $blog['blog_id'] ) )
+					$actions['delete']	= '<span class="delete"><a href="' . esc_url( wp_nonce_url( network_admin_url( 'sites.php?action=confirm&amp;action2=deleteblog&amp;id=' . $blog['blog_id'] . '&amp;msg=' . urlencode( sprintf( __( 'You are about to delete the site %s.' ), $blogname ) ) ), 'confirm') ) . '">' . __( 'Delete' ) . '</a></span>';
+			}
+
+			$actions['visit']	= "<span class='view'><a href='" . esc_url( get_home_url( $blog['blog_id'], '/' ) ) . "' rel='permalink'>" . __( 'Visit' ) . '</a></span>';
+
+			$actions = apply_filters( 'manage_sites_action_links', array_filter( $actions ), $blog['blog_id'], $blogname );
+		echo $this->row_actions( $actions );
+		}
+	}
 }
Index: class-wp-ms-themes-list-table.php
===================================================================
--- class-wp-ms-themes-list-table.php	(revision 25762)
+++ class-wp-ms-themes-list-table.php	(working copy)
@@ -182,6 +182,10 @@
 		);
 	}
 
+	function get_primary_column() {
+		return( 'name' );
+	}
+
 	function get_views() {
 		global $totals, $status;
 
@@ -298,9 +302,10 @@
 
 		echo "<tr id='$id' class='$class'>";
 
-		list( $columns, $hidden ) = $this->get_column_info();
+		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
 
 		foreach ( $columns as $column_name => $column_display_name ) {
+			$is_primary = ( $primary == $column_name );
 			$style = '';
 			if ( in_array( $column_name, $hidden ) )
 				$style = ' style="display:none;"';
@@ -311,7 +316,7 @@
 					break;
 				case 'name':
 					echo "<td class='theme-title'$style><strong>" . $theme->display('Name') . "</strong>";
-					echo $this->row_actions( $actions, true );
+					if( $is_primary ) echo $this->row_actions( $actions, true );
 					echo "</td>";
 					break;
 				case 'description':
@@ -335,13 +340,16 @@
 
 					$theme_meta = apply_filters( 'theme_row_meta', $theme_meta, $stylesheet, $theme, $status );
 					echo implode( ' | ', $theme_meta );
+					echo "</div>";
 
-					echo "</div></td>";
+					if( $is_primary ) echo $this->row_actions( $actions, true );
+					echo "</td>";
 					break;
 
 				default:
 					echo "<td class='$column_name column-$column_name'$style>";
 					do_action( 'manage_themes_custom_column', $column_name, $stylesheet, $theme );
+					if( $is_primary ) echo $this->row_actions( $actions, true );
 					echo "</td>";
 			}
 		}
Index: class-wp-ms-users-list-table.php
===================================================================
--- class-wp-ms-users-list-table.php	(revision 25762)
+++ class-wp-ms-users-list-table.php	(working copy)
@@ -132,6 +132,10 @@
 		);
 	}
 
+	function get_primary_column() {
+		return( 'username' );
+	}
+
 	function display_rows() {
 		global $current_site, $mode;
 
@@ -151,10 +155,15 @@
 			<tr class="<?php echo $alt; ?>">
 			<?php
 
-			list( $columns, $hidden ) = $this->get_column_info();
+			list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
 
 			foreach ( $columns as $column_name => $column_display_name ) :
-				$class = "class='$column_name column-$column_name'";
+				$is_primary = ($primary == $column_name);
+				if( $is_primary ) {
+					$class = "class='$column_name column-$column_name has-row-actions'";
+				} else {
+					$class = "class='$column_name column-$column_name'";
+				}
 
 				$style = '';
 				if ( in_array( $column_name, $hidden ) )
@@ -182,15 +191,7 @@
 							?></strong>
 							<br/>
 							<?php
-								$actions = array();
-								$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
-
-								if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins ) ) {
-									$actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
-								}
-
-								$actions = apply_filters( 'ms_user_row_actions', $actions, $user );
-								echo $this->row_actions( $actions );
+							$this->handle_actions( $user, $column_name, $primary );
 							?>
 						</td>
 					<?php
@@ -197,11 +198,15 @@
 					break;
 
 					case 'name':
-						echo "<td $attributes>$user->first_name $user->last_name</td>";
+						echo "<td $attributes>$user->first_name $user->last_name";
+						$this->handle_actions( $user, $column_name, $primary );
+						echo "</td>";
 					break;
 
 					case 'email':
-						echo "<td $attributes><a href='mailto:$user->user_email'>$user->user_email</a></td>";
+						echo "<td $attributes><a href='mailto:$user->user_email'>$user->user_email</a>";
+						$this->handle_actions( $user, $column_name, $primary );
+						echo "</td>";
 					break;
 
 					case 'registered':
@@ -210,7 +215,9 @@
 						else
 							$date = 'Y/m/d \<\b\r \/\> g:i:s a';
 
-						echo "<td $attributes>" . mysql2date( $date, $user->user_registered ) . "</td>";
+						echo "<td $attributes>" . mysql2date( $date, $user->user_registered );
+						$this->handle_actions( $user, $column_name, $primary );
+						echo "</td>";
 					break;
 
 					case 'blogs':
@@ -252,6 +259,7 @@
 									echo '</small></span><br/>';
 								}
 							}
+						$this->handle_actions( $user, $column_name, $primary );
 							?>
 						</td>
 					<?php
@@ -260,6 +268,7 @@
 					default:
 						echo "<td $attributes>";
 						echo apply_filters( 'manage_users_custom_column', '', $column_name, $user->ID );
+						$this->handle_actions( $user, $column_name, $primary );
 						echo "</td>";
 					break;
 				}
@@ -269,4 +278,21 @@
 			<?php
 		}
 	}
+
+
+	function handle_actions( $user, $column_name, $primary ) {
+		$super_admins = get_super_admins();
+		if( $primary == $column_name ) {
+			$actions = array();
+			$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
+
+			if ( current_user_can( 'delete_user', $user->ID ) && ! in_array( $user->user_login, $super_admins ) ) {
+				$actions['delete'] = '<a href="' . $delete = esc_url( network_admin_url( add_query_arg( '_wp_http_referer', urlencode( wp_unslash( $_SERVER['REQUEST_URI'] ) ), wp_nonce_url( 'users.php', 'deleteuser' ) . '&amp;action=deleteuser&amp;id=' . $user->ID ) ) ) . '" class="delete">' . __( 'Delete' ) . '</a>';
+			}
+
+			$actions = apply_filters( 'ms_user_row_actions', $actions, $user );
+			echo $this->row_actions( $actions );
+		}
+	}
+
 }
Index: class-wp-plugins-list-table.php
===================================================================
--- class-wp-plugins-list-table.php	(revision 25762)
+++ class-wp-plugins-list-table.php	(working copy)
@@ -384,7 +384,7 @@
 
 		echo "<tr id='$id' class='$class'>";
 
-		list( $columns, $hidden ) = $this->get_column_info();
+		list( $columns, $hidden, $sortable, $primary ) = $this->get_column_info();
 
 		foreach ( $columns as $column_name => $column_display_name ) {
 			$style = '';
@@ -396,14 +396,22 @@
 					echo "<th scope='row' class='check-column'>$checkbox</th>";
 					break;
 				case 'name':
-					echo "<td class='plugin-title'$style><strong>$plugin_name</strong>";
-					echo $this->row_actions( $actions, true );
+					if( $primary == $column_name ) {
+						echo "<td class='plugin-title has-row-actions'$style><strong>$plugin_name</strong>";
+						echo $this->row_actions( $actions, true );
+					} else {
+						echo "<td class='plugin-title'$style><strong>$plugin_name</strong>";
+					}
 					echo "</td>";
 					break;
 				case 'description':
-					echo "<td class='column-description desc'$style>
-						<div class='plugin-description'>$description</div>
-						<div class='$class second plugin-version-author-uri'>";
+					if( $primary == $column_name ) {
+						echo "<td class='column-description desc has-row-actions'$style>";
+					} else {
+						echo "<td class='column-description desc'$style>";
+					}
+					echo "<div class='plugin-description'>$description</div>
+						  <div class='$class second plugin-version-author-uri'>";
 
 					$plugin_meta = array();
 					if ( !empty( $plugin_data['Version'] ) )
@@ -420,6 +428,9 @@
 					$plugin_meta = apply_filters( 'plugin_row_meta', $plugin_meta, $plugin_file, $plugin_data, $status );
 					echo implode( ' | ', $plugin_meta );
 
+					if( $primary == $column_name ) {
+						echo $this->row_actions( $actions, true );
+					}
 					echo "</div></td>";
 					break;
 				default:
@@ -434,4 +445,8 @@
 		do_action( 'after_plugin_row', $plugin_file, $plugin_data, $status );
 		do_action( "after_plugin_row_$plugin_file", $plugin_file, $plugin_data, $status );
 	}
+
+	function get_primary_column() {
+		return( 'name' );
+	}
 }
Index: class-wp-posts-list-table.php
===================================================================
--- class-wp-posts-list-table.php	(revision 25762)
+++ class-wp-posts-list-table.php	(working copy)
@@ -495,11 +495,16 @@
 		<tr id="post-<?php echo $post->ID; ?>" class="<?php echo implode( ' ', get_post_class( $classes, $post->ID ) ); ?>" valign="top">
 	<?php
 
-		list( $columns, $hidden ) = $this->get_column_info();
+		list( $columns, $hidden, $sortable, $primary_column ) = $this->get_column_info();
 
 		foreach ( $columns as $column_name => $column_display_name ) {
-			$class = "class=\"$column_name column-$column_name\"";
 
+			if ( $primary_column == $column_name ) {
+				$class = "class=\"$column_name column-$column_name has-row-actions\"";
+			} else {
+				$class = "class=\"$column_name column-$column_name\"";
+			}
+
 			$style = '';
 			if ( in_array( $column_name, $hidden ) )
 				$style = ' style="display:none;"';
@@ -526,7 +531,13 @@
 			break;
 
 			case 'title':
-				$attributes = 'class="post-title page-title column-title"' . $style;
+				if ( $primary_column == $column_name ) {
+					$attributes = 'class="post-title page-title column-title has_row_actions"';
+				} else {
+					$attributes = 'class="post-title page-title column-title"';
+				}
+				$attributes .= $style;
+
 				if ( $this->hierarchical_display ) {
 					if ( 0 == $level && (int) $post->post_parent > 0 ) {
 						//sent level 0 by accident, by default, or because we don't know the actual level
@@ -581,6 +592,7 @@
 				if ( ! $this->hierarchical_display && 'excerpt' == $mode && current_user_can( 'read_post', $post->ID ) )
 						the_excerpt();
 
+				/*
 				$actions = array();
 				if ( $can_edit_post && 'trash' != $post->post_status ) {
 					$actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '" title="' . esc_attr( __( 'Edit this item' ) ) . '">' . __( 'Edit' ) . '</a>';
@@ -605,6 +617,8 @@
 
 				$actions = apply_filters( is_post_type_hierarchical( $post->post_type ) ? 'page_row_actions' : 'post_row_actions', $actions, $post );
 				echo $this->row_actions( $actions );
+*/
+				$this->handle_actions( $post, $column_name, $primary_column );
 
 				get_inline_data( $post );
 				echo '</td>';
@@ -643,6 +657,7 @@
 				} else {
 					_e( 'Last Modified' );
 				}
+				$this->handle_actions( $post, $column_name, $primary_column );
 				echo '</td>';
 			break;
 
@@ -654,7 +669,7 @@
 
 				$this->comments_bubble( $post->ID, $pending_comments );
 			?>
-			</div></td>
+			</div> <?php $this->handle_actions( $post, $column_name, $primary_column ); ?> </td>
 			<?php
 			break;
 
@@ -665,6 +680,7 @@
 					esc_url( add_query_arg( array( 'post_type' => $post->post_type, 'author' => get_the_author_meta( 'ID' ) ), 'edit.php' )),
 					get_the_author()
 				);
+				$this->handle_actions( $post, $column_name, $primary_column );
 			?></td>
 			<?php
 			break;
@@ -705,6 +721,8 @@
 					} else {
 						echo '&#8212;';
 					}
+
+					$this->handle_actions( $post, $column_name, $primary_column );
 					echo '</td>';
 					break;
 				}
@@ -715,6 +733,7 @@
 				else
 					do_action( 'manage_posts_custom_column', $column_name, $post->ID );
 				do_action( "manage_{$post->post_type}_posts_custom_column", $column_name, $post->ID );
+				$this->handle_actions( $post, $column_name, $primary_column );
 			?></td>
 			<?php
 			break;
@@ -726,6 +745,41 @@
 		$GLOBALS['post'] = $global_post;
 	}
 
+    function get_primary_column() {
+		return( 'title' );
+	}
+
+	function handle_actions( $post, $column_name, $primary_column ) {
+		if ( $primary_column == $column_name ) {
+			$post_type_object = get_post_type_object( $post->post_type );
+			$can_edit_post = current_user_can( 'edit_post', $post->ID );
+			$actions = array();
+			if ( $can_edit_post && 'trash' != $post->post_status ) {
+				$actions['edit'] = '<a href="' . get_edit_post_link( $post->ID, true ) . '" title="' . esc_attr( __( 'Edit this item' ) ) . '">' . __( 'Edit' ) . '</a>';
+				$actions['inline hide-if-no-js'] = '<a href="#" class="editinline" title="' . esc_attr( __( 'Edit this item inline' ) ) . '">' . __( 'Quick&nbsp;Edit' ) . '</a>';
+			}
+			if ( current_user_can( 'delete_post', $post->ID ) ) {
+				if ( 'trash' == $post->post_status )
+					$actions['untrash'] = "<a title='" . esc_attr( __( 'Restore this item from the Trash' ) ) . "' href='" . wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $post->ID ) ), 'untrash-post_' . $post->ID ) . "'>" . __( 'Restore' ) . "</a>";
+				elseif ( EMPTY_TRASH_DAYS )
+					$actions['trash'] = "<a class='submitdelete' title='" . esc_attr( __( 'Move this item to the Trash' ) ) . "' href='" . get_delete_post_link( $post->ID ) . "'>" . __( 'Trash' ) . "</a>";
+				if ( 'trash' == $post->post_status || !EMPTY_TRASH_DAYS )
+					$actions['delete'] = "<a class='submitdelete' title='" . esc_attr( __( 'Delete this item permanently' ) ) . "' href='" . get_delete_post_link( $post->ID, '', true ) . "'>" . __( 'Delete Permanently' ) . "</a>";
+			}
+			if ( $post_type_object->public ) {
+				if ( in_array( $post->post_status, array( 'pending', 'draft', 'future' ) ) ) {
+					if ( $can_edit_post )
+						$actions['view'] = '<a href="' . esc_url( apply_filters( 'preview_post_link', set_url_scheme( add_query_arg( 'preview', 'true', get_permalink( $post->ID ) ) ) ) ) . '" title="' . esc_attr( sprintf( __( 'Preview &#8220;%s&#8221;' ), $title ) ) . '" rel="permalink">' . __( 'Preview' ) . '</a>';
+				} elseif ( 'trash' != $post->post_status ) {
+					$actions['view'] = '<a href="' . get_permalink( $post->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;' ), $title ) ) . '" rel="permalink">' . __( 'View' ) . '</a>';
+				}
+			}
+
+			$actions = apply_filters( is_post_type_hierarchical( $post->post_type ) ? 'page_row_actions' : 'post_row_actions', $actions, $post );
+			echo $this->row_actions( $actions );
+		}
+	}
+
 	/**
 	 * Outputs the hidden row displayed when inline editing
 	 *
Index: class-wp-terms-list-table.php
===================================================================
--- class-wp-terms-list-table.php	(revision 25762)
+++ class-wp-terms-list-table.php	(working copy)
@@ -252,20 +252,6 @@
 
 		$out = '<strong><a class="row-title" href="' . $edit_link . '" title="' . esc_attr( sprintf( __( 'Edit &#8220;%s&#8221;' ), $name ) ) . '">' . $name . '</a></strong><br />';
 
-		$actions = array();
-		if ( current_user_can( $tax->cap->edit_terms ) ) {
-			$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
-			$actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick&nbsp;Edit' ) . '</a>';
-		}
-		if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )
-			$actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";
-		if ( $tax->public )
-			$actions['view'] = '<a href="' . get_term_link( $tag ) . '">' . __( 'View' ) . '</a>';
-
-		$actions = apply_filters( 'tag_row_actions', $actions, $tag );
-		$actions = apply_filters( "{$taxonomy}_row_actions", $actions, $tag );
-
-		$out .= $this->row_actions( $actions );
 		$out .= '<div class="hidden" id="inline_' . $qe_data->term_id . '">';
 		$out .= '<div class="name">' . $qe_data->name . '</div>';
 		$out .= '<div class="slug">' . apply_filters( 'editable_slug', $qe_data->slug ) . '</div>';
@@ -317,6 +303,36 @@
 		return apply_filters( "manage_{$this->screen->taxonomy}_custom_column", '', $column_name, $tag->term_id );
 	}
 
+    function get_primary_column() {
+		return( 'name' );
+	}
+
+	function handle_actions( $tag, $column_name, $primary_column ) {
+		$taxonomy = $this->screen->taxonomy;
+		$tax = get_taxonomy( $taxonomy );
+
+		$default_term = get_option( 'default_' . $taxonomy );
+
+		$pad = str_repeat( '&#8212; ', max( 0, $this->level ) );
+		$name = apply_filters( 'term_name', $pad . ' ' . $tag->name, $tag );
+		$qe_data = get_term( $tag->term_id, $taxonomy, OBJECT, 'edit' );
+		$edit_link = esc_url( get_edit_term_link( $tag->term_id, $taxonomy, $this->screen->post_type ) );
+		$actions = array();
+		if ( current_user_can( $tax->cap->edit_terms ) ) {
+			$actions['edit'] = '<a href="' . $edit_link . '">' . __( 'Edit' ) . '</a>';
+			$actions['inline hide-if-no-js'] = '<a href="#" class="editinline">' . __( 'Quick&nbsp;Edit' ) . '</a>';
+		}
+		if ( current_user_can( $tax->cap->delete_terms ) && $tag->term_id != $default_term )
+			$actions['delete'] = "<a class='delete-tag' href='" . wp_nonce_url( "edit-tags.php?action=delete&amp;taxonomy=$taxonomy&amp;tag_ID=$tag->term_id", 'delete-tag_' . $tag->term_id ) . "'>" . __( 'Delete' ) . "</a>";
+		if ( $tax->public )
+			$actions['view'] = '<a href="' . get_term_link( $tag ) . '">' . __( 'View' ) . '</a>';
+
+		$actions = apply_filters( 'tag_row_actions', $actions, $tag );
+		$actions = apply_filters( "{$taxonomy}_row_actions", $actions, $tag );
+
+		echo $this->row_actions( $actions );
+	}
+
 	/**
 	 * Outputs the hidden row displayed when inline editing
 	 *
Index: class-wp-users-list-table.php
===================================================================
--- class-wp-users-list-table.php	(revision 25762)
+++ class-wp-users-list-table.php	(working copy)
@@ -258,7 +258,6 @@
 			if ( is_multisite() && get_current_user_id() != $user_object->ID && current_user_can( 'remove_user', $user_object->ID ) )
 				$actions['remove'] = "<a class='submitdelete' href='" . wp_nonce_url( $url."action=remove&amp;user=$user_object->ID", 'bulk-users' ) . "'>" . __( 'Remove' ) . "</a>";
 			$actions = apply_filters( 'user_row_actions', $actions, $user_object );
-			$edit .= $this->row_actions( $actions );
 
 			// Set up the checkbox ( because the user is editable, otherwise it's empty )
 			$checkbox = '<label class="screen-reader-text" for="cb-select-' . $user_object->ID . '">' . sprintf( __( 'Select %s' ), $user_object->user_login ) . '</label>'
@@ -272,11 +271,16 @@
 
 		$r = "<tr id='user-$user_object->ID'$style>";
 
-		list( $columns, $hidden ) = $this->get_column_info();
+		list( $columns, $hidden, $sortable, $primary_column ) = $this->get_column_info();
 
 		foreach ( $columns as $column_name => $column_display_name ) {
-			$class = "class=\"$column_name column-$column_name\"";
 
+			if( $primary_column == $column_name ) {
+				$class = "class=\"$column_name column-$column_name has-row-actions\"";
+			} else {
+				$class = "class=\"$column_name column-$column_name\"";
+			}
+
 			$style = '';
 			if ( in_array( $column_name, $hidden ) )
 				$style = ' style="display:none;"';
@@ -288,16 +292,16 @@
 					$r .= "<th scope='row' class='check-column'>$checkbox</th>";
 					break;
 				case 'username':
-					$r .= "<td $attributes>$avatar $edit</td>";
+					$r .= "<td $attributes>$avatar $edit";
 					break;
 				case 'name':
-					$r .= "<td $attributes>$user_object->first_name $user_object->last_name</td>";
+					$r .= "<td $attributes>$user_object->first_name $user_object->last_name";
 					break;
 				case 'email':
-					$r .= "<td $attributes><a href='mailto:$email' title='" . esc_attr( sprintf( __( 'E-mail: %s' ), $email ) ) . "'>$email</a></td>";
+					$r .= "<td $attributes><a href='mailto:$email' title='" . esc_attr( sprintf( __( 'E-mail: %s' ), $email ) ) . "'>$email</a>";
 					break;
 				case 'role':
-					$r .= "<td $attributes>$role_name</td>";
+					$r .= "<td $attributes>$role_name";
 					break;
 				case 'posts':
 					$attributes = 'class="posts column-posts num"' . $style;
@@ -309,7 +313,6 @@
 					} else {
 						$r .= 0;
 					}
-					$r .= "</td>";
 					break;
 				default:
 					$r .= "<td $attributes>";
@@ -316,9 +319,18 @@
 					$r .= apply_filters( 'manage_users_custom_column', '', $column_name, $user_object->ID );
 					$r .= "</td>";
 			}
+
+			if( $primary_column == $column_name ) {
+				$r .= $this->row_actions( $actions );
+			}
+			$r .= '</td>';
 		}
 		$r .= '</tr>';
 
 		return $r;
 	}
+
+	function get_primary_column() {
+		return( 'username' );
+	}
 }
