diff --git a/dmemcache.inc b/dmemcache.inc
new file mode 100644
index 0000000000000000000000000000000000000000..bd7ecd59898eb2444a3733f31b6cfd9702add677
--- /dev/null
+++ b/dmemcache.inc
@@ -0,0 +1,206 @@
+<?php
+// $Id$
+
+/*
+ * Core dmemcache functions required by:
+ *   memcache.inc
+ *   memcache.db.inc
+ *   session-memcache.inc
+ *   session-memcache.db.inc
+ */
+
+global $_memcache_statistics;
+$_memcache_statistics = array('get' => array(), 'set' => array(), 'hit' => array());
+
+/*
+ * A memcache API for Drupal.
+ */
+
+/**
+ *  Place an item into memcache
+ *
+ * @param $key The string with with you will retrieve this item later.
+ * @param $value The item to be stored.
+ * @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
+ *   (but memcached server doesn't guarantee this item to be stored all the time, it could be
+ *   deleted from the cache to make place for other items).
+ * @param $bin The name of the Drupal subsystem that is making this call. Examples could be
+ *   'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
+ *   different memcache servers.
+ *
+ * @return bool
+ */
+function dmemcache_set($key, $value, $exp = 0, $bin = 'cache') {
+  global $_memcache_statistics;
+  $_memcache_statistics['set'][] = $key;
+  $_memcache_statistics['bins'][] = $bin;
+  if ($mc = dmemcache_object($bin)) {
+    $full_key = dmemcache_key($key, $bin);
+    if (!$mc->set($full_key, $value, TRUE, $exp)) {
+      watchdog('memcache', 'Failed to set key: ' . $full_key, WATCHDOG_ERROR);
+    }
+    else {
+      return TRUE;
+    }
+  }
+  return FALSE;
+}
+
+/**
+ * Retrieve a value from the cache.
+ *
+ * @param $key The key with which the item was stored.
+ * @param $bin The bin in which the item was stored.
+ *
+ * @return The item which was originally saved or FALSE
+ */
+function dmemcache_get($key, $bin = 'cache') {
+  global $_memcache_statistics;
+  $_memcache_statistics['get'][] = $key;
+  $_memcache_statistics['bins'][] = $bin;
+  if ($mc = dmemcache_object($bin)) {
+    $full_key = dmemcache_key($key, $bin);
+    $result = $mc->get($full_key);
+    if ($result) {
+      $_memcache_statistics['hit'][] = $key;
+    }
+    return $result;
+  }
+}
+
+/**
+ * Deletes an item from the cache.
+ *
+ * @param $key The key with which the item was stored.
+ * @param $bin The bin in which the item was stored.
+ *
+ * @return Returns TRUE on success or FALSE on failure.
+ */
+function dmemcache_delete($key, $bin = 'cache') {
+  if ($mc = dmemcache_object($bin)) {
+    $full_key = dmemcache_key($key, $bin);
+    return $mc->delete($full_key);
+  }
+  return FALSE;
+}
+
+/**
+ * Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
+ * resources, it only marks all the items as expired, so occupied memory will be overwritten by
+ * new items.
+ *
+ * @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
+ *   as $bin. There is no way at this time to empty just one bin.
+ *
+ * @return Returns TRUE on success or FALSE on failure.
+ */
+function dmemcache_flush($bin = 'cache') {
+  if ($mc = dmemcache_object($bin)) {
+    return $mc->flush();
+  }
+}
+
+function dmemcache_stats($bin = 'cache', $type = '') {
+  if ($mc = dmemcache_object($bin)) {
+    return $mc->getExtendedStats($type);
+  }
+}
+
+/**
+ * Returns an Memcache object based on the bin requested. Note that there is
+ * nothing preventing developers from calling this function directly to get the
+ * Memcache object. Do this if you need functionality not provided by this API
+ * or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
+ * delete, flush) API functions provided here.
+ *
+ * @param $bin The bin which is to be used.
+ *
+ * @param $flush Rebuild the bin/server/cache mapping.
+ *
+ * @return an Memcache object or FALSE.
+ */
+function dmemcache_object($bin = NULL, $flush = FALSE) {
+  static $memcacheCache = array(), $memcache_servers, $memcache_bins;
+
+  if ($flush) {
+    foreach ($memcacheCache as $cluster) {
+      $cluster->close();
+    }
+    $memcacheCache = array();
+  }
+
+  if (empty($memcacheCache) || empty($memcacheCache[$bin])) {
+    // $memcache_servers and $memcache_bins originate from settings.php.
+    // $memcache_servers_custom and $memcache_bins_custom get set by
+    // memcache.module. They are then merged into $memcache_servers and
+    // $memcache_bins, which are statically cached for performance.
+    if (empty($memcache_servers)) {
+      // Values from settings.php
+      $memcache_servers = variable_get('memcache_servers', array('127.0.0.1:11211' => 'default'));
+      $memcache_bins    = variable_get('memcache_bins', array('cache' => 'default'));
+    }
+
+    // If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
+    $cluster = empty($memcache_bins[$bin]) ? 'default' : $memcache_bins[$bin];
+
+    // If this bin isn't in our $memcache_bins configuration array, and the
+    // 'default' cluster is already initialized, map the bin to 'cache' because
+    // we always map the 'cache' bin to the 'default' cluster.
+    if (empty($memcache_bins[$bin]) && !empty($memcacheCache['cache'])) {
+      $memcacheCache[$bin] = &$memcacheCache['cache'];
+    }
+    else {
+      // Create a new Memcache object. Each cluster gets its own Memcache object.
+      $memcache = new Memcache;
+      // A variable to track whether we've connected to the first server.
+      $init = FALSE;
+
+      // Link all the servers to this cluster.
+      foreach ($memcache_servers as $s => $c) {
+        if ($c == $cluster) {
+          list($host, $port) = explode(':', $s);
+
+          // This is a server that belongs to this cluster.
+          if (!$init) {
+            // First server gets the connect.
+            if (@$memcache->addServer($host, $port)) {
+              // Only set init to true if a connection was made.
+              $init = TRUE;
+            }
+          }
+          else {
+            // Subsequent servers gett addServer.
+            @$memcache->addServer($host, $port);
+          }
+        }
+      }
+
+      if ($init) {
+        // Map the current bin with the new Memcache object.
+        $memcacheCache[$bin] = $memcache;
+
+        // Now that all the servers have been mapped to this cluster, look for
+        // other bins that belong to the cluster and map them too.
+        foreach ($memcache_bins as $b => $c) {
+          if ($c == $cluster && $b != $bin) {
+            // Map this bin and cluster by reference.
+            $memcacheCache[$b] = &$memcacheCache[$bin];
+          }
+        }
+      }
+    }
+  }
+
+  return empty($memcacheCache[$bin]) ? FALSE : $memcacheCache[$bin];
+}
+
+function dmemcache_key($key, $bin = 'cache') {
+  static $prefix;
+  // memcache_key_prefix can be set in settings.php to support site namespaces
+  // in a multisite environment.
+  if (empty($prefix)) {
+    $prefix = variable_get('memcache_key_prefix', '');
+  }
+  $full_key = ($prefix ? $prefix. '-' : '') . $bin . '-' . $key;
+  return urlencode($full_key);
+}
diff --git a/memcache.db.inc b/memcache.db.inc
index 55d0ee2b162fb151df79ee72d65cb725a01dc840..796472114ac0aa8bedd17be13e00512b3552f431 100644
--- a/memcache.db.inc
+++ b/memcache.db.inc
@@ -1,202 +1,7 @@
 <?php
 // $Id$
 
-global $_memcache_statistics;
-$_memcache_statistics = array('get' => array(), 'set' => array(), 'hit' => array());
-
-/*
- * A memcache API for Drupal.
- */
-
-/**
- *  Place an item into memcache
- *
- * @param $key The string with with you will retrieve this item later.
- * @param $value The item to be stored.
- * @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
- *   (but memcached server doesn't guarantee this item to be stored all the time, it could be
- *   deleted from the cache to make place for other items).
- * @param $bin The name of the Drupal subsystem that is making this call. Examples could be
- *   'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
- *   different memcache servers.
- *
- * @return bool
- */
-function dmemcache_set($key, $value, $exp = 0, $bin = 'cache') {
-  global $_memcache_statistics;
-  $_memcache_statistics['set'][] = $key;
-  $_memcache_statistics['bins'][] = $bin;
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    if (!$mc->set($full_key, $value, TRUE, $exp)) {
-      watchdog('memcache', 'Failed to set key: ' . $full_key, WATCHDOG_ERROR);
-    }
-    else {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-/**
- * Retrieve a value from the cache.
- *
- * @param $key The key with which the item was stored.
- * @param $bin The bin in which the item was stored.
- *
- * @return The item which was originally saved or FALSE
- */
-function dmemcache_get($key, $bin = 'cache') {
-  global $_memcache_statistics;
-  $_memcache_statistics['get'][] = $key;
-  $_memcache_statistics['bins'][] = $bin;
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    $result = $mc->get($full_key);
-    if ($result) {
-      $_memcache_statistics['hit'][] = $key;
-    }
-    return $result;
-  }
-}
-
-/**
- * Deletes an item from the cache.
- *
- * @param $key The key with which the item was stored.
- * @param $bin The bin in which the item was stored.
- *
- * @return Returns TRUE on success or FALSE on failure.
- */
-function dmemcache_delete($key, $bin = 'cache') {
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    return $mc->delete($full_key);
-  }
-  return FALSE;
-}
-
-/**
- * Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
- * resources, it only marks all the items as expired, so occupied memory will be overwritten by
- * new items.
- *
- * @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
- *   as $bin. There is no way at this time to empty just one bin.
- *
- * @return Returns TRUE on success or FALSE on failure.
- */
-function dmemcache_flush($bin = 'cache') {
-  if ($mc = dmemcache_object($bin)) {
-    return $mc->flush();
-  }
-}
-
-function dmemcache_stats($bin = 'cache') {
-  if ($mc = dmemcache_object($bin)) {
-    return $mc->getExtendedStats();
-  }
-}
-
-/**
- * Returns an Memcache object based on the bin requested. Note that there is
- * nothing preventing developers from calling this function directly to get the
- * Memcache object. Do this if you need functionality not provided by this API
- * or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
- * delete, flush) API functions provided here.
- *
- * @param $bin The bin which is to be used.
- *
- * @param $flush Rebuild the bin/server/cache mapping.
- *
- * @return an Memcache object or FALSE.
- */
-function dmemcache_object($bin = NULL, $flush = FALSE) {
-  static $memcacheCache = array(), $memcache_servers, $memcache_bins;
-
-  if ($flush) {
-    foreach ($memcacheCache as $cluster) {
-      $cluster->close();
-    }
-    $memcacheCache = array();
-  }
-
-  if (empty($memcacheCache) || empty($memcacheCache[$bin])) {
-    // $memcache_servers and $memcache_bins originate from settings.php.
-    // $memcache_servers_custom and $memcache_bins_custom get set by
-    // memcache.module. They are then merged into $memcache_servers and
-    // $memcache_bins, which are statically cached for performance.
-    if (empty($memcache_servers)) {
-      // Values from settings.php
-      $memcache_servers = variable_get('memcache_servers', array('127.0.0.1:11211' => 'default'));
-      $memcache_bins    = variable_get('memcache_bins', array('cache' => 'default'));
-    }
-
-    // If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
-    $cluster = empty($memcache_bins[$bin]) ? 'default' : $memcache_bins[$bin];
-
-    // If this bin isn't in our $memcache_bins configuration array, and the
-    // 'default' cluster is already initialized, map the bin to 'cache' because
-    // we always map the 'cache' bin to the 'default' cluster.
-    if (empty($memcache_bins[$bin]) && !empty($memcacheCache['cache'])) {
-      $memcacheCache[$bin] = &$memcacheCache['cache'];
-    }
-    else {
-      // Create a new Memcache object. Each cluster gets its own Memcache object.
-      $memcache = new Memcache;
-      // A variable to track whether we've connected to the first server.
-      $init = FALSE;
-
-      // Link all the servers to this cluster.
-      foreach ($memcache_servers as $s => $c) {
-        if ($c == $cluster) {
-          list($host, $port) = explode(':', $s);
-
-          // This is a server that belongs to this cluster.
-          if (!$init) {
-            // First server gets the connect.
-            if (@$memcache->addServer($host, $port)) {
-              // Only set init to true if a connection was made.
-              $init = TRUE;
-            }
-          }
-          else {
-            // Subsequent servers gett addServer.
-            @$memcache->addServer($host, $port);
-          }
-        }
-      }
-
-      if ($init) {
-        // Map the current bin with the new Memcache object.
-        $memcacheCache[$bin] = $memcache;
-
-        // Now that all the servers have been mapped to this cluster, look for
-        // other bins that belong to the cluster and map them too.
-        foreach ($memcache_bins as $b => $c) {
-          if ($c == $cluster && $b != $bin) {
-            // Map this bin and cluster by reference.
-            $memcacheCache[$b] = &$memcacheCache[$bin];
-          }
-        }
-      }
-    }
-  }
-
-  return empty($memcacheCache[$bin]) ? FALSE : $memcacheCache[$bin];
-}
-
-function dmemcache_key($key, $bin = 'cache') {
-  static $prefix;
-  // memcache_key_prefix can be set in settings.php to support site namespaces
-  // in a multisite environment.
-  if (empty($prefix)) {
-    $prefix = variable_get('memcache_key_prefix', '');
-  }
-  $full_key = ($prefix ? $prefix. '-' : '') . $bin . '-' . $key;
-  return urlencode($full_key);
-}
-
+require_once 'dmemcache.inc';
 
 /** Implementation of cache.inc with memcache logic included **/
 
diff --git a/memcache.inc b/memcache.inc
index 28aabcaf26ae66af6e36b4735115342daa19f7a8..b7f716d3c660be0046d262e078f1633e01984aa1 100644
--- a/memcache.inc
+++ b/memcache.inc
@@ -1,202 +1,7 @@
 <?php
 // $Id$
 
-global $_memcache_statistics;
-$_memcache_statistics = array('get' => array(), 'set' => array(), 'hit' => array());
-
-/*
- * A memcache API for Drupal.
- */
-
-/**
- *  Place an item into memcache
- *
- * @param $key The string with with you will retrieve this item later.
- * @param $value The item to be stored.
- * @param $exp Parameter expire is expiration time in seconds. If it's 0, the item never expires
- *   (but memcached server doesn't guarantee this item to be stored all the time, it could be
- *   deleted from the cache to make place for other items).
- * @param $bin The name of the Drupal subsystem that is making this call. Examples could be
- *   'cache', 'alias', 'taxonomy term' etc. It is possible to map different $bin values to
- *   different memcache servers.
- *
- * @return bool
- */
-function dmemcache_set($key, $value, $exp = 0, $bin = 'cache') {
-  global $_memcache_statistics;
-  $_memcache_statistics['set'][] = $key;
-  $_memcache_statistics['bins'][] = $bin;
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    if (!$mc->set($full_key, $value, TRUE, $exp)) {
-      watchdog('memcache', 'Failed to set key: ' . $full_key, WATCHDOG_ERROR);
-    }
-    else {
-      return TRUE;
-    }
-  }
-  return FALSE;
-}
-
-/**
- * Retrieve a value from the cache.
- *
- * @param $key The key with which the item was stored.
- * @param $bin The bin in which the item was stored.
- *
- * @return The item which was originally saved or FALSE
- */
-function dmemcache_get($key, $bin = 'cache') {
-  global $_memcache_statistics;
-  $_memcache_statistics['get'][] = $key;
-  $_memcache_statistics['bins'][] = $bin;
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    $result = $mc->get($full_key);
-    if ($result) {
-      $_memcache_statistics['hit'][] = $key;
-    }
-    return $result;
-  }
-}
-
-/**
- * Deletes an item from the cache.
- *
- * @param $key The key with which the item was stored.
- * @param $bin The bin in which the item was stored.
- *
- * @return Returns TRUE on success or FALSE on failure.
- */
-function dmemcache_delete($key, $bin = 'cache') {
-  if ($mc = dmemcache_object($bin)) {
-    $full_key = dmemcache_key($key, $bin);
-    return $mc->delete($full_key);
-  }
-  return FALSE;
-}
-
-/**
- * Immediately invalidates all existing items. dmemcache_flush doesn't actually free any
- * resources, it only marks all the items as expired, so occupied memory will be overwritten by
- * new items.
- *
- * @param $bin The bin to flush. Note that this will flush all bins mapped to the same server
- *   as $bin. There is no way at this time to empty just one bin.
- *
- * @return Returns TRUE on success or FALSE on failure.
- */
-function dmemcache_flush($bin = 'cache') {
-  if ($mc = dmemcache_object($bin)) {
-    return $mc->flush();
-  }
-}
-
-function dmemcache_stats($bin = 'cache', $type = '') {
-  if ($mc = dmemcache_object($bin)) {
-    return $mc->getExtendedStats($type);
-  }
-}
-
-/**
- * Returns an Memcache object based on the bin requested. Note that there is
- * nothing preventing developers from calling this function directly to get the
- * Memcache object. Do this if you need functionality not provided by this API
- * or if you need to use legacy code. Otherwise, use the dmemcache (get, set,
- * delete, flush) API functions provided here.
- *
- * @param $bin The bin which is to be used.
- *
- * @param $flush Rebuild the bin/server/cache mapping.
- *
- * @return an Memcache object or FALSE.
- */
-function dmemcache_object($bin = NULL, $flush = FALSE) {
-  static $memcacheCache = array(), $memcache_servers, $memcache_bins;
-
-  if ($flush) {
-    foreach ($memcacheCache as $cluster) {
-      $cluster->close();
-    }
-    $memcacheCache = array();
-  }
-
-  if (empty($memcacheCache) || empty($memcacheCache[$bin])) {
-    // $memcache_servers and $memcache_bins originate from settings.php.
-    // $memcache_servers_custom and $memcache_bins_custom get set by
-    // memcache.module. They are then merged into $memcache_servers and
-    // $memcache_bins, which are statically cached for performance.
-    if (empty($memcache_servers)) {
-      // Values from settings.php
-      $memcache_servers = variable_get('memcache_servers', array('127.0.0.1:11211' => 'default'));
-      $memcache_bins    = variable_get('memcache_bins', array('cache' => 'default'));
-    }
-
-    // If there is no cluster for this bin in $memcache_bins, cluster is 'default'.
-    $cluster = empty($memcache_bins[$bin]) ? 'default' : $memcache_bins[$bin];
-
-    // If this bin isn't in our $memcache_bins configuration array, and the
-    // 'default' cluster is already initialized, map the bin to 'cache' because
-    // we always map the 'cache' bin to the 'default' cluster.
-    if (empty($memcache_bins[$bin]) && !empty($memcacheCache['cache'])) {
-      $memcacheCache[$bin] = &$memcacheCache['cache'];
-    }
-    else {
-      // Create a new Memcache object. Each cluster gets its own Memcache object.
-      $memcache = new Memcache;
-      // A variable to track whether we've connected to the first server.
-      $init = FALSE;
-
-      // Link all the servers to this cluster.
-      foreach ($memcache_servers as $s => $c) {
-        if ($c == $cluster) {
-          list($host, $port) = explode(':', $s);
-
-          // This is a server that belongs to this cluster.
-          if (!$init) {
-            // First server gets the connect.
-            if (@$memcache->addServer($host, $port)) {
-              // Only set init to true if a connection was made.
-              $init = TRUE;
-            }
-          }
-          else {
-            // Subsequent servers gett addServer.
-            @$memcache->addServer($host, $port);
-          }
-        }
-      }
-
-      if ($init) {
-        // Map the current bin with the new Memcache object.
-        $memcacheCache[$bin] = $memcache;
-
-        // Now that all the servers have been mapped to this cluster, look for
-        // other bins that belong to the cluster and map them too.
-        foreach ($memcache_bins as $b => $c) {
-          if ($c == $cluster && $b != $bin) {
-            // Map this bin and cluster by reference.
-            $memcacheCache[$b] = &$memcacheCache[$bin];
-          }
-        }
-      }
-    }
-  }
-
-  return empty($memcacheCache[$bin]) ? FALSE : $memcacheCache[$bin];
-}
-
-function dmemcache_key($key, $bin = 'cache') {
-  static $prefix;
-  // memcache_key_prefix can be set in settings.php to support site namespaces
-  // in a multisite environment.
-  if (empty($prefix)) {
-    $prefix = variable_get('memcache_key_prefix', '');
-  }
-  $full_key = ($prefix ? $prefix. '-' : '') . $bin . '-' . $key;
-  return urlencode($full_key);
-}
-
+require_once 'dmemcache.inc';
 
 /** Implementation of cache.inc with memcache logic included **/
 
diff --git a/memcache.module b/memcache.module
index d3307d9700608d5c8933a7a9e0e61178afa54179..2c9a40effa36641ea073f9d2c6062a8ea9816ac9 100644
--- a/memcache.module
+++ b/memcache.module
@@ -40,7 +40,7 @@ function memcache_shutdown() {
     if (!empty($stats)) {
       $output = theme('item_list', $stats);
       // this makes sure all of the HTML is within the <body> even though this <script> is outside it
-      print '<div id="memcache-devel">'. $output.'</div>';
+      print '<div id="memcache-devel"><h2>'. t('Memcache statistics'). '</h2>'. $output.'</div>';
     }
   }
 }