Index: wp-admin/includes/class-wp-users-list-table.php
===================================================================
--- wp-admin/includes/class-wp-users-list-table.php	(revision 25007)
+++ wp-admin/includes/class-wp-users-list-table.php	(working copy)
@@ -193,23 +193,14 @@
 		if ( ! $this->is_site_users )
 			$post_counts = count_many_users_posts( array_keys( $this->items ) );
 
-		$editable_roles = array_keys( get_editable_roles() );
-
 		$style = '';
 		foreach ( $this->items as $userid => $user_object ) {
-			if ( count( $user_object->roles ) <= 1 ) {
-				$role = reset( $user_object->roles );
-			} elseif ( $roles = array_intersect( array_values( $user_object->roles ), $editable_roles ) ) {
-				$role = reset( $roles );
-			} else {
-				$role = reset( $user_object->roles );
-			}
 
 			if ( is_multisite() && empty( $user_object->allcaps ) )
 				continue;
 
 			$style = ( ' class="alternate"' == $style ) ? '' : ' class="alternate"';
-			echo "\n\t" . $this->single_row( $user_object, $style, $role, isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
+		 	echo "\n\t" . $this->single_row( $user_object, $style, isset( $post_counts ) ? $post_counts[ $userid ] : 0 );
 		}
 	}
 
@@ -220,12 +211,10 @@
 	 *
 	 * @param object $user_object
 	 * @param string $style Optional. Attributes added to the TR element. Must be sanitized.
-	 * @param string $role Key for the $wp_roles array.
 	 * @param int $numposts Optional. Post count to display for this user. Defaults to zero, as in, a new user has made zero posts.
 	 * @return string
 	 */
-	function single_row( $user_object, $style = '', $role = '', $numposts = 0 ) {
-		global $wp_roles;
+	function single_row( $user_object, $style = '', $numposts = 0 ) {
 
 		if ( !( is_object( $user_object ) && is_a( $user_object, 'WP_User' ) ) )
 			$user_object = get_userdata( (int) $user_object );
@@ -267,7 +256,7 @@
 		} else {
 			$edit = '<strong>' . $user_object->user_login . '</strong>';
 		}
-		$role_name = isset( $wp_roles->role_names[$role] ) ? translate_user_role( $wp_roles->role_names[$role] ) : __( 'None' );
+
 		$avatar = get_avatar( $user_object->ID, 32 );
 
 		$r = "<tr id='user-$user_object->ID'$style>";
@@ -297,7 +286,7 @@
 					$r .= "<td $attributes><a href='mailto:$email' title='" . esc_attr( sprintf( __( 'E-mail: %s' ), $email ) ) . "'>$email</a></td>";
 					break;
 				case 'role':
-					$r .= "<td $attributes>$role_name</td>";
+					$r .= "<td $attributes>" . $this->get_role_str( $user_object ) . "</td>";
 					break;
 				case 'posts':
 					$attributes = 'class="posts column-posts num"' . $style;
@@ -321,4 +310,30 @@
 
 		return $r;
 	}
+
+	/**
+	 * Generate string of user roles for a given user object.
+	 *
+	 * @since 3.7.0
+	 * @uses apply_filters() Calls 'wp_user_list_get_role_str' on $role_str and $user_object.
+	 *
+	 * @param object $user_object
+	 * @return string
+	 */
+	private function get_role_str( $user_object ) {
+		global $wp_roles;
+
+		$role_str = array();
+
+		foreach ( $user_object->roles as $role ) {
+			if ( isset( $wp_roles->role_names[ $role ] ) ) {
+				$role_str[] = translate_user_role( $wp_roles->role_names[ $role ] );
+			}
+		}
+
+		if ( empty( $role_str ) )
+			$role_str = __( 'None' );
+
+		return implode( ', ', apply_filters( 'wp_user_list_get_role_str', $role_str, $user_object ) );
+	}
 }
