diff --git a/includes/module.inc b/includes/module.inc
index fe2a980..c37193a 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -657,20 +657,8 @@ function module_disable($module_list, $disable_dependents = TRUE) {
  *   implemented in that module.
  */
 function module_hook($module, $hook) {
-  $function = $module . '_' . $hook;
-  if (function_exists($function)) {
-    return TRUE;
-  }
-  // If the hook implementation does not exist, check whether it may live in an
-  // optional include file registered via hook_hook_info().
-  $hook_info = module_hook_info();
-  if (isset($hook_info[$hook]['group'])) {
-    module_load_include('inc', $module, $module . '.' . $hook_info[$hook]['group']);
-    if (function_exists($function)) {
-      return TRUE;
-    }
-  }
-  return FALSE;
+  module_implements($hook);
+  return function_exists($module . '_' . $hook);
 }
 
 /**
@@ -712,7 +700,6 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE) {
   if ($reset) {
     $implementations = array();
     cache_set('module_implements', array(), 'cache_bootstrap');
-    drupal_static_reset('module_hook_info');
     drupal_static_reset('drupal_alter');
     cache_clear_all('hook_info', 'cache_bootstrap');
     return;
@@ -792,35 +779,24 @@ function module_hook_info() {
   if (drupal_bootstrap(NULL, FALSE) != DRUPAL_BOOTSTRAP_FULL) {
     return array();
   }
-  $hook_info = &drupal_static(__FUNCTION__);
 
   if (!isset($hook_info)) {
     $hook_info = array();
-    $cache = cache_get('hook_info', 'cache_bootstrap');
-    if ($cache === FALSE) {
-      // Rebuild the cache and save it.
-      // We can't use module_invoke_all() here or it would cause an infinite
-      // loop.
-      foreach (module_list() as $module) {
-        $function = $module . '_hook_info';
-        if (function_exists($function)) {
-          $result = $function();
-          if (isset($result) && is_array($result)) {
-            $hook_info = array_merge_recursive($hook_info, $result);
-          }
-        }
-      }
-      // We can't use drupal_alter() for the same reason as above.
-      foreach (module_list() as $module) {
-        $function = $module . '_hook_info_alter';
-        if (function_exists($function)) {
-          $function($hook_info);
+    foreach (module_list() as $module) {
+      $function = $module . '_hook_info';
+      if (function_exists($function)) {
+        $result = $function();
+        if (isset($result) && is_array($result)) {
+          $hook_info = array_merge_recursive($hook_info, $result);
         }
       }
-      cache_set('hook_info', $hook_info, 'cache_bootstrap');
     }
-    else {
-      $hook_info = $cache->data;
+    // We can't use drupal_alter() for the same reason as above.
+    foreach (module_list() as $module) {
+      $function = $module . '_hook_info_alter';
+      if (function_exists($function)) {
+        $function($hook_info);
+      }
     }
   }
 
