diff --git a/includes/module.inc b/includes/module.inc
index 9d71a5095b39a8ec47a5baac95bddab236516ca3..3a5b2b6661078a67c0dc4d789d924faf89505f0f 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -175,11 +175,13 @@ function _module_build_dependents($files) {
  * name - The real name of the module for display purposes.
  * description - A brief description of the module.
  * dependencies - A space delimited list of the short names (shortname) of other modules this module depends on.
+ * package - The name of the package of modules this module belongs to.
  *
  * Example of .info file:
  *   name = Forum
  *   description = Enables threaded discussions about general topics.
  *   dependencies = taxonomy comment
+ *   package = Core - optional
  *
  * @param $filename
  *   The file we are parsing. Accepts file with relative or absolute path.
diff --git a/modules/aggregator/aggregator.info b/modules/aggregator/aggregator.info
index 8ef1277729bc730e84a958ed02b8ff0e1ba75ca5..3965acac5457a08cc7fbbdf3963a4f326cf64a2c 100644
--- a/modules/aggregator/aggregator.info
+++ b/modules/aggregator/aggregator.info
@@ -1,3 +1,4 @@
 ; $Id$
 name = Aggregator
 description = "Aggregates syndicated content (RSS, RDF, and Atom feeds)."
+package = Core - optional
diff --git a/modules/block/block.info b/modules/block/block.info
index 906099324f78d474ba9bfc6014a32ca5aae8ce96..d5c4d57c08d90fb061ca85269a28bff82c4fef80 100644
--- a/modules/block/block.info
+++ b/modules/block/block.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Block
 description = Controls the boxes that are displayed around the main content.
-
+package = Core - required
diff --git a/modules/blog/blog.info b/modules/blog/blog.info
index af4cfaf04880ac3f1b220d004302e753b6fc3f89..03bb889b2491b7d240cfd97514e7f76eca4e2f3e 100644
--- a/modules/blog/blog.info
+++ b/modules/blog/blog.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Blog
 description = Enables keeping an easily and regularly updated web page or a blog.
-
+package = Core - optional
diff --git a/modules/blogapi/blogapi.info b/modules/blogapi/blogapi.info
index 711b769ebce94dd78290587e2e70dc70d0c48c15..5efd7ce1ee0da03b9d6399a3f62b104f6ec99323 100644
--- a/modules/blogapi/blogapi.info
+++ b/modules/blogapi/blogapi.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Blog API
 description = Allows users to post content using applications that support XML-RPC blog APIs.
-
+package = Core - optional
diff --git a/modules/book/book.info b/modules/book/book.info
index c4ad50ef72698e01f58c3535ae8a77fd2e646632..16ce9d27f1ff2da85e35779b69e12860e0889a52 100644
--- a/modules/book/book.info
+++ b/modules/book/book.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Book
 description = Allows users to collaboratively author a book.
-
+package = Core - optional
diff --git a/modules/comment/comment.info b/modules/comment/comment.info
index f5b14fe138e4a7a660351777757b9e58ded5eae7..376a438bb8e365c8c29a524d6c931ee3a4b850d9 100644
--- a/modules/comment/comment.info
+++ b/modules/comment/comment.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Comment
 description = Allows users to comment on and discuss published content.
-
+package = Core - optional
diff --git a/modules/contact/contact.info b/modules/contact/contact.info
index abe8012ef02417009d1f1d1e07301aece29ac5d4..7959e72ab4e23423c921ab9e019d7df5b7bc4048 100644
--- a/modules/contact/contact.info
+++ b/modules/contact/contact.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Contact
 description = Enables the use of both personal and site-wide contact forms.
-
+package = Core - optional
diff --git a/modules/drupal/drupal.info b/modules/drupal/drupal.info
index 23f02363b4d2a0ab36eabe2dbf88e01b0aced136..1e1eb161c50de3f056fb5e13d3a589dd3e82b6f3 100644
--- a/modules/drupal/drupal.info
+++ b/modules/drupal/drupal.info
@@ -1,4 +1,4 @@
 ; $Id$
 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 = Core - optional
diff --git a/modules/filter/filter.info b/modules/filter/filter.info
index cc656cbf4a7f09ee5b270431ab332091998e0224..75b3ffadbde8dba8b0ece6337dbbe3323de3c986 100644
--- a/modules/filter/filter.info
+++ b/modules/filter/filter.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Filter
 description = Handles the filtering of content in preparation for display.
-
+package = Core - required
diff --git a/modules/forum/forum.info b/modules/forum/forum.info
index ca9e7f2d03a4a284fd9edb14b525c1b7bc2d1715..e025239a7c94b34b63a3c6a82a50c401026e9b16 100644
--- a/modules/forum/forum.info
+++ b/modules/forum/forum.info
@@ -2,3 +2,4 @@
 name = Forum
 description = Enables threaded discussions about general topics.
 dependencies = taxonomy comment
+package = Core - optional
diff --git a/modules/help/help.info b/modules/help/help.info
index bc38bc25a8032819fe1f98647e1f863a1914e3d7..58d7b2dc8742f43fc4e5c3f512748549035d2e77 100644
--- a/modules/help/help.info
+++ b/modules/help/help.info
@@ -1,3 +1,4 @@
 ; $Id$
 name = Help
 description = Manages the display of online help.
+package = Core - optional
diff --git a/modules/legacy/legacy.info b/modules/legacy/legacy.info
index cf953c6d4f25697ef31b96efb1b3e0cb82da9a4d..c709b57000d0cca6ed8d9b0bf4b1dbe3d6e37a61 100644
--- a/modules/legacy/legacy.info
+++ b/modules/legacy/legacy.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Legacy
 description = Provides legacy handlers for upgrades from older Drupal installations.
-
+package = Core - optional
diff --git a/modules/locale/locale.info b/modules/locale/locale.info
index 56f4ab2c040391ac3d891dd4c6f6eb0a162e29ed..cbde69fb2154e4571bb0e6fffbd25df6f8a71d90 100644
--- a/modules/locale/locale.info
+++ b/modules/locale/locale.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Locale
 description = Enables the translation of the user interface to languages other than English.
-
+package = Core - optional
diff --git a/modules/menu/menu.info b/modules/menu/menu.info
index 7ae926281edbe1099b66003860d6f32ed0d1870a..8987309ccc6ea820c4aa6ec387d9af5defc0237f 100644
--- a/modules/menu/menu.info
+++ b/modules/menu/menu.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Menu
 description = Allows administrators to customize the site navigation menu.
-
+package = Core - optional
diff --git a/modules/node/node.info b/modules/node/node.info
index ccc22963e1f79cfaf12c1f9cfdebe0b97f21e177..c434a05ca7b5bcd5fc878ff3a4555f27a1d79c05 100644
--- a/modules/node/node.info
+++ b/modules/node/node.info
@@ -1,4 +1,5 @@
 ; $Id$
 name = Node
 description = Allows content to be submitted to the site and displayed on pages.
+package = Core - required
 
diff --git a/modules/path/path.info b/modules/path/path.info
index 1fda006aaabb431722214f274c79f38063bf53dc..dc6c2ff572e7d67337f82f27fb82c1a22d729f6d 100644
--- a/modules/path/path.info
+++ b/modules/path/path.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Path
 description = Allows users to rename URLs.
-
+package = Core - optional
diff --git a/modules/ping/ping.info b/modules/ping/ping.info
index ad02584bd1b90b874211658ae836536e3dd9a79d..8bc2a4ea5649355807a31ec3d7bda15881d3e8f9 100644
--- a/modules/ping/ping.info
+++ b/modules/ping/ping.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Ping
 description = Alerts other sites when your site has been updated.
-
+package = Core - optional
diff --git a/modules/poll/poll.info b/modules/poll/poll.info
index 90dbe8156c5ca665373ac22278be32dc79236563..bc348482dd785ca4310a84b8f94583e732d81e45 100644
--- a/modules/poll/poll.info
+++ b/modules/poll/poll.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Poll
 description = Allows your site to capture votes on different topics in the form of multiple choice questions.
-
+package = Core - optional
diff --git a/modules/profile/profile.info b/modules/profile/profile.info
index bd269b2b432d02fae430126882026f5d26975a9c..b94680028e41217f3f56d070f140404121056cc3 100644
--- a/modules/profile/profile.info
+++ b/modules/profile/profile.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Profile
 description = Supports configurable user profiles.
-
+package = Core - optional
diff --git a/modules/search/search.info b/modules/search/search.info
index 96ea5e1a834c31795197d724040ff101f78e7e1d..ca804c326ffb12846db1e335c55dd262748281e1 100644
--- a/modules/search/search.info
+++ b/modules/search/search.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Search
 description = Enables site-wide keyword searching.
-
+package = Core - optional
diff --git a/modules/statistics/statistics.info b/modules/statistics/statistics.info
index 3dc8fd66a281fc31b1863b64ea9513437ebb302c..404b483293b0a2c6a3651e288a5d84e4fc513987 100644
--- a/modules/statistics/statistics.info
+++ b/modules/statistics/statistics.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Statistics
 description = Logs access statistics for your site.
-
+package = Core - optional
diff --git a/modules/system/admin.css b/modules/system/admin.css
index 274ec183f8138f9556a4bbd9d96b85dd73bb4922..78bc512fae651cf7c20b9f41f053f15c250ba344 100644
--- a/modules/system/admin.css
+++ b/modules/system/admin.css
@@ -39,6 +39,12 @@ div.admin .expert-link {
   padding-right: 4px;
 }
 
+table.package {
+  width: 100%;
+}
+table.package .description {
+  width: 100%;
+}
 div.admin-dependencies, div.admin-required {
   font-size: 0.9em;
   color: #444;
diff --git a/modules/system/system.info b/modules/system/system.info
index 134d72084d7cca6ac3e1320427f202618781e0a3..6d78715addc433a61ad7ea75651c83b2edc6d80a 100644
--- a/modules/system/system.info
+++ b/modules/system/system.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = System
 description = Handles general site configuration for administrators.
-
+package = Core - required
diff --git a/modules/system/system.module b/modules/system/system.module
index 7e7510948136aaee01031ddc0cb4509df7ea3175..68d39b230afad66d228a6ba83ca9abc5446ee4a9 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -1333,11 +1333,6 @@ function system_modules($form_values = NULL) {
   // Merge in required modules.
   $modules_required = array('block', 'filter', 'node', 'system', 'user', 'watchdog');
   foreach ($modules_required as $required) {
-    $form['description'][$required]['core'] = array(
-      '#value' => t('Required for Drupal core'),
-      '#prefix' => '<div class="admin-required">',
-      '#suffix' => '</div>',
-    );
     $disabled[] = $required;
     $form['disabled_modules']['#value'][$required] = TRUE;
   }
@@ -1526,18 +1521,7 @@ function theme_system_modules($form) {
     return drupal_render($form);
   }
 
-  foreach (element_children($form['name']) as $key) {
-    $row = array();
-    $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[] = '<strong>'. drupal_render($form['name'][$key]) .'</strong>';
-    $row[] = drupal_render($form['description'][$key]);
-    $rows[] = $row;
-  }
-
+  // Individual table headers.
   $header = array(t('Enabled'));
   if (module_exists('throttle')) {
     $header[] = t('Throttle');
@@ -1545,7 +1529,35 @@ function theme_system_modules($form) {
   $header[] = t('Name');
   $header[] = t('Description');
 
-  $output = theme('table', $header, $rows);
+  // Pull package information from module list and start grouping modules.
+  $modules = $form['validation_modules']['#value'];
+  foreach ($modules as $module) {
+    if (!isset($module->info['package'])) {
+      $module->info['package'] = 'Uncategorized';
+    }
+    $packages[$module->info['package']][$module->name] = $module->info;
+  }
+  ksort($packages);
+
+  // Display packages.
+  $output = '';
+  foreach ($packages as $package => $modules) {
+    $rows = array();
+    foreach ($modules as $key => $module) {
+      $row = array();
+      $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[] = '<strong>'. drupal_render($form['name'][$key]) .'</strong>';
+      $row[] = array('data' => drupal_render($form['description'][$key]), 'class' => 'description');
+      $rows[] = $row;
+    }
+    $output .= '<h2>'. t($package) .'</h2>';
+    $output .= theme('table', $header, $rows, array('class' => 'package'));
+  }
+
   $output .= drupal_render($form);
   return $output;
 }
diff --git a/modules/taxonomy/taxonomy.info b/modules/taxonomy/taxonomy.info
index 988d59c0970235429e04660d2dc4b3ffc01728d5..d124efb40201d2144d133fd3fdc8e2323ae0aad7 100644
--- a/modules/taxonomy/taxonomy.info
+++ b/modules/taxonomy/taxonomy.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Taxonomy
 description = Enables the categorization of content.
-
+package = Core - optional
diff --git a/modules/throttle/throttle.info b/modules/throttle/throttle.info
index 447f17afed7293f0b58a928e358a66c9339c7ea3..e3ada526233bdef134db49545dff7e2ba3f93fa8 100644
--- a/modules/throttle/throttle.info
+++ b/modules/throttle/throttle.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Throttle
 description = Handles the auto-throttling mechanism, to control site congestion.
-
+package = Core - optional
diff --git a/modules/tracker/tracker.info b/modules/tracker/tracker.info
index b814d135f58c88ca11845c18c1d2bff730d802a2..00f8d938b7fa06b2b1feab09f061044f3955a7f3 100644
--- a/modules/tracker/tracker.info
+++ b/modules/tracker/tracker.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Tracker
 description = Enables tracking of recent posts for users.
-
+package = Core - optional
diff --git a/modules/upload/upload.info b/modules/upload/upload.info
index e70c878fee9417416a3d7de15b0274d8cad161eb..8800819982cf8f7e7ffa0dc63cb6f578f221db8b 100644
--- a/modules/upload/upload.info
+++ b/modules/upload/upload.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Upload
 description = Allows users to upload and attach files to content.
-
+package = Core - optional
diff --git a/modules/user/user.info b/modules/user/user.info
index e9bd85f390a975b3f32fc7387304de52d341e348..913deb849a194385248837486a29f5fc776d3b66 100644
--- a/modules/user/user.info
+++ b/modules/user/user.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = User
 description = Manages the user registration and login system.
-
+package = Core - required
diff --git a/modules/watchdog/watchdog.info b/modules/watchdog/watchdog.info
index 2b2d60ac8ef3b7f93917043d534df0a7a9ac6b1c..c256c531d50fda0d660fab8862413b9d4f84fa8b 100644
--- a/modules/watchdog/watchdog.info
+++ b/modules/watchdog/watchdog.info
@@ -1,4 +1,4 @@
 ; $Id$
 name = Watchdog
 description = Logs and records system events.
-
+package = Core - required