diff --git a/includes/module.inc b/includes/module.inc
index 7f57e1a..dc23f67 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -242,15 +242,15 @@ function module_load_install($module) {
 
 /**
  * Load a module include file.
- * 
+ *
  * Examples:
  * @code
  *   // Load node.admin.inc from the node module.
  *   module_load_include('inc', 'node', 'node.admin');
  *   // Load content_types.inc from the node module.
- *   module_load_include('inc', 'node', 'content_types');  
+ *   module_load_include('inc', 'node', 'content_types');
  * @endcode
- * 
+ *
  * Do not use this function to load an install file. Use module_load_install()
  * instead.
  *
@@ -259,7 +259,7 @@ function module_load_install($module) {
  * @param $module
  *   The module to which the include file belongs.
  * @param $name
- *   Optionally, specify the base file name (without the $type extension). 
+ *   Optionally, specify the base file name (without the $type extension).
  *   If not set, $module is used.
  */
 function module_load_include($type, $module, $name = NULL) {
@@ -416,6 +416,7 @@ function module_hook($module, $hook) {
  */
 function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache = FALSE) {
   static $implementations;
+  static $verified;
 
   // We maintain a persistent cache of hook implementations in addition to the
   // static cache to avoid looping through every module and every hook on each
@@ -429,6 +430,7 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
   // per request.
   if ($reset) {
     $implementations = array();
+    $verified = array();
     cache_set('module_implements', array());
     return;
   }
@@ -463,22 +465,23 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
     $list = module_list(FALSE, TRUE, $sort);
     foreach ($list as $module) {
       if (module_hook($module, $hook)) {
-        $implementations[$hook][$module] = $module;
+        $implementations[$hook][] = $module;
       }
     }
   }
-  else {
-    foreach ($implementations[$hook] as $module) {
+  elseif (empty($verified[$hook])) {
+    foreach ($implementations[$hook] as $key => $module) {
       // It is possible that a module removed a hook implementation without the
       // implementations cache being rebuilt yet, so we check module_hook() on
       // each request to avoid undefined function errors.
       if (!module_hook($module, $hook)) {
         // Clear out the stale implementation from the cache and force a cache
         // refresh to forget about no longer existing hook implementations.
-        unset($implementations[$hook][$module]);
+        unset($implementations[$hook][$key]);
         $implementations['#write_cache'] = TRUE;
       }
     }
+    $verified[$hook] = TRUE;
   }
 
   // The explicit cast forces a copy to be made. This is needed because
