diff --git includes/module.inc includes/module.inc
index ac32df9..679e0a9 100644
--- includes/module.inc
+++ includes/module.inc
@@ -9,10 +9,23 @@
 
 /**
  * Load all the modules that have been enabled in the system table.
+ * 
+ * @param $bootstrap
+ *   Whether to load only the reduced set of modules loaded in "bootstrap mode"
+ *   for cached pages. See bootstrap.inc. If NULL, return a boolean indicating that this function has
+ *   run already.
  */
 function module_load_all($bootstrap = FALSE) {
-  foreach (module_list(TRUE, $bootstrap) as $module) {
-    drupal_load('module', $module);
+  static $has_run = FALSE;
+  
+  if (is_null($bootstrap)) {
+    return $has_run;
+  }
+  else {
+    $has_run = TRUE;
+    foreach (module_list(TRUE, $bootstrap) as $module) {
+      drupal_load('module', $module);
+    }
   }
 }
 
diff --git includes/theme.inc includes/theme.inc
index 65fefe2..fe061be 100644
--- includes/theme.inc
+++ includes/theme.inc
@@ -251,13 +251,18 @@ function _theme_load_registry($theme, $base_theme = NULL, $theme_engine = NULL)
   $cache = cache_get("theme_registry:$theme->name", 'cache');
   if (isset($cache->data)) {
     $registry = $cache->data;
+    _theme_set_registry($registry);
   }
   else {
     // If not, build one and cache it.
     $registry = _theme_build_registry($theme, $base_theme, $theme_engine);
-    _theme_save_registry($theme, $registry);
+   // Only persist this registry if all modules are loaded. This assures a 
+   // complete set of theme hooks.
+    if (module_is_loaded_all()) {
+      _theme_save_registry($theme, $registry);
+      _theme_set_registry($registry);
+    }
   }
-  _theme_set_registry($registry);
 }
 
 /**
