diff --git a/core/lib/Drupal/Core/Cache/BackendChain.php b/core/lib/Drupal/Core/Cache/BackendChain.php
index 5a20ff6..2a47af4 100644
--- a/core/lib/Drupal/Core/Cache/BackendChain.php
+++ b/core/lib/Drupal/Core/Cache/BackendChain.php
@@ -130,6 +130,15 @@ public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array
   }
 
   /**
+   * Implements \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
+   */
+  public function setMultiple(array $items) {
+    foreach ($this->backends as $backend) {
+      $backend->setMultiple($items);
+    }
+  }
+
+  /**
    * Implements Drupal\Core\Cache\CacheBackendInterface::delete().
    */
   public function delete($cid) {
diff --git a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
index 3bdbc64..37f915a 100644
--- a/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
+++ b/core/lib/Drupal/Core/Cache/CacheBackendInterface.php
@@ -149,6 +149,26 @@ public function getMultiple(&$cids, $allow_invalid = FALSE);
   public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array());
 
   /**
+   * Store multiple items in the persistent cache.
+   *
+   * @param $items
+   *   An array of cache items in the form:
+   *   @code
+   *   $items = array(
+   *     $cid => array(
+   *       // Required, will be automatically serialized if not a string.
+   *       'data' => $data,
+   *       // Optional, defaults to CacheBackendInterface::CACHE_PERMANENT.
+   *       'expire' => CacheBackendInterface::CACHE_PERMANENT,
+   *       // (optional) The cache tags for this item, see CacheBackendInterface::set().
+   *       'tags' => array(),
+   *     ),
+   *   );
+   *   @endcode
+   */
+  public function setMultiple(array $items);
+
+  /**
    * Deletes an item from the cache.
    *
    * If the cache item is being deleted because it is no longer "fresh", you may
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index cd81acc..5db9901 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -202,6 +202,39 @@ protected function doSet($cid, $data, $expire, $tags) {
   }
 
   /**
+   * Implements \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
+   */
+  function setMultiple(array $items) {
+    // Use a transaction so that the database can write the changes in a single
+    // commit.
+    $transaction = $this->connection->startTransaction();
+    $this->deleteMultiple(array_keys($items));
+    $query = $this->connection
+      ->insert($this->bin)
+      ->fields(array('cid', 'data', 'expire', 'created', 'serialized', 'tags', 'checksum_invalidations', 'checksum_deletions'));
+    foreach ($items as $cid => $item) {
+      $item += array(
+        'expire' => CacheBackendInterface::CACHE_PERMANENT,
+        'tags' => array(),
+      );
+      $flat_tags = $this->flattenTags($item['tags']);
+      $checksum = $this->checksumTags($flat_tags);
+      $fields = array(
+        'cid' => $cid,
+        'data' => is_string($item['data']) ? $item['data'] : serialize($item['data']),
+        'expire' => $item['expire'],
+        'created' => REQUEST_TIME,
+        'serialized' => is_string($item['data']) ? 0 : 1,
+        'tags' => implode(' ', $flat_tags),
+        'checksum_invalidations' => $checksum['invalidations'],
+        'checksum_deletions' => $checksum['deletions'],
+      );
+      $query->values($fields);
+    }
+    $query->execute();
+  }
+
+  /**
    * Implements Drupal\Core\Cache\CacheBackendInterface::delete().
    */
   public function delete($cid) {
diff --git a/core/lib/Drupal/Core/Cache/MemoryBackend.php b/core/lib/Drupal/Core/Cache/MemoryBackend.php
index a7faca6..198213b 100644
--- a/core/lib/Drupal/Core/Cache/MemoryBackend.php
+++ b/core/lib/Drupal/Core/Cache/MemoryBackend.php
@@ -106,6 +106,15 @@ public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array
   }
 
   /**
+   * Implements \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
+   */
+  public function setMultiple(array $items = array()) {
+    foreach ($items as $cid => $item) {
+      $this->set($cid, $item['data'], isset($item['expire']) ? $item['expire'] : CacheBackendInterface::CACHE_PERMANENT, isset($item['tags']) ? $item['tags'] : array());
+    }
+  }
+
+  /**
    * Implements Drupal\Core\Cache\CacheBackendInterface::delete().
    */
   public function delete($cid) {
diff --git a/core/lib/Drupal/Core/Cache/NullBackend.php b/core/lib/Drupal/Core/Cache/NullBackend.php
index 0364663..241cf47 100644
--- a/core/lib/Drupal/Core/Cache/NullBackend.php
+++ b/core/lib/Drupal/Core/Cache/NullBackend.php
@@ -48,6 +48,11 @@ public function getMultiple(&$cids, $allow_invalid = FALSE) {
   public function set($cid, $data, $expire = Cache::PERMANENT, array $tags = array()) {}
 
   /**
+   * Implements \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
+   */
+  public function setMultiple(array $items = array()) {}
+
+  /**
    * Implements Drupal\Core\Cache\CacheBackendInterface::delete().
    */
   public function delete($cid) {}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php
index e558816..0704ec7 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/GenericCacheBackendUnitTestBase.php
@@ -295,6 +295,25 @@ public function testGetMultiple() {
     $this->assertFalse(in_array('test19', $cids), "Added cache id test19 is not in cids array.");
   }
 
+   /**
+   * Tests \Drupal\Core\Cache\CacheBackendInterface::setMultiple().
+   */
+  public function testSetMultiple() {
+    $backend = $this->getCacheBackend();
+
+    // Set numerous testing keys.
+    $backend->set('cid_1', 'Some other value');
+    $items = array(
+      'cid_1' => array('data' => 1),
+      'cid_2' => array('data' => 2),
+    );
+    $backend->setMultiple($items);
+    $cids = array_keys($items);
+    $cached = $backend->getMultiple($cids);
+    $this->assertEqual($cached['cid_1']->data, $items['cid_1']['data'], 'Over-written cache item set correctly.');
+    $this->assertEqual($cached['cid_2']->data, $items['cid_2']['data'], 'New cache item set correctly.');
+  }
+
   /**
    * Tests Drupal\Core\Cache\CacheBackendInterface::isEmpty().
    */
