diff --git a/includes/common.inc b/includes/common.inc
index f95597f..bd6577f 100644
--- a/includes/common.inc
+++ b/includes/common.inc
@@ -4953,6 +4953,10 @@ function _drupal_bootstrap_full() {
     drupal_theme_initialize();
     module_invoke_all('init');
   }
+  if (variable_get('registry_rebuild')) {
+    registry_rebuild();
+    variable_del('registry_rebuild');
+  }
 }
 
 /**
diff --git a/update.php b/update.php
index 2b5d221..641da1f 100644
--- a/update.php
+++ b/update.php
@@ -345,6 +345,54 @@ function update_check_requirements($skip_warnings = FALSE) {
   }
 }
 
+function update_rebuild_registry() {
+  // Do enough rebuilding so Drupal can boot. Hooks are not invoked here.
+  require_once DRUPAL_ROOT . '/includes/common.inc';
+  require_once DRUPAL_ROOT . '/includes/registry.inc';
+
+  $connection_info = Database::getConnectionInfo();
+  $driver = $connection_info['default']['driver'];
+  require_once DRUPAL_ROOT . '/includes/database/query.inc';
+  require_once DRUPAL_ROOT . '/includes/database/select.inc';
+  require_once DRUPAL_ROOT . '/includes/database/' . $driver . '/query.inc';
+
+  // Get current list of modules and their files.
+  $modules = db_query("SELECT * FROM {system} WHERE type = 'module' AND status = 1")->fetchAll();
+  // Get the list of files we are going to parse.
+  $files = array();
+  foreach ($modules as &$module) {
+    $dir = dirname($module->filename);
+
+    // Store the module directory for use in hook_registry_files_alter().
+    $module->dir = $dir;
+    $module->info = drupal_parse_info_file($module->dir . '/' . $module->name . '.info');
+    if (isset($module->info['files'])) {
+      // Add files for enabled modules to the registry.
+      foreach ($module->info['files'] as $file) {
+        $files["$dir/$file"] = array('module' => $module->name, 'weight' => $module->weight);
+      }
+    }
+  }
+  foreach (new RecursiveDirectoryIterator(DRUPAL_ROOT . '/includes') as $file) {
+    $filename = $file->getPathname();
+    if (substr($filename, -4) == '.inc') {
+      $files[$filename] = array('module' => '', 'weight' => 0);
+    }
+  }
+
+  $transaction = db_transaction();
+  try {
+    db_truncate('registry')->execute();
+    db_truncate('registry_file')->execute();
+    _registry_parse_files($files);
+  }
+  catch (Exception $e) {
+    $transaction->rollback();
+    throw $e;
+  }
+  variable_set('registry_rebuild', TRUE);
+}
+
 // Some unavoidable errors happen because the database is not yet up-to-date.
 // Our custom error handler is not yet installed, so we just suppress them.
 ini_set('display_errors', FALSE);
@@ -399,6 +447,8 @@ if (empty($op) && update_access_allowed()) {
   // stage, since the real requirements check happens further down.
   update_check_requirements(TRUE);
 
+  update_rebuild_registry();
+
   // Redirect to the update information page if all requirements were met.
   install_goto('update.php?op=info');
 }
