diff --git a/includes/menu.inc b/includes/menu.inc
index 05ecac0..0a00e9d 100644
--- a/includes/menu.inc
+++ b/includes/menu.inc
@@ -2779,7 +2779,12 @@ function menu_rebuild() {
     menu_cache_clear_all();
     _menu_clear_page_cache();
 
-    if (defined('MAINTENANCE_MODE')) {
+    // Ensure that the menu is rebuilt at the end of the current request.
+    if (defined('MAINTENANCE_MODE') && MAINTENANCE_MODE == 'update') {
+      drupal_register_shutdown_function('_menu_rebuild_needed_after_updates');
+      variable_del('menu_rebuild_needed');
+    }
+    elseif (defined('MAINTENANCE_MODE')) {
       variable_set('menu_rebuild_needed', TRUE);
     }
     else {
@@ -2802,6 +2807,13 @@ function menu_rebuild() {
 }
 
 /**
+ * Shutdown function so that menus are rebuilt on the next request.
+ */
+function _menu_rebuild_needed_after_updates() {
+  variable_set('menu_rebuild_needed', TRUE);
+}
+
+/**
  * Collects and alters the menu definitions.
  */
 function menu_router_build() {
