=== modified file 'includes/menu.inc'
--- includes/menu.inc	2007-11-26 16:19:37 +0000
+++ includes/menu.inc	2007-11-28 16:03:37 +0000
@@ -1593,8 +1593,10 @@ function _menu_navigation_links_rebuild(
   $result = db_query("SELECT ml.link_path, ml.mlid, ml.router_path FROM {menu_links} ml WHERE ml.updated = 1");
   while ($item = db_fetch_array($result)) {
     $router_path = _menu_find_router_path($menu, $item['link_path']);
-    if (!empty($router_path) && $router_path != $item['router_path']) {
-      db_query("UPDATE {menu_links} SET router_path = '%s' WHERE mlid = %d", $router_path, $item['mlid']);
+    if (!empty($router_path) && ($router_path != $item['router_path'] || $item['updated'])) {
+      // If the router path and the link path matches, it's surely a working
+      // item, so we clear the updated flag.
+      db_query("UPDATE {menu_links} SET router_path = '%s', updated = %d WHERE mlid = %d", $router_path, $router_path != $item['link_path'], $item['mlid']);
     }
   }
 }
@@ -1623,9 +1625,9 @@ function menu_link_delete($mlid, $path =
  * Helper function for menu_link_delete; deletes a single menu link.
  */
 function _menu_delete_item($item) {
-  // System-created items are never deleted.
-  if ($item && ($item['module'] != 'system')) {
-
+  // System-created items are never deleted. Updated items are an exception,
+  // as they can be broken.
+  if ($item && ($item['module'] != 'system' || $item['updated'])) {
     // Children get re-attached to the item's parent.
     if ($item['has_children']) {
       $result = db_query("SELECT mlid FROM {menu_links} WHERE plid = %d", $item['mlid']);

=== modified file 'modules/menu/menu.admin.inc'
--- modules/menu/menu.admin.inc	2007-11-26 16:36:42 +0000
+++ modules/menu/menu.admin.inc	2007-11-28 15:57:27 +0000
@@ -95,7 +95,7 @@ function _menu_overview_tree_form($tree)
       $operations = array();
       $operations['edit'] = l(t('edit'), 'admin/build/menu/item/'. $item['mlid'] .'/edit');
       // Only items created by the menu module can be deleted.
-      if ($item['module'] == 'menu') {
+      if ($item['module'] == 'menu' || $item['updated'] == 1) {
         $operations['delete'] = l(t('delete'), 'admin/build/menu/item/'. $item['mlid'] .'/delete');
       }
       // Set the reset column.
@@ -527,8 +527,9 @@ function menu_edit_menu_submit($form, &$
  * Menu callback; Check access and present a confirm form for deleting a menu link.
  */
 function menu_item_delete_page($item) {
-  // Links defined via hook_menu may not be deleted.
-  if ($item['module'] == 'system') {
+  // Links defined via hook_menu may not be deleted. Updated items are an
+  // exception, as they can be broken.
+  if ($item['module'] == 'system' && !$item['updated']) {
     drupal_access_denied();
     return;
   }

