diff --git a/core/core.services.yml b/core/core.services.yml
index 589447d..22479f2 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -252,8 +252,6 @@ services:
   config.storage.schema:
     class: Drupal\Core\Config\ExtensionInstallStorage
     arguments: ['@config.storage', 'config/schema']
-  config.storage.installer:
-    class: Drupal\Core\Config\InstallStorage
   config.typed:
     class: Drupal\Core\Config\TypedConfigManager
     arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery', '@module_handler']
diff --git a/core/modules/config/src/Tests/ConfigInstallTest.php b/core/modules/config/src/Tests/ConfigInstallTest.php
index 9a903a1..c32922a 100644
--- a/core/modules/config/src/Tests/ConfigInstallTest.php
+++ b/core/modules/config/src/Tests/ConfigInstallTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config\Tests;
 
+use Drupal\Core\Config\InstallStorage;
 use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Config\UnmetDependenciesException;
@@ -223,7 +224,8 @@ public function testDependencyChecking() {
   function testLanguage() {
     $this->installModules(['config_test_language']);
     // Test imported configuration with implicit language code.
-    $data = $this->container->get('config.storage.installer')->read('config_test.dynamic.dotted.english');
+    $storage = new InstallStorage();
+    $data = $storage->read('config_test.dynamic.dotted.english');
     $this->assertTrue(!isset($data['langcode']));
     $this->assertEqual(
       $this->config('config_test.dynamic.dotted.english')->get('langcode'),
@@ -231,7 +233,7 @@ function testLanguage() {
     );
 
     // Test imported configuration with explicit language code.
-    $data = $this->container->get('config.storage.installer')->read('config_test.dynamic.dotted.french');
+    $data = $storage->read('config_test.dynamic.dotted.french');
     $this->assertEqual($data['langcode'], 'fr');
     $this->assertEqual(
       $this->config('config_test.dynamic.dotted.french')->get('langcode'),
diff --git a/core/modules/locale/locale.services.yml b/core/modules/locale/locale.services.yml
index 284878b..f768afc 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -1,7 +1,7 @@
 services:
   locale.config_manager:
     class: Drupal\locale\LocaleConfigManager
-    arguments: ['@config.storage', '@config.storage.installer', '@locale.storage', '@config.factory', '@config.typed', '@language_manager']
+    arguments: ['@config.storage', '@locale.storage', '@config.factory', '@config.typed', '@language_manager']
   locale.storage:
     class: Drupal\locale\StringDatabaseStorage
     arguments: ['@database']
diff --git a/core/modules/locale/src/LocaleConfigManager.php b/core/modules/locale/src/LocaleConfigManager.php
index 17d1e8f..b98e61b 100644
--- a/core/modules/locale/src/LocaleConfigManager.php
+++ b/core/modules/locale/src/LocaleConfigManager.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Config\InstallStorage;
 use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\Config\TypedConfigManagerInterface;
 use Drupal\Core\StringTranslation\TranslationWrapper;
@@ -45,11 +46,18 @@ class LocaleConfigManager {
   protected $configStorage;
 
   /**
-   * The storage instance for reading default configuration data.
+   * The storage instance for reading required default configuration data.
    *
    * @var \Drupal\Core\Config\StorageInterface
    */
-  protected $installStorage;
+  protected $requiredInstallStorage;
+
+  /**
+   * The storage instance for reading optional default configuration data.
+   *
+   * @var \Drupal\Core\Config\StorageInterface
+   */
+  protected $optionalInstallStorage;
 
   /**
    * The string storage for reading and writing translations.
@@ -100,9 +108,6 @@ class LocaleConfigManager {
    *
    * @param \Drupal\Core\Config\StorageInterface $config_storage
    *   The storage object to use for reading configuration data.
-   * @param \Drupal\Core\Config\StorageInterface $install_storage
-   *   The storage object to use for reading default configuration
-   *   data.
    * @param \Drupal\locale\StringStorageInterface $locale_storage
    *   The locale storage to use for reading string translations.
    * @param \Drupal\Core\Config\ConfigFactoryInterface $config_factory
@@ -112,13 +117,15 @@ class LocaleConfigManager {
    * @param \Drupal\language\ConfigurableLanguageManagerInterface $language_manager
    *   The language manager.
    */
-  public function __construct(StorageInterface $config_storage, StorageInterface $install_storage, StringStorageInterface $locale_storage, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, ConfigurableLanguageManagerInterface $language_manager) {
+  public function __construct(StorageInterface $config_storage, StringStorageInterface $locale_storage, ConfigFactoryInterface $config_factory, TypedConfigManagerInterface $typed_config, ConfigurableLanguageManagerInterface $language_manager) {
     $this->configStorage = $config_storage;
-    $this->installStorage = $install_storage;
     $this->localeStorage = $locale_storage;
     $this->configFactory = $config_factory;
     $this->typedConfigManager = $typed_config;
     $this->languageManager = $language_manager;
+
+    $this->requiredInstallStorage = new InstallStorage();
+    $this->optionalInstallStorage = new InstallStorage(InstallStorage::CONFIG_OPTIONAL_DIRECTORY);
   }
 
   /**
@@ -643,8 +650,11 @@ protected function filterOverride(array $override_data, array $translatable) {
    *   Configuration data from install storage or default language.
    */
   protected function installStorageRead($name) {
-    if ($this->installStorage->exists($name)) {
-      return $this->installStorage->read($name);
+    if ($this->requiredInstallStorage->exists($name)) {
+      return $this->requiredInstallStorage->read($name);
+    }
+    elseif ($this->optionalInstallStorage->exists($name)) {
+      return $this->optionalInstallStorage->read($name);
     }
     elseif (strpos($name, 'language.entity.') === 0) {
       // Simulate default languages as if they were shipped as default
@@ -667,7 +677,13 @@ protected function installStorageRead($name) {
    */
   protected function installStorageAll() {
     $languages = $this->predefinedConfiguredLanguages();
-    return array_unique(array_merge($this->installStorage->listAll(), $languages));
+    return array_unique(
+      array_merge(
+        $this->requiredInstallStorage->listAll(),
+        $this->optionalInstallStorage->listAll(),
+        $languages
+      )
+    );
   }
 
   /**
@@ -684,7 +700,12 @@ protected function installStorageAll() {
    *   predefined names as well.
    */
   protected function installStorageComponents($type, array $list) {
-    $names = array_keys($this->installStorage->getComponentNames($type, $list));
+    $names = array_unique(
+      array_merge(
+        array_keys($this->requiredInstallStorage->getComponentNames($type, $list)),
+        array_keys($this->optionalInstallStorage->getComponentNames($type, $list))
+      )
+    );
     if ($type == 'module' && in_array('language', $list)) {
       $languages = $this->predefinedConfiguredLanguages();
       $names = array_unique(array_merge($names, $languages));
