Index: wp-admin/includes/class-wp-plugin-install-list-table.php
===================================================================
--- wp-admin/includes/class-wp-plugin-install-list-table.php	(revision 29002)
+++ wp-admin/includes/class-wp-plugin-install-list-table.php	(working copy)
@@ -8,6 +8,9 @@
  * @access private
  */
 class WP_Plugin_Install_List_Table extends WP_List_Table {
+	
+	var $order = 'ASC';
+	var $orderby = null;
 
 	public function ajax_user_can() {
 		return current_user_can('install_plugins');
@@ -85,6 +88,9 @@
 				break;
 
 			case 'featured':
+				$args['fields']['group'] = true;
+				$this->orderby = 'group';
+				// No break!
 			case 'popular':
 			case 'new':
 			case 'beta':
@@ -129,6 +135,10 @@
 			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'],
@@ -242,7 +252,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 +287,20 @@
 			$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 ) {
+				// FIXME: replace ucwords with some i18n magic
+				echo '<h3 class="plugin-group clear">' . esc_html( ucwords( $plugin['group'] ) ) . '</h3>';
+				echo '<div class="clear"></div>';
+				$group = $plugin['group'];
+			}
+			
 			$title = wp_kses( $plugin['name'], $plugins_allowedtags );
 
 			//Remove any HTML from the description.
