diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index e35a533..669bb21 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -111,6 +111,15 @@ public function load(array $ids = NULL) {
     // array for later comparison with the entity cache, or FALSE if no $ids
     // were passed.
     $passed_ids = !empty($ids) ? array_flip($ids) : FALSE;
+    // Try to load entities from the static cache, if the entity type supports
+    // static caching.
+    if ($this->cache && $ids) {
+      $entities += $this->cacheGet($ids);
+      // If any entities were loaded, remove them from the ids still to load.
+      if ($passed_ids) {
+        $ids = array_keys(array_diff_key($passed_ids, $entities));
+      }
+    }
 
     // Load any remaining entities. This is the case if $ids is set to NULL (so
     // we load all entities).
@@ -126,13 +135,20 @@ public function load(array $ids = NULL) {
       $entities += $queried_entities;
     }
 
+    if ($this->cache) {
+      // Add entities to the cache.
+      if (!empty($queried_entities)) {
+        $this->cacheSet($queried_entities);
+      }
+    }
+
     // Ensure that the returned array is ordered the same as the original
     // $ids array if this was passed in and remove any invalid ids.
     if ($passed_ids) {
       // Remove any invalid ids from the array.
       $passed_ids = array_intersect_key($passed_ids, $entities);
       foreach ($entities as $entity) {
-        $passed_ids[$entity->{$this->idKey}] = $entity;
+        $passed_ids[$entity->id()] = $entity;
       }
       $entities = $passed_ids;
     }
@@ -205,7 +221,7 @@ public static function getIDFromConfigName($config_name, $config_prefix) {
    * See Drupal\comment\CommentStorageController::buildQuery() or
    * Drupal\taxonomy\TermStorageController::buildQuery() for examples.
    *
-   * @param $ids
+   * @param array|null $ids
    *   An array of entity IDs, or NULL to load all entities.
    * @param $revision_id
    *   The ID of the revision to load, or FALSE if this query is asking for the
@@ -327,6 +343,9 @@ public function delete(array $entities) {
       $config->delete();
     }
 
+    // Reset the cache as soon as the changes have been applied.
+    $this->resetCache(array_keys($entities));
+
     $entity_class::postDelete($this, $entities);
     foreach ($entities as $id => $entity) {
       $this->invokeHook('delete', $entity);
@@ -381,6 +400,7 @@ public function save(EntityInterface $entity) {
     if (!$is_new) {
       $return = SAVED_UPDATED;
       $config->save();
+      $this->resetCache(array($entity->id()));
       $entity->postSave($this, TRUE);
       $this->invokeHook('update', $entity);
 
