Index: admin_menu.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/admin_menu/admin_menu.inc,v
retrieving revision 1.1.4.6
diff -u -p -r1.1.4.6 admin_menu.inc
--- admin_menu.inc	9 Dec 2007 01:02:40 -0000	1.1.4.6
+++ admin_menu.inc	5 Jan 2008 17:14:47 -0000
@@ -149,22 +149,63 @@ function admin_menu_adjust_items(&$_admi
     admin_menu_add_item($_admin_menu, $mid_icon, array('title' => t('Run updates'), 'path' => $base_url .'/update.php', 'weight' => 50));
   }
   
+  // Move core system settings into a 'System' category.
+  $mid_settings = $_admin_menu['index']['admin/settings'];
+  if (user_access('administer site configuration')) {
+    $core_settings = array('image-toolkit', 'file-system', 'date-time', 'error-reporting', 'performance', 'clean-urls', 'admin', 'site-maintenance', 'site-information');
+    $mid_system_settings = admin_menu_add_item($_admin_menu, $mid_settings, array('title' => t('System'), 'path' => 'admin/settings'));
+    foreach ($core_settings as $path) {
+      $mid_core_setting = $_admin_menu['index']['admin/settings/'. $path];
+      admin_menu_move_item($_admin_menu, $mid_core_setting, $mid_system_settings);
+    }
+  }
+  
+  // Build a list of contrib modules and move their settings into corresponding
+  // package name category.
+  $modules = array();
+  $package_mids = array();
+  foreach (module_list(FALSE, FALSE, TRUE) as $module) {
+    $info = _module_parse_info_file(drupal_get_path('module', $module) .'/'. $module .'.info');
+    // Skip core modules.
+    if (isset($info['package']) && substr($info['package'], 0, 4) == 'Core') {
+      continue;
+    }
+    // Save module info for issue queue links.
+    $modules[$module] = $info;
+    
+    if (isset($info['package'])) {
+      // (Simple) sanity check. As of now, there's no safe way to determine the
+      // real paths of module setting pages.
+      $path = 'admin/settings/'. $module;
+      if (!isset($_admin_menu['index'][$path])) {
+        continue;
+      }
+      // Move module settings into package category, if defined.
+      $mid_module_settings = $_admin_menu['index'][$path];
+      $package_item = array('title' => $info['package'], 'path' => 'admin/settings');
+      if (!isset($package_mids[$info['package']])) {
+        $package_mids[$info['package']] = admin_menu_add_item($_admin_menu, $mid_settings, $package_item);
+      }
+      admin_menu_move_item($_admin_menu, $mid_module_settings, $package_mids[$info['package']]);
+    }
+  }
+
   // Add links to drupal.org.
   if (user_access('display drupal links')) {
-    $mid_drupal = admin_menu_add_item($_admin_menu, $mid_icon, array('title' => t('Drupal.org'), 'path' => 'http://drupal.org', 'weight' => 100));
-    admin_menu_add_item($_admin_menu, $mid_drupal, array('title' => t('Drupal issue queue'), 'path' => 'http://drupal.org/project/issues/drupal'));
+    $mid_issues = admin_menu_add_item($_admin_menu, $mid_icon, array('title' => t('Drupal.org'), 'path' => 'http://drupal.org', 'weight' => 100));
+    admin_menu_add_item($_admin_menu, $mid_issues, array('title' => t('Drupal issue queue'), 'path' => 'http://drupal.org/project/issues/drupal', 'weight' => -10));
     
     // Add links to project issue queues.
-    foreach (module_list(FALSE, FALSE, TRUE) as $module) {
-      $info = _module_parse_info_file(drupal_get_path('module', $module) .'/'. $module .'.info');
-      if (isset($info['project']) && $info['project'] == 'drupal') {
-        continue;
+    $projects = array();
+    foreach ($modules as $module => $info) {
+      if (!empty($info['project']) && !isset($projects[$info['project']])) {
+        $projects[$info['project']] = 1;
+        $url = 'http://drupal.org/project/issues/'. $info['project'];
+        // Filtering project versions via query string is not yet supported.
+        // @see http://drupal.org/node/97569
+        // $url .= !empty($info['version']) ? '/'. $info['version'] : '';
+        admin_menu_add_item($_admin_menu, $mid_issues, array('title' => t('@title issue queue', array('@title' => $info['name'])), 'path' => $url, 'weight' => 0));
       }
-      $url = 'http://drupal.org/project/issues/'. $module;
-      // Filter project versions via query string not yet supported.
-      // @see http://drupal.org/node/97569
-      // $url .= !empty($info['version']) ? '/'. $info['version'] : '';
-      admin_menu_add_item($_admin_menu, $mid_drupal, array('title' => t('@title issue queue', array('@title' => $info['name'])), 'path' => $url));
     }
   }
   
