Index: misc/drupal.css
===================================================================
RCS file: /cvs/drupal/drupal/misc/drupal.css,v
retrieving revision 1.143
diff -u -p -r1.143 drupal.css
--- misc/drupal.css	7 Mar 2006 11:36:49 -0000	1.143
+++ misc/drupal.css	8 Mar 2006 22:48:35 -0000
@@ -344,10 +344,10 @@ dl.multiselect .form-item {
   height: 1.75em;
   margin: 0px;
 }
-#permissions td.module, #blocks td.region {
+#permissions td.module, #blocks td.region, #modules td.group  {
   font-weight: bold;
 }
-#permissions td.permission, #blocks td.block, #taxonomy td.term, #taxonomy td.message {
+#permissions td.permission, #blocks td.block, #taxonomy td.term, #taxonomy td.message, #modules td.module {
   padding-left: 1.5em;
 }
 
Index: modules/system.module
===================================================================
RCS file: /cvs/drupal/drupal/modules/system.module,v
retrieving revision 1.298
diff -u -p -r1.298 system.module
--- modules/system.module	7 Mar 2006 11:28:22 -0000	1.298
+++ modules/system.module	8 Mar 2006 22:48:35 -0000
@@ -885,10 +885,29 @@ function system_modules() {
 
   ksort($files);
 
+  $order = array('modules' => array()); // ensure modules is first in list.
+
   foreach ($files as $filename => $file) {
     drupal_get_filename('module', $file->name, $file->filename);
     drupal_load('module', $file->name);
 
+    // Discover the base module directory this lives in.
+    $working_name = dirname($file->filename);
+    $last_name = NULL;
+    while ($dir = basename($working_name)) {
+      if ($dir == 'modules') {
+        $group = isset($last_name) ? $last_name : $dir;
+        break;
+      }
+      $last_name = $dir;
+      $working_name = dirname($working_name);
+    }
+
+    if (!isset($order[$group])) {
+      $order[$group] = array();
+    }
+    $order[$group][] = $file->name;
+
     $file->description = module_invoke($file->name, 'help', 'admin/modules#description');
 
     $form['name'][$file->name] = array('#value' => $file->name);
@@ -942,20 +961,37 @@ function system_modules() {
 
   $form['buttons']['submit'] = array('#type' => 'submit', '#value' => t('Save configuration'));
 
+  // Any 'group' with just 1 member gets rolled back into 'modules'.
+  foreach ($order as $group => $files) {
+    if (count($files) == 1) {
+      $order['modules'][] = current($files);
+      unset($order[$group]);
+    }
+  }
+
+  sort($order['modules']);
+  $form['order'] = array('#type' => 'value', '#value' => $order);
   return drupal_get_form('system_modules', $form);
 }
 
 function theme_system_modules($form) {
-  foreach (element_children($form['name']) as $key) {
-    $row = array();
-    $row[] = form_render($form['name'][$key]);
-    $row[] = form_render($form['description'][$key]);
-    $row[] = array('data' => form_render($form['status'][$key]), 'align' => 'center');
+  foreach ($form['order']['#value'] as $group => $files) {
+    if ($group == 'modules') { 
+      $group = t('individual modules'); 
+    }
+    $rows[] = array(array('data' => $group, 'colspan' => 3, 'class' => 'group'));
+
+    foreach($files as $key) {
+      $row = array();
+      $row[] = array('data' => form_render($form['name'][$key]), 'class' => 'module');
+      $row[] = form_render($form['description'][$key]);
+      $row[] = array('data' => form_render($form['status'][$key]), 'align' => 'center');
 
-    if (module_exist('throttle')) {
-      $row[] = array('data' => form_render($form['throttle'][$key]), 'align' => 'center');
+      if (module_exist('throttle')) {
+        $row[] = array('data' => form_render($form['throttle'][$key]), 'align' => 'center');
+      }
+      $rows[] = $row;
     }
-    $rows[] = $row;
   }
 
   $header = array(t('Name'), t('Description'), t('Enabled'));
@@ -963,7 +999,7 @@ function theme_system_modules($form) {
     $header[] = t('Throttle');
   }
 
-  $output = theme('table', $header, $rows);
+  $output = theme('table', $header, $rows, array('id' => 'modules'));
   $output .= form_render($form);
   return $output;
 }
