=== modified file 'includes/menu.inc'
--- includes/menu.inc	2009-12-17 13:10:18 +0000
+++ includes/menu.inc	2010-01-01 22:38:19 +0000
@@ -118,6 +118,11 @@ define('MENU_IS_LOCAL_TASK', 0x0080);
 define('MENU_IS_LOCAL_ACTION', 0x0100);
 
 /**
+ * Internal menu flag -- menu item is a grouping page.
+ */
+define('MENU_IS_GROUP', 0x0200);
+
+/**
  * @} End of "Menu flags".
  */
 
@@ -181,6 +186,14 @@ define('MENU_DEFAULT_LOCAL_TASK', MENU_I
 define('MENU_LOCAL_ACTION', MENU_IS_LOCAL_TASK | MENU_IS_LOCAL_ACTION | MENU_VISIBLE_IN_BREADCRUMB);
 
 /**
+ * Menu type -- a groupping page.
+ *
+ * A groupping page is only visible if there are immediate children with the
+ * same permissions.
+ */
+define('MENU_GROUP', MENU_VISIBLE_IN_TREE | MENU_VISIBLE_IN_BREADCRUMB | MENU_IS_GROUP);
+
+/**
  * @} End of "Menu item types".
  */
 
@@ -3071,6 +3084,7 @@ function _menu_router_build($callbacks) 
   }
   array_multisort($sort, SORT_NUMERIC, $menu);
   // Apply inheritance rules.
+  $group_items = array();
   foreach ($menu as $path => $v) {
     $item = &$menu[$path];
     if (!$item['_tab']) {
@@ -3082,6 +3096,10 @@ function _menu_router_build($callbacks) 
     elseif (!isset($item['context'])) {
       $item['context'] = MENU_CONTEXT_PAGE;
     }
+    if ($item['type'] == MENU_IS_GROUP) {
+      $group_items[$path] = $item;
+    }
+    $had_parent = FALSE;
     for ($i = $item['_number_parts'] - 1; $i; $i--) {
       $parent_path = implode('/', array_slice($item['_parts'], 0, $i));
       if (isset($menu[$parent_path])) {
@@ -3144,18 +3162,16 @@ function _menu_router_build($callbacks) 
             $item['theme arguments'] = $parent['theme arguments'];
           }
         }
+        if ($parent['type'] == 'MENU_GROUP' && !$had_parent) {
+          _menu_router_build_add_access_callback($item);
+          if ($item['access callback'] === $parent['access callback'] && $item['access arguments'] == $parent['access arguments']) {
+            $parent['_visible'] = TRUE;
+          }
+        }
+        $had_parent = TRUE;
       }
     }
-    if (!isset($item['access callback']) && isset($item['access arguments'])) {
-      // Default callback.
-      $item['access callback'] = 'user_access';
-    }
-    if (!isset($item['access callback']) || empty($item['page callback'])) {
-      $item['access callback'] = 0;
-    }
-    if (is_bool($item['access callback'])) {
-      $item['access callback'] = intval($item['access callback']);
-    }
+    _menu_router_build_add_access_callback($item);
 
     $item += array(
       'access arguments' => array(),
@@ -3186,6 +3202,11 @@ function _menu_router_build($callbacks) 
       $item['include file'] = $file_path . '/' . $item['file'];
     }
   }
+  foreach ($group_items as $path => $group_item) {
+    if (empty($group_item['_visible'])) {
+      $group_items[$path]['access callback'] = 0;
+    }
+  }
 
   // Sort the masks so they are in order of descending fit.
   $masks = array_keys($masks);
@@ -3194,6 +3215,19 @@ function _menu_router_build($callbacks) 
   return array($menu, $masks);
 }
 
+function _menu_router_build_add_access_callback(&$item) {
+  if (!isset($item['access callback']) && isset($item['access arguments'])) {
+    // Default callback.
+    $item['access callback'] = 'user_access';
+  }
+  if (!isset($item['access callback']) || empty($item['page callback'])) {
+    $item['access callback'] = 0;
+  }
+  if (is_bool($item['access callback'])) {
+    $item['access callback'] = intval($item['access callback']);
+  }
+}
+
 /**
  * Helper function to save data from menu_router_build() to the router table.
  */

