diff -u'rF^f' ../dependency/modules/aggregator/aggregator.info ./modules/aggregator/aggregator.info
--- ../dependency/modules/aggregator/aggregator.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/aggregator/aggregator.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,3 +1,4 @@
 ; $Id: aggregator.info,v 1.1 2006/08/31 20:22:34 dries Exp $
 name = Aggregator
 description = "Aggregates syndicated content (RSS, RDF, and Atom feeds)."
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/block/block.info ./modules/block/block.info
--- ../dependency/modules/block/block.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/block/block.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: block.info,v 1.1 2006/08/31 20:22:34 dries Exp $
 name = Block
 description = Controls the boxes that are displayed around the main content.
-
+package = Required modules
diff -u'rF^f' ../dependency/modules/blog/blog.info ./modules/blog/blog.info
--- ../dependency/modules/blog/blog.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/blog/blog.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: blog.info,v 1.1 2006/08/31 20:22:34 dries Exp $
 name = Blog
 description = Enables keeping an easily and regularly updated web page or a blog.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/blogapi/blogapi.info ./modules/blogapi/blogapi.info
--- ../dependency/modules/blogapi/blogapi.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/blogapi/blogapi.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: blogapi.info,v 1.1 2006/08/31 20:22:34 dries Exp $
 name = Blog API
 description = Allows users to post content using applications that support XML-RPC blog APIs.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/book/book.info ./modules/book/book.info
--- ../dependency/modules/book/book.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/book/book.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: book.info,v 1.1 2006/08/31 20:22:34 dries Exp $
 name = Book
 description = Allows users to collaboratively author a book.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/comment/comment.info ./modules/comment/comment.info
--- ../dependency/modules/comment/comment.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/comment/comment.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: comment.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Comment
 description = Allows users to comment on and discuss published content.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/contact/contact.info ./modules/contact/contact.info
--- ../dependency/modules/contact/contact.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/contact/contact.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: contact.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Contact
 description = Enables the use of both personal and site-wide contact forms.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/drupal/drupal.info ./modules/drupal/drupal.info
--- ../dependency/modules/drupal/drupal.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/drupal/drupal.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: drupal.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Drupal
 description = Lets you register your site with a central server and improve ranking of Drupal projects by posting information on your installed modules and themes; also enables users to log in using a Drupal ID.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/filter/filter.info ./modules/filter/filter.info
--- ../dependency/modules/filter/filter.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/filter/filter.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: filter.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Filter
 description = Handles the filtering of content in preparation for display.
-
+package = Required modules
diff -u'rF^f' ../dependency/modules/forum/forum.info ./modules/forum/forum.info
--- ../dependency/modules/forum/forum.info	2006-09-05 17:36:49.000000000 +0200
+++ ./modules/forum/forum.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,6 @@
 ; $Id: forum.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Forum
 description = Enables threaded discussions about general topics.
+package = Drupal core modules
 dependencies = taxonomy comment
+
diff -u'rF^f' ../dependency/modules/help/help.info ./modules/help/help.info
--- ../dependency/modules/help/help.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/help/help.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,3 +1,4 @@
 ; $Id: help.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Help
 description = Manages the display of online help.
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/legacy/legacy.info ./modules/legacy/legacy.info
--- ../dependency/modules/legacy/legacy.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/legacy/legacy.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: legacy.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Legacy
 description = Provides legacy handlers for upgrades from older Drupal installations.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/locale/locale.info ./modules/locale/locale.info
--- ../dependency/modules/locale/locale.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/locale/locale.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: locale.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Locale
 description = Enables the translation of the user interface to languages other than English.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/menu/menu.info ./modules/menu/menu.info
--- ../dependency/modules/menu/menu.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/menu/menu.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: menu.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Menu
 description = Allows administrators to customize the site navigation menu.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/node/node.info ./modules/node/node.info
--- ../dependency/modules/node/node.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/node/node.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,5 @@
 ; $Id: node.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Node
 description = Allows content to be submitted to the site and displayed on pages.
+package = Required modules
 
diff -u'rF^f' ../dependency/modules/path/path.info ./modules/path/path.info
--- ../dependency/modules/path/path.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/path/path.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: path.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Path
 description = Allows users to rename URLs.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/ping/ping.info ./modules/ping/ping.info
--- ../dependency/modules/ping/ping.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/ping/ping.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: ping.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Ping
 description = Alerts other sites when your site has been updated.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/poll/poll.info ./modules/poll/poll.info
--- ../dependency/modules/poll/poll.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/poll/poll.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: poll.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Poll
 description = Allows your site to capture votes on different topics in the form of multiple choice questions.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/profile/profile.info ./modules/profile/profile.info
--- ../dependency/modules/profile/profile.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/profile/profile.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: profile.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Profile
 description = Supports configurable user profiles.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/search/search.info ./modules/search/search.info
--- ../dependency/modules/search/search.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/search/search.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: search.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Search
 description = Enables site-wide keyword searching.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/statistics/statistics.info ./modules/statistics/statistics.info
--- ../dependency/modules/statistics/statistics.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/statistics/statistics.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: statistics.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Statistics
 description = Logs access statistics for your site.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/system/admin.css ./modules/system/admin.css
--- ../dependency/modules/system/admin.css	2006-09-05 17:36:49.000000000 +0200
+++ ./modules/system/admin.css	2006-09-05 17:45:55.000000000 +0200
@@ -42,6 +42,10 @@
   color: #444;
 }
 
+td.package {
+  font-weight: bold;
+}
+
 /**
  * Formatting for status report
  */
diff -u'rF^f' ../dependency/modules/system/system.info ./modules/system/system.info
--- ../dependency/modules/system/system.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/system/system.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: system.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = System
 description = Handles general site configuration for administrators.
-
+package = Required modules
diff -u'rF^f' ../dependency/modules/system/system.module ./modules/system/system.module
--- ../dependency/modules/system/system.module	2006-09-05 15:36:36.000000000 +0200
+++ ./modules/system/system.module	2006-09-05 19:21:25.000000000 +0200
@@ -1214,55 +1214,87 @@ function system_themes_submit($form_id, 
  * Menu callback; displays a listing of all modules.
  */
 function system_modules() {
-  // Get current list of modules
+  // Get current list of modules.
   $files = module_rebuild_cache();
+#
+t('<p>You do not have permission to view this content.</p>
 
-  // First Pass.
+<ul>
+  <li> You may need to log in.</li>
+  <li> Visit the front page of <sitename> and browse for the information you want.</li>
+  <li> Click the "Back" button of your browser to try another link.</li>
+</ul>');
+  // First Pass. Group packages and store module information.
   foreach ($files as $filename => $file) {
     $info = $file->info;
-    $form['name'][$file->name] = array('#value' => $info['name']);
-    $form['description'][$file->name] = array('#value' => t($info['description']));
-    $options[$file->name] = '';
+    // Store status and throttle so we can pull it out later.
     if ($file->status) {
-      $status[] = $file->name;
-      // For later dependency checking.
-      $info['enabled'] = TRUE;
+      $file->info['enabled'] = TRUE;
     }
-    if ($file->throttle) {
-      $throttle[] = $file->name;
+    $file->info['throttle'] = $file->throttle;
+    if (!isset($file->info['package'])) {
+      $file->info['package'] = t('uncategorized');
     }
-    $modules[$file->name] = $info;
+    $packages[$file->info['package']][$file->name] = $file->info;
+    $modules[$file->name] = $file->info;
   }
   // Store modules list for validation hook.
-  $form['modules'] = array('#type' => 'value', '#value' => $modules);
+  $form['validation_modules'] = array('#type' => 'value', '#value' => $modules);
 
-  // Second pass. Dependency checking.
+  // Reorder packages.
+  $core_packages = array();
+  // Re-order packages to force core modules to the top.
+  foreach (array(t('Required modules'), t('Drupal core modules')) as $key) {
+    if (is_array($packages[$key])) { 
+      $core_packages[$key] = $packages[$key];
+      unset($packages[$key]);
+    }
+  }
+  ksort($packages);
+  $packages = array_merge($core_packages, $packages);
+
+  // Second pass. Form building and dependency checking.
   $form['reverse_deps'] = array('#type' => 'value', '#value' => array());
-  foreach ($form['modules']['#value'] as $filename => $info) {
-    $missing_deps = array();
-    // Check missing dependencies.
-    if (isset($info['dependencies'])) {
-      foreach (explode(' ', $info['dependencies']) as $dependency) {
-        if (!isset($modules[$dependency]) || !isset($modules[$dependency]['enabled'])) {
-          // Store the fact we need to disable so the theme function can handle it.
-          $form['disabled'][$filename] = array('#type' => 'value', '#value' => 1);
-          $missing_deps[] = isset($modules[$dependency]) ? $modules[$dependency]['name'] : $dependency;
+  foreach ($packages as $package => $package_modules) {
+    $form['packages'][$package] = array('#value' => $package);
+    $form['packages'][$package]['modules'] = array('#type' => 'value', '#value' => array());
+    foreach ($package_modules as $filename => $info) {
+      $missing_deps = array();
+      $form['packages'][$package]['modules']['#value'][] = $filename;
+      $form['name'][$filename] = array('#value' => $info['name']);
+      $form['description'][$filename] = array('#value' => $info['description']);
+      $options[$filename] = '';
+      if ($info['enabled']) {
+        $status[$filename] = $filename;
+      }
+      if ($info['throttle']) {
+        $throttle[] = $filename;
+      }
+
+      // Check missing dependencies.
+      if (isset($info['dependencies'])) {
+        foreach (explode(' ', $info['dependencies']) as $dependency) {
+          if (!isset($modules[$dependency]) || !isset($modules[$dependency]['enabled'])) {
+            // Store the fact we need to disable so the theme function can handle it.
+            $form['disabled'][$filename] = array('#type' => 'value', '#value' => 1);
+            $missing_deps[] = isset($modules[$dependency]) ? $modules[$dependency]['name'] : $dependency;
+          }
+          else if (isset($info['enabled'])) {
+            // Store the fact we need to disable so the theme function can handle it.
+            $form['disabled'][$dependency] = array('#type' => 'value', '#value' => 1);
+            $form['reverse_deps']['#value'][$dependency][] = $info['name'];
+          }
         }
-        else if (isset($info['enabled'])) {
-          // Store the fact we need to disable so the theme function can handle it.
-          $form['disabled'][$dependency] = array('#type' => 'value', '#value' => 1);
-          $form['reverse_deps']['#value'][$dependency][] = $info['name'];
+  
+        // Add text for missing dependencies.
+        if (!empty($missing_deps)) {
+          $form['description'][$filename]['missing_deps'] = array(
+            '#value' => t('Missing dependencies: %missing_deps', array('%missing_deps' => implode(', ', $missing_deps))),
+            '#prefix' => '<div class="admin-missing">',
+            '#suffix' => '</div>',
+          );
         }
       }
-
-      // Add text for missing dependencies.
-      if (!empty($missing_deps)) {
-        $form['description'][$filename]['missing_deps'] = array(
-          '#value' => t('Missing dependencies: %missing_deps', array('%missing_deps' => implode(', ', $missing_deps))),
-          '#prefix' => '<div class="admin-missing">',
-          '#suffix' => '</div>',
-        );
-      }
     }
   }
 
@@ -1275,8 +1307,7 @@ function system_modules() {
     );
   }
 
-  // Handle status checkboxes, including overriding the generated
-  // checkboxes for required modules.
+  // Handle status checkboxes.
   $form['status'] = array('#type' => 'checkboxes', '#default_value' => $status, '#options' => $options);
   $required = array('block', 'filter', 'node', 'system', 'user', 'watchdog');
   foreach ($required as $require) {
@@ -1301,48 +1332,56 @@ function system_modules() {
 
 function system_modules_validate($form_id, $form_values, $form) {
   // Recheck values for submitted dependency errors.
-  foreach ($form_values['modules'] as $filename => $info) {
+  foreach ($form_values['validation_modules'] as $filename => $info) {
+    $errors = array();
     if (!isset($info['enabled']) && $form_values['status'][$filename] && !empty($info['dependencies'])) {
       foreach (explode(' ', $info['dependencies']) as $dependency) {
         if (!isset($form['status'][$dependency]) || !($form_values['status'][$dependency])) {
+          $errors[] = isset($form_values['modules'][$dependency]) ? $form_values['modules'][$dependency]['name'] : $dependency;
+        }
+      }
+    }
+    if (!empty($errors)) {
           form_set_value($form['status'][$filename], FALSE);
           form_set_error("status][$filename",
             t('You are attempting to enable %module, but it depends on %dependency.', 
               array(
                 '%module' => $info['name'],
-                '%dependency' => isset($form_values['modules'][$dependency]) ? $form_values['modules'][$dependency]['name'] : $dependency
-            )));
-        }
-      }
+                '%dependency' => implode(", ",$errors),
+              )
+            )
+          );
     }
   }
 }
 
 function theme_system_modules($form) {
-  foreach (element_children($form['name']) as $key) {
-    $row = array();
-    // Disable individual checkboxes.
-    if (isset($form['disabled'][$key])) {
-      $form['status'][$key]['#attributes'] = array('disabled' => 'disabled');
-    }
-    
-    $row[] = array('data' => drupal_render($form['status'][$key]), 'align' => 'center');
-
-    if (module_exists('throttle')) {
-      $row[] = array('data' => drupal_render($form['throttle'][$key]), 'align' => 'center');
-    }
-    $row[] = drupal_render($form['name'][$key]);
-    $row[] = drupal_render($form['description'][$key]);
-    $rows[] = $row;
-  }
-
   $header = array(t('Enabled'));
   if (module_exists('throttle')) {
     $header[] = t('Throttle');
   }
   $header[] = t('Name');
   $header[] = t('Description'); 
-
+  $columns = count($header);
+  foreach (element_children($form['packages']) as $package) {
+    $rows[] = array(array('data' => drupal_render($form['packages'][$package]), 'class' => 'package', 'colspan' => $columns));
+    foreach ($form['packages'][$package]['modules']['#value'] as $key) {
+      $row = array();
+      // Disable individual checkboxes.
+      if (isset($form['disabled'][$key])) {
+        $form['status'][$key]['#attributes'] = array('disabled' => 'disabled');
+      }
+
+      $row[] = array('data' => drupal_render($form['status'][$key]), 'align' => 'center');
+  
+      if (module_exists('throttle')) {
+        $row[] = array('data' => drupal_render($form['throttle'][$key]), 'align' => 'center');
+      }
+      $row[] = drupal_render($form['name'][$key]);
+      $row[] = drupal_render($form['description'][$key]);
+      $rows[] = $row;
+    }
+  }
   $output = theme('table', $header, $rows);
   $output .= drupal_render($form);
   return $output;
diff -u'rF^f' ../dependency/modules/taxonomy/taxonomy.info ./modules/taxonomy/taxonomy.info
--- ../dependency/modules/taxonomy/taxonomy.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/taxonomy/taxonomy.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: taxonomy.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Taxonomy
 description = Enables the categorization of content.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/throttle/throttle.info ./modules/throttle/throttle.info
--- ../dependency/modules/throttle/throttle.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/throttle/throttle.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: throttle.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Throttle
 description = Handles the auto-throttling mechanism, to control site congestion.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/tracker/tracker.info ./modules/tracker/tracker.info
--- ../dependency/modules/tracker/tracker.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/tracker/tracker.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: tracker.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Tracker
 description = Enables tracking of recent posts for users.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/upload/upload.info ./modules/upload/upload.info
--- ../dependency/modules/upload/upload.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/upload/upload.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: upload.info,v 1.1 2006/08/31 20:22:36 dries Exp $
 name = Upload
 description = Allows users to upload and attach files to content.
-
+package = Drupal core modules
diff -u'rF^f' ../dependency/modules/user/user.info ./modules/user/user.info
--- ../dependency/modules/user/user.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/user/user.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: user.info,v 1.1 2006/08/31 20:22:37 dries Exp $
 name = User
 description = Manages the user registration and login system.
-
+package = Required modules
diff -u'rF^f' ../dependency/modules/watchdog/watchdog.info ./modules/watchdog/watchdog.info
--- ../dependency/modules/watchdog/watchdog.info	2006-09-05 17:36:28.000000000 +0200
+++ ./modules/watchdog/watchdog.info	2006-09-05 17:45:55.000000000 +0200
@@ -1,4 +1,4 @@
 ; $Id: watchdog.info,v 1.1 2006/08/31 20:22:37 dries Exp $
 name = Watchdog
 description = Logs and records system events.
-
+package = Required modules
