Index: includes/menu.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/menu.inc,v
retrieving revision 1.285
diff -u -p -u -p -r1.285 menu.inc
--- includes/menu.inc	25 Aug 2008 07:50:51 -0000	1.285
+++ includes/menu.inc	31 Aug 2008 09:56:18 -0000
@@ -1787,8 +1787,11 @@ function _menu_navigation_links_rebuild(
       $existing_item = db_fetch_array(db_query("SELECT mlid, menu_name, plid, customized, has_children, updated FROM {menu_links} WHERE link_path = '%s' AND module = '%s'", $item['link_path'], 'system'));
       if ($existing_item) {
         $item['mlid'] = $existing_item['mlid'];
-        $item['menu_name'] = $existing_item['menu_name'];
-        $item['plid'] = $existing_item['plid'];
+        // A change in hook_menu may move the link to a different menu
+        if (empty($item['menu_name']) || ($item['menu_name'] == $existing_item['menu_name'])) {
+          $item['menu_name'] = $existing_item['menu_name'];
+          $item['plid'] = $existing_item['plid'];
+        }
         $item['has_children'] = $existing_item['has_children'];
         $item['updated'] = $existing_item['updated'];
       }
Index: modules/simpletest/tests/hook_menu.info
===================================================================
RCS file: modules/simpletest/tests/hook_menu.info
diff -N modules/simpletest/tests/hook_menu.info
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/hook_menu.info	31 Aug 2008 09:56:18 -0000
@@ -0,0 +1,8 @@
+; $Id$
+name = "Hook menu tests"
+description = "Support module for menu hook testing."
+package = Testing
+version = VERSION
+core = 7.x
+files[] = hook_menu.module
+hidden = TRUE
Index: modules/simpletest/tests/hook_menu.module
===================================================================
RCS file: modules/simpletest/tests/hook_menu.module
diff -N modules/simpletest/tests/hook_menu.module
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/hook_menu.module	31 Aug 2008 09:56:18 -0000
@@ -0,0 +1,19 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Dummy module implementing hook menu to test changing the menu name.
+ */
+
+function hook_menu_menu() {
+  /**
+   * The name of the menu changes during the course of this test. Use a global.
+   */
+  $items['menu_name_test'] = array(
+    'title' => t('Test menu_name router item'),
+    'page callback' => 'node_save',
+    'menu_name' => isset($GLOBALS["hook_menu_name"]) ? $GLOBALS["hook_menu_name"] : 'original',
+  );
+  return $items;
+}
\ No newline at end of file
Index: modules/simpletest/tests/menu.test
===================================================================
RCS file: modules/simpletest/tests/menu.test
diff -N modules/simpletest/tests/menu.test
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ modules/simpletest/tests/menu.test	31 Aug 2008 09:56:18 -0000
@@ -0,0 +1,44 @@
+<?php
+// $Id$
+
+/**
+ * @file
+ * Provides SimpleTests for menu.inc.
+ */
+
+class MenuIncTestCase extends DrupalWebTestCase {
+  /**
+   * Implementation of getInfo().
+   */
+  function getInfo() {
+    return array(
+      'name' => t('Hook menu tests'),
+      'description' => t('Test menu hook functionality.'),
+      'group' => t('Menu'),
+    );
+  }
+
+  /**
+   * Implementation of setUp().
+   */
+  function setUp() {
+    // Enable dummy module that implements hook_menu.
+    parent::setUp('hook_menu');
+  }
+  
+  /**
+   * Tests for menu_name parameter for hook_menu().
+   */
+  function testMenuName() {
+    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
+    $name = db_result(db_query($sql));
+    $this->assertEqual($name, 'original', t('Menu name is "original".'));
+
+    $GLOBALS["hook_menu_name"] = 'changed';
+
+    menu_rebuild();
+    $sql = "SELECT menu_name FROM {menu_links} WHERE router_path = 'menu_name_test'";
+    $name = db_result(db_query($sql));
+    $this->assertEqual($name, 'changed', t('Menu name was successfully changed after rebuild.'));
+  }
+}
