diff --git a/core/lib/Drupal/Core/Cache/ApcuBackend.php b/core/lib/Drupal/Core/Cache/ApcuBackend.php
index e04e014152..18778fd7ae 100644
--- a/core/lib/Drupal/Core/Cache/ApcuBackend.php
+++ b/core/lib/Drupal/Core/Cache/ApcuBackend.php
@@ -7,7 +7,9 @@
 /**
  * Stores cache items in the Alternative PHP Cache User Cache (APCu).
  */
-class ApcuBackend implements CacheBackendInterface {
+class ApcuBackend implements CacheBackendInterface, CacheRememberInterface {
+
+  use CacheRememberTrait;
 
   /**
    * The name of the cache bin to use.
diff --git a/core/lib/Drupal/Core/Cache/CacheRememberInterface.php b/core/lib/Drupal/Core/Cache/CacheRememberInterface.php
new file mode 100644
index 0000000000..13aec7d753
--- /dev/null
+++ b/core/lib/Drupal/Core/Cache/CacheRememberInterface.php
@@ -0,0 +1,61 @@
+<?php
+
+namespace Drupal\Core\Cache;
+
+/**
+ * Defines required methods for classes wanting to handle cache tag changes.
+ *
+ * Services that implement this interface must add the cache_tags_invalidator
+ * tag to be notified. Cache backends may implement this interface as well, they
+ * will be notified automatically.
+ *
+ * @ingroup cache
+ */
+interface CacheRememberInterface {
+
+  /**
+   * Remembers data in a persistent cache.
+   *
+   * Shortcut for retrieving and storing data to a cache.
+   *
+   * @param string $cid
+   *   The cache ID of the data to store.
+   * @param int $expire
+   *   One of the following values:
+   *   - CacheBackendInterface::CACHE_PERMANENT: Indicates that the item should
+   *     not be removed unless it is deleted explicitly.
+   *   - A Unix timestamp: Indicates that the item will be considered invalid
+   *     after this time, i.e. it will not be returned by get() unless
+   *     $allow_invalid has been set to TRUE. When the item has expired, it may
+   *     be permanently deleted by the garbage collector at any time.
+   * @param \Closure $callback
+   *   A callback that will be used to populate the cache in the case of a miss.
+   * @param array $tags
+   *   An array of tags to be stored with the cache item. These should normally
+   *   identify objects used to build the cache item, which should trigger
+   *   cache invalidation when updated. For example if a cached item represents
+   *   a node, both the node ID and the author's user ID might be passed in as
+   *   tags. For example ['node:123', 'node:456', 'user:789'].
+   */
+  public function remember($cid, $expire, \Closure $callback, array $tags = []);
+
+  /**
+   * Remembers data in a persistent cache.
+   *
+   * Shortcut for retrieving and storing data to a cache.
+   *
+   * @param string $cid
+   *   The cache ID of the data to store.
+   * @param \Closure $callback
+   *   A callback that will be used to populate the cache in the case of a miss.
+   * @param array $tags
+   *   An array of tags to be stored with the cache item. These should normally
+   *   identify objects used to build the cache item, which should trigger
+   *   cache invalidation when updated. For example if a cached item represents
+   *   a node, both the node ID and the author's user ID might be passed in as
+   *   tags. For example ['node:123', 'node:456', 'user:789'].
+   */
+
+  public function rememberPermanent($cid, \Closure $callback, array $tags = []);
+
+}
diff --git a/core/lib/Drupal/Core/Cache/CacheRememberTrait.php b/core/lib/Drupal/Core/Cache/CacheRememberTrait.php
new file mode 100644
index 0000000000..357bc91ad9
--- /dev/null
+++ b/core/lib/Drupal/Core/Cache/CacheRememberTrait.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Drupal\Core\Cache;
+
+/**
+ * Provides an implementation of CacheRememberInterface.
+ *
+ * @see \Drupal\Core\Cache\CacheRememberInterface
+ */
+trait CacheRememberTrait {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function remember($cid, $expire, \Closure $callback, array $tags = []) {
+    $cache = $this->get($cid);
+    if ($cache) {
+      return $cache->data;
+    }
+    $data = $callback();
+    $this->set($cid, $data, $expire, $tags);
+    return $data;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function rememberPermanent($cid, \Closure $callback, array $tags = []) {
+    return $this->remember($cid, Cache::PERMANENT, $callback, $tags);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Cache/DatabaseBackend.php b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
index 88f018f8cc..3ddc483bf0 100644
--- a/core/lib/Drupal/Core/Cache/DatabaseBackend.php
+++ b/core/lib/Drupal/Core/Cache/DatabaseBackend.php
@@ -15,7 +15,9 @@
  *
  * @ingroup cache
  */
-class DatabaseBackend implements CacheBackendInterface {
+class DatabaseBackend implements CacheBackendInterface, CacheRememberInterface {
+
+  use CacheRememberTrait;
 
   /**
    * The default maximum number of rows that this cache bin table can store.
diff --git a/core/lib/Drupal/Core/Cache/MemoryBackend.php b/core/lib/Drupal/Core/Cache/MemoryBackend.php
index 09454d7850..edcc305232 100644
--- a/core/lib/Drupal/Core/Cache/MemoryBackend.php
+++ b/core/lib/Drupal/Core/Cache/MemoryBackend.php
@@ -19,7 +19,9 @@
  *
  * @ingroup cache
  */
-class MemoryBackend implements CacheBackendInterface, CacheTagsInvalidatorInterface {
+class MemoryBackend implements CacheBackendInterface, CacheTagsInvalidatorInterface, CacheRememberInterface {
+
+  use CacheRememberTrait;
 
   /**
    * Array to store cache objects.
diff --git a/core/lib/Drupal/Core/Cache/NullBackend.php b/core/lib/Drupal/Core/Cache/NullBackend.php
index b0077a50e3..4c383099fc 100644
--- a/core/lib/Drupal/Core/Cache/NullBackend.php
+++ b/core/lib/Drupal/Core/Cache/NullBackend.php
@@ -15,7 +15,9 @@
  *
  * @ingroup cache
  */
-class NullBackend implements CacheBackendInterface {
+class NullBackend implements CacheBackendInterface, CacheRememberInterface {
+
+  use CacheRememberTrait;
 
   /**
    * Constructs a NullBackend object.
diff --git a/core/lib/Drupal/Core/Cache/PhpBackend.php b/core/lib/Drupal/Core/Cache/PhpBackend.php
index d3af7f5843..af513b1883 100644
--- a/core/lib/Drupal/Core/Cache/PhpBackend.php
+++ b/core/lib/Drupal/Core/Cache/PhpBackend.php
@@ -19,7 +19,9 @@
  *
  * @ingroup cache
  */
-class PhpBackend implements CacheBackendInterface {
+class PhpBackend implements CacheBackendInterface, CacheRememberInterface {
+
+  use CacheRememberTrait;
 
   /**
    * @var string
