Index: wp-admin/css/list-tables.css
===================================================================
--- wp-admin/css/list-tables.css	(revision 29004)
+++ wp-admin/css/list-tables.css	(working copy)
@@ -1336,6 +1336,10 @@
 	clear: right;
 }
 
+.plugin-group {
+	padding-top: 2em;
+}
+
 /* ms */
 /* Background Color for Site Status */
 .wp-list-table .site-deleted {
Index: wp-admin/includes/class-wp-plugin-install-list-table.php
===================================================================
--- wp-admin/includes/class-wp-plugin-install-list-table.php	(revision 29004)
+++ wp-admin/includes/class-wp-plugin-install-list-table.php	(working copy)
@@ -8,6 +8,10 @@
  * @access private
  */
 class WP_Plugin_Install_List_Table extends WP_List_Table {
+	
+	var $order = 'ASC';
+	var $orderby = null;
+	var $groups = array();
 
 	public function ajax_user_can() {
 		return current_user_can('install_plugins');
@@ -85,6 +89,9 @@
 				break;
 
 			case 'featured':
+				$args['fields']['group'] = true;
+				$this->orderby = 'group';
+				// No break!
 			case 'popular':
 			case 'new':
 			case 'beta':
@@ -129,11 +136,18 @@
 			wp_die( $api->get_error_message() . '</p> <p class="hide-if-no-js"><a href="#" onclick="document.location.reload(); return false;">' . __( 'Try again' ) . '</a>' );
 
 		$this->items = $api->plugins;
+		
+		if ( $this->orderby ) {
+			uasort( $this->items, array( $this, '_order_callback' ) );
+		}
 
 		$this->set_pagination_args( array(
 			'total_items' => $api->info['results'],
 			'per_page' => $args['per_page'],
 		) );
+		
+		if ( isset( $api->info['groups'] ) )
+			$this->groups = $api->info['groups'];
 	}
 
 	public function no_items() {
@@ -242,7 +256,26 @@
 			'description' => __( 'Description' ),
 		);
 	}
+	
+	public function _order_callback( $plugin_a, $plugin_b ) {
 
+		$orderby = $this->orderby;
+		if ( !isset( $plugin_a->$orderby, $plugin_b->$orderby ) )
+			return 0;
+
+		$a = $plugin_a->$orderby;
+		$b = $plugin_b->$orderby;
+
+		if ( $a == $b )
+			return 0;
+
+		if ( 'DESC' == $this->order )
+			return ( $a < $b ) ? 1 : -1;
+		else
+			return ( $a < $b ) ? -1 : 1;
+	}
+
+
 	public function display_rows() {
 		$plugins_allowedtags = array(
 			'a' => array( 'href' => array(),'title' => array(), 'target' => array() ),
@@ -258,10 +291,23 @@
 			$style[ $column_name ] = in_array( $column_name, $hidden ) ? 'style="display:none;"' : '';
 		}
 
+		$group = null;
+
 		foreach ( (array) $this->items as $plugin ) {
 			if ( is_object( $plugin ) )
 				$plugin = (array) $plugin;
 
+			// Display the group heading if there is one
+			if ( isset( $plugin['group'] ) && $plugin['group'] != $group ) {
+				if ( isset( $this->groups[ $plugin['group'] ] ) )
+					$group_name = translate( $this->groups[ $plugin['group'] ] ); // Does this need context?
+				else
+					$group_name = $plugin['group'];
+				echo '<h3 class="plugin-group clear">' . esc_html( $group_name ) . '</h3>';
+				echo '<div class="clear"></div>';
+				$group = $plugin['group'];
+			}
+			
 			$title = wp_kses( $plugin['name'], $plugins_allowedtags );
 
 			//Remove any HTML from the description.
