diff --git a/core/core.services.yml b/core/core.services.yml
index c56c778..4b6b33f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -397,7 +397,9 @@ services:
     factory: Drupal\Core\Site\Settings::getInstance
   state:
     class: Drupal\Core\State\State
-    arguments: ['@keyvalue']
+    arguments: ['@keyvalue', '@cache.bootstrap', '@lock']
+    tags:
+      - { name: needs_destruction }
   queue:
     class: Drupal\Core\Queue\QueueFactory
     arguments: ['@settings']
diff --git a/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
index 9c3cfae..5632f9c 100644
--- a/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
@@ -64,7 +64,7 @@ public function onKernelTerminate(PostResponseEvent $event) {
    *   An array of event listener definitions.
    */
   static function getSubscribedEvents() {
-    $events[KernelEvents::TERMINATE][] = array('onKernelTerminate', 100);
+    $events[KernelEvents::TERMINATE][] = array('onKernelTerminate', -100);
     return $events;
   }
 }
diff --git a/core/lib/Drupal/Core/State/State.php b/core/lib/Drupal/Core/State/State.php
index 5da5241..9232892 100644
--- a/core/lib/Drupal/Core/State/State.php
+++ b/core/lib/Drupal/Core/State/State.php
@@ -7,12 +7,15 @@
 
 namespace Drupal\Core\State;
 
+use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Cache\CacheCollector;
 use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
+use Drupal\Core\Lock\LockBackendInterface;
 
 /**
  * Provides the state system using a key value store.
  */
-class State implements StateInterface {
+class State extends CacheCollector implements StateInterface {
 
   /**
    * The key value store to use.
@@ -22,19 +25,17 @@ class State implements StateInterface {
   protected $keyValueStore;
 
   /**
-   * Static state cache.
-   *
-   * @var array
-   */
-  protected $cache = array();
-
-  /**
-   * Constructs a State object.
+   * Constructs an State object.
    *
    * @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
    *   The key value store to use.
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache
+   *   The cache backend.
+   * @param \Drupal\Core\Lock\LockBackendInterface $lock
+   *   The lock backend.
    */
-  function __construct(KeyValueFactoryInterface $key_value_factory) {
+  public function __construct(KeyValueFactoryInterface $key_value_factory, CacheBackendInterface $cache, LockBackendInterface $lock) {
+    parent::__construct('state', $cache, $lock);
     $this->keyValueStore = $key_value_factory->get('state');
   }
 
@@ -42,8 +43,18 @@ function __construct(KeyValueFactoryInterface $key_value_factory) {
    * {@inheritdoc}
    */
   public function get($key, $default = NULL) {
-    $values = $this->getMultiple(array($key));
-    return isset($values[$key]) ? $values[$key] : $default;
+    $value = parent::get($key);
+    return $value !== NULL ? $value : $default;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function resolveCacheMiss($key) {
+    $value = $this->keyValueStore->get($key);
+    $this->storage[$key] = $value;
+    $this->persist($key);
+    return $value;
   }
 
   /**
@@ -51,33 +62,9 @@ public function get($key, $default = NULL) {
    */
   public function getMultiple(array $keys) {
     $values = array();
-    $load = array();
     foreach ($keys as $key) {
-      // Check if we have a value in the cache.
-      if (isset($this->cache[$key])) {
-        $values[$key] = $this->cache[$key];
-      }
-      // Load the value if we don't have an explicit NULL value.
-      elseif (!array_key_exists($key, $this->cache)) {
-        $load[] = $key;
-      }
+      $values[$key] = $this->get($key);
     }
-
-    if ($load) {
-      $loaded_values = $this->keyValueStore->getMultiple($load);
-      foreach ($load as $key) {
-        // If we find a value, even one that is NULL, add it to the cache and
-        // return it.
-        if (isset($loaded_values[$key]) || array_key_exists($key, $loaded_values)) {
-          $values[$key] = $loaded_values[$key];
-          $this->cache[$key] = $loaded_values[$key];
-        }
-        else {
-          $this->cache[$key] = NULL;
-        }
-      }
-    }
-
     return $values;
   }
 
@@ -85,7 +72,7 @@ public function getMultiple(array $keys) {
    * {@inheritdoc}
    */
   public function set($key, $value) {
-    $this->cache[$key] = $value;
+    parent::set($key, $value);
     $this->keyValueStore->set($key, $value);
   }
 
@@ -94,7 +81,7 @@ public function set($key, $value) {
    */
   public function setMultiple(array $data) {
     foreach ($data as $key => $value) {
-      $this->cache[$key] = $value;
+      parent::set($key, $value);
     }
     $this->keyValueStore->setMultiple($data);
   }
@@ -103,6 +90,7 @@ public function setMultiple(array $data) {
    * {@inheritdoc}
    */
   public function delete($key) {
+    parent::delete($key);
     $this->deleteMultiple(array($key));
   }
 
@@ -111,7 +99,7 @@ public function delete($key) {
    */
   public function deleteMultiple(array $keys) {
     foreach ($keys as $key) {
-      unset($this->cache[$key]);
+      parent::delete($key);
     }
     $this->keyValueStore->deleteMultiple($keys);
   }
@@ -120,7 +108,7 @@ public function deleteMultiple(array $keys) {
    * {@inheritdoc}
    */
   public function resetCache() {
-    $this->cache = array();
+    $this->clear();
   }
 
 }
