diff --git a/core/lib/Drupal/Core/Cache/ChainedFastBackend.php b/core/lib/Drupal/Core/Cache/ChainedFastBackend.php
index f0b1986..a16d4de 100644
--- a/core/lib/Drupal/Core/Cache/ChainedFastBackend.php
+++ b/core/lib/Drupal/Core/Cache/ChainedFastBackend.php
@@ -142,14 +142,16 @@ public function getMultiple(&$cids, $allow_invalid = FALSE) {
       }
 
       // Even if items were successfully fetched from the fast backend, they
-      // are potentially invalid if older than the last time the bin was
-      // written to in the consistent backend, so only keep ones that aren't.
+      // are potentially invalid. They may have been created before the the bin
+      // was last written to, or they may have expired.
       foreach ($items as $item) {
-        if ($item->created < $last_write_timestamp) {
-          $cids[array_search($item->cid, $cids_copy)] = $item->cid;
+        $expire_is_valid = $item->expire == Cache::PERMANENT || $item->expire >= REQUEST_TIME;
+        $last_write_is_valid = $item->created >= $last_write_timestamp;
+        if ($expire_is_valid && $last_write_is_valid) {
+          $cache[$item->cid] = $item;
         }
         else {
-          $cache[$item->cid] = $item;
+          $cids[array_search($item->cid, $cids_copy)] = $item->cid;
         }
       }
     }
@@ -160,7 +162,7 @@ public function getMultiple(&$cids, $allow_invalid = FALSE) {
     if ($cids) {
       foreach ($this->consistentBackend->getMultiple($cids, $allow_invalid) as $item) {
         $cache[$item->cid] = $item;
-        $this->fastBackend->set($item->cid, $item->data);
+        $this->fastBackend->set($item->cid, $item->data, $item->expire, $item->tags);
       }
     }
 
diff --git a/core/tests/Drupal/Tests/Core/Cache/ChainedFastBackendTest.php b/core/tests/Drupal/Tests/Core/Cache/ChainedFastBackendTest.php
index ed2397c..3201ee1 100644
--- a/core/tests/Drupal/Tests/Core/Cache/ChainedFastBackendTest.php
+++ b/core/tests/Drupal/Tests/Core/Cache/ChainedFastBackendTest.php
@@ -75,6 +75,8 @@ public function testFallThroughToConsistentCache() {
       'cid' => 'foo',
       'data' => 'baz',
       'created' => time(),
+      'expire' => time() + 3600,
+      'tags' => [],
     );
 
     $consistent_cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
@@ -111,4 +113,49 @@ public function testFallThroughToConsistentCache() {
     $this->assertEquals('baz', $chained_fast_backend->get('foo')->data);
   }
 
+  /**
+   * Tests that items expire time works with Drupal\Core\Cache\ChainedFastBackend.
+   */
+  public function testExpire() {
+    $timestamp_item = (object) array(
+      'cid' => ChainedFastBackend::LAST_WRITE_TIMESTAMP_PREFIX . 'cache_foo',
+      'data' => time() - 60,
+    );
+    $cache_item = (object) array(
+      'cid' => 'foo',
+      'data' => 'baz',
+      'created' => time(),
+      'expire' => time() - 3600,
+      'tags' => [],
+    );
+
+    $consistent_cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
+    $fast_cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
+
+    // We should get a call for the timestamp on the consistent backend.
+    $consistent_cache->expects($this->once())
+      ->method('get')
+      ->with($timestamp_item->cid)
+      ->will($this->returnValue($timestamp_item));
+
+    // We should get a call for the cache item on the consistent backend.
+    $consistent_cache->expects($this->once())
+      ->method('getMultiple')
+      ->with(array($cache_item->cid))
+      ->will($this->returnValue(array()));
+
+    // We should get a call for the cache item on the fast backend.
+    $fast_cache->expects($this->once())
+      ->method('getMultiple')
+      ->with(array($cache_item->cid))
+      ->will($this->returnValue(array($cache_item->cid => $cache_item)));
+
+    $chained_fast_backend = new ChainedFastBackend(
+      $consistent_cache,
+      $fast_cache,
+      'foo'
+    );
+    $this->assertFalse($chained_fast_backend->get('foo'), "Fetching an item with an expiry in the past should fail.");
+  }
+
 }
