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	7 Jan 2008 00:57:54 -0000
@@ -149,22 +149,67 @@ 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/package-'. preg_replace('/[^a-zA-Z-]/', '', $info['package']),
+        'link' => FALSE,
+      );
+      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));
     }
   }
   
Index: admin_menu.module
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/admin_menu/admin_menu.module,v
retrieving revision 1.26.2.11
diff -u -p -r1.26.2.11 admin_menu.module
--- admin_menu.module	6 Jan 2008 14:52:05 -0000	1.26.2.11
+++ admin_menu.module	7 Jan 2008 01:17:29 -0000
@@ -192,6 +192,10 @@ function admin_menu_item_link($mid) {
   // Remove menu item tooltips due to mouseover clashes.
   unset($item['description']);
   
+  if (isset($link_item['link']) && $link_item['link'] == FALSE) {
+    $link_item['path'] = $_GET['q'];
+    $link_item['fragment'] = '';
+  }
   return theme_admin_menu_item_link($item, $link_item);
 }
 
@@ -208,7 +212,7 @@ function admin_menu_item_link($mid) {
  * @see theme_menu_item_link()
  */
 function theme_admin_menu_item_link($item, $link_item) {
-  return l($item['title'], $link_item['path'], !isset($item['description']) ? array('title' => $item['description']) : array(), isset($item['query']) ? $item['query'] : NULL, NULL, FALSE, TRUE);
+  return l($item['title'], $link_item['path'], array(), isset($link_item['query']) ? $link_item['query'] : NULL, isset($link_item['fragment']) ? $link_item['fragment'] : NULL, FALSE, TRUE);
 }
 
 /**
@@ -245,7 +249,8 @@ function _admin_menu_sort($a, $b) {
  * @param array $item
  *   An menu item array for the menu system. May contain the key 'weight' to
  *   adjust the item's weight. You can use Devel module to display additional
- *   information about menu items.
+ *   information about menu items. If the key 'link' with value FALSE is set, an
+ *   item without a link is created (useful for grouping menu items).
  *
  * @return int
  *   The id of the new menu item.
