diff --git a/core/core.services.yml b/core/core.services.yml
index ba3be7f..696f12c 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -24,6 +24,13 @@ services:
     factory_method: get
     factory_service: cache_factory
     arguments: [config]
+  cache.config_schema:
+    class: Drupal\Core\Cache\CacheBackendInterface
+    tags:
+      - { name: cache.bin }
+    factory_method: get
+    factory_service: cache_factory
+    arguments: [config_schema]
   cache.cache:
     class: Drupal\Core\Cache\CacheBackendInterface
     tags:
@@ -102,6 +109,9 @@ services:
     class: Drupal\Core\Config\DatabaseStorage
     arguments: ['@database', config_snapshot]
   config.storage.schema:
+    class: Drupal\Core\Config\CachedStorage
+    arguments: ['@config.storage.schema.disk', '@cache.config_schema']
+  config.storage.schema.disk:
     class: Drupal\Core\Config\Schema\SchemaStorage
   config.storage.installer:
     class: Drupal\Core\Config\InstallStorage
diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index f04bbe0..c9fd938 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -95,6 +95,8 @@ class Config {
    */
   protected $typedConfigManager;
 
+  protected $schemaCache = array();
+
   /**
    * Constructs a configuration object.
    *
@@ -534,13 +536,21 @@ protected function getSchemaForKey($key) {
       $schema = $schema_wrapper->get($key);
     }
     else {
+      $cache_key = '';
       $schema = clone $schema_wrapper;
       foreach ($parts as $nested_key) {
-        if (!is_object($schema) || !method_exists($schema, 'get')) {
-          throw new ConfigException(String::format("Incomplete schema for !key key in configuration object !name.", array('!name' => $this->name, '!key' => $key)));
+        $cache_key = $cache_key . '.' . $nested_key;
+        if (isset($this->schemaCache[$cache_key])) {
+          $schema = $this->schemaCache[$cache_key];
         }
         else {
-          $schema = $schema->get($nested_key);
+          if (!is_object($schema) || !method_exists($schema, 'get')) {
+            throw new ConfigException(String::format("Incomplete schema for !key key in configuration object !name.", array('!name' => $this->name, '!key' => $key)));
+          }
+          else {
+            $schema = $schema->get($nested_key);
+            $this->schemaCache[$cache_key] = $schema;
+          }
         }
       }
     }
diff --git a/core/lib/Drupal/Core/Config/Schema/Sequence.php b/core/lib/Drupal/Core/Config/Schema/Sequence.php
index 44dbe1d..e37928d 100644
--- a/core/lib/Drupal/Core/Config/Schema/Sequence.php
+++ b/core/lib/Drupal/Core/Config/Schema/Sequence.php
@@ -18,7 +18,7 @@ class Sequence extends ArrayElement implements ListInterface {
    * Overrides ArrayElement::parse()
    */
   protected function parse() {
-    $definition = $definition = $this->getItemDefinition();
+    $definition = $this->getItemDefinition();
     $elements = array();
     foreach ($this->value as $key => $value) {
       $elements[$key] = $this->parseElement($key, $value, $definition);
