diff --git a/includes/module.inc b/includes/module.inc
index 3f0c63d..58dfac1 100644
--- a/includes/module.inc
+++ b/includes/module.inc
@@ -446,7 +446,7 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
   if ($reset) {
     $implementations = array();
     $verified = array();
-    cache_set('module_implements', array());
+    cache_set('module_implements', array(array(), array()));
     return;
   }

@@ -456,7 +456,7 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
     // be optimized as tightly, and not doing so keeps the cache entry smaller.
     if (isset($implementations['#write_cache']) && ($_SERVER['REQUEST_METHOD'] == 'GET' || $_SERVER['REQUEST_METHOD'] == 'HEAD')) {
       unset($implementations['#write_cache']);
-      cache_set('module_implements', $implementations);
+      cache_set('module_implements', array($implementations, $verified));
     }
     return;
   }
@@ -466,9 +466,10 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
     $cache = cache_get('module_implements');
     if (!$cache) {
       $implementations = array();
+      $verified = array();
     }
     else {
-      $implementations = $cache->data;
+      list($implementations, $verified) = $cache->data;
     }
   }

@@ -483,6 +484,7 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
         $implementations[$hook][] = $module;
       }
     }
+    $write_cache = TRUE;
   }
   elseif (empty($verified[$hook])) {
     foreach ($implementations[$hook] as $key => $module) {
@@ -497,6 +499,11 @@ function module_implements($hook, $sort = FALSE, $reset = FALSE, $write_cache =
       }
     }
     $verified[$hook] = TRUE;
+    $write_cache = TRUE;
+  }
+
+  if ($write_cache) {
+    cache_set('module_implements', array($implementations, $verified));
   }

   // The explicit cast forces a copy to be made. This is needed because

