diff --git a/core/core.services.yml b/core/core.services.yml
index 872e2ff..4cd93c2 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -113,7 +113,7 @@ services:
     class: Drupal\Core\Config\InstallStorage
   config.typed:
     class: Drupal\Core\Config\TypedConfigManager
-    arguments: ['@config.storage', '@config.storage.schema', '@cache.config']
+    arguments: ['@config.storage', '@config.storage.schema', '@cache.config', '@module_handler']
   cron:
     class: Drupal\Core\Cron
     arguments: ['@module_handler', '@lock', '@queue', '@state']
diff --git a/core/lib/Drupal/Core/Config/TypedConfigManager.php b/core/lib/Drupal/Core/Config/TypedConfigManager.php
index 011be4d..c77157c 100644
--- a/core/lib/Drupal/Core/Config/TypedConfigManager.php
+++ b/core/lib/Drupal/Core/Config/TypedConfigManager.php
@@ -12,6 +12,7 @@
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Component\Utility\String;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
 
 /**
  * Manages config type plugins.
@@ -53,6 +54,14 @@ class TypedConfigManager extends PluginManagerBase implements TypedConfigManager
    */
   protected $cache;
 
+ /**
+  * The module handler to invoke the alter hook.
+  *
+  * @var \Drupal\Core\Language\LanguageManagerInterface
+  */
+
+  protected $moduleHandler;
+
   /**
    * Creates a new typed configuration manager.
    *
@@ -62,11 +71,14 @@ class TypedConfigManager extends PluginManagerBase implements TypedConfigManager
    *   The storage controller object to use for reading schema data
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache
    *   The cache backend to use for caching the definitions.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
    */
-  public function __construct(StorageInterface $configStorage, StorageInterface $schemaStorage, CacheBackendInterface $cache) {
+  public function __construct(StorageInterface $configStorage, StorageInterface $schemaStorage, CacheBackendInterface $cache, ModuleHandlerInterface $module_handler) {
     $this->configStorage = $configStorage;
     $this->schemaStorage = $schemaStorage;
     $this->cache = $cache;
+    $this->moduleHandler = $module_handler;
   }
 
   /**
@@ -191,6 +203,10 @@ public function getDefinitions() {
         $this->cache->set($this::CACHE_ID, $this->definitions);
       }
     }
+    // We only need one date format (PHP or INTL).
+    if (array_key_exists('system.date_format.*', $this->definitions)) {
+      $this->moduleHandler->alter('date_format_pattern', $this->definitions);
+    }
     return $this->definitions;
   }
 
diff --git a/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php b/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php
index b7424f3..44be486 100644
--- a/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php
@@ -71,7 +71,8 @@ public function testDefaultConfig() {
     $typed_config = new TypedConfigManager(
       \Drupal::service('config.storage'),
       new TestSchemaStorage(),
-      \Drupal::service('cache.config')
+      \Drupal::service('cache.config'),
+      \Drupal::moduleHandler()
     );
 
     // Create a configuration storage with access to default configuration in
diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index e6f8081..f4161b9 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -8,6 +8,7 @@
 use Drupal\config_translation\Plugin\Derivative\ConfigTranslationLocalTasks;
 use Drupal\Core\Entity\EntityInterface;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Drupal\Core\Datetime\DrupalDateTime;
 
 /**
  * Implements hook_help().
@@ -181,3 +182,17 @@ function config_translation_config_translation_type_info_alter(&$definitions) {
   $definitions['date_format']['form_element_class'] = '\Drupal\config_translation\FormElement\DateFormat';
 }
 
+/**
+ * Implements hook_date_format_pattern_alter().
+ */
+function config_translation_date_format_pattern_alter(&$definitions) {
+  $date = new DrupalDateTime();
+  if ($date->canUseIntl()) {
+    unset($definitions['system.date_format.*']['mapping']['pattern']['mapping']['php']);
+  }
+  else {
+    unset($definitions['system.date_format.*']['mapping']['pattern']['mapping']['intl']);
+  }
+}
+
+
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
index ae41db1..e71e9e4 100644
--- a/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
+++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
@@ -14,6 +14,7 @@
 use Drupal\Core\Config\ConfigFactoryInterface;
 use Drupal\language\Config\LanguageConfigFactoryOverrideInterface;
 use Drupal\language\ConfigurableLanguageManagerInterface;
+use Drupal\Core\Extension\ModuleHandlerInterface;
 
 /**
  * Manages localized configuration type plugins.
@@ -63,6 +64,8 @@ class LocaleConfigManager extends TypedConfigManager {
    * @param \Drupal\Core\Config\StorageInterface $installStorage
    *   The storage controller object to use for reading default configuration
    *   data.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
    * @param \Drupal\locale\StringStorageInterface $localeStorage
    *   The locale storage to use for reading string translations.
    * @param \Drupal\Core\Cache\CacheBackendInterface $cache
@@ -72,9 +75,9 @@ class LocaleConfigManager extends TypedConfigManager {
    * @param \Drupal\language\ConfigurableLanguageManagerInterface
    *   The language manager.
    */
-  public function __construct(StorageInterface $configStorage, StorageInterface $schemaStorage, StorageInterface $installStorage, StringStorageInterface $localeStorage, CacheBackendInterface $cache, ConfigFactoryInterface $config_factory, ConfigurableLanguageManagerInterface $language_manager) {
+  public function __construct(StorageInterface $configStorage, StorageInterface $schemaStorage, StorageInterface $installStorage, ModuleHandlerInterface $module_handler = NULL, StringStorageInterface $localeStorage, CacheBackendInterface $cache, ConfigFactoryInterface $config_factory, ConfigurableLanguageManagerInterface $language_manager) {
     // Note we use the install storage for the parent constructor.
-    parent::__construct($configStorage, $schemaStorage, $cache);
+    parent::__construct($configStorage, $schemaStorage, $cache, $module_handler);
     $this->installStorage = $installStorage;
     $this->localeStorage = $localeStorage;
     $this->configFactory = $config_factory;
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigManagerTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigManagerTest.php
index 453743c..15a8b72 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigManagerTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigManagerTest.php
@@ -44,6 +44,7 @@ public function testHasTranslation() {
       $this->container->get('config.storage'),
       $this->container->get('config.storage.schema'),
       $this->container->get('config.storage.installer'),
+      $this->container->get('module_handler'),
       $this->container->get('locale.storage'),
       $this->container->get('cache.config'),
       $this->container->get('config.factory'),
diff --git a/core/modules/locale/locale.services.yml b/core/modules/locale/locale.services.yml
index da26a28..b9f36ba 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -6,7 +6,7 @@ services:
     arguments: ['@entity.manager', '@config.factory', '@router.admin_context']
   locale.config.typed:
     class: Drupal\locale\LocaleConfigManager
-    arguments: ['@config.storage', '@config.storage.schema', '@config.storage.installer', '@locale.storage', '@cache.config', '@config.factory', '@language_manager']
+    arguments: ['@config.storage', '@config.storage.schema', '@config.storage.installer', '@module_handler', '@locale.storage', '@cache.config', '@config.factory', '@language_manager']
   locale.storage:
     class: Drupal\locale\StringDatabaseStorage
     arguments: ['@database']
diff --git a/core/modules/system/config/schema/system.schema.yml b/core/modules/system/config/schema/system.schema.yml
index 157805c..c457eb2 100644
--- a/core/modules/system/config/schema/system.schema.yml
+++ b/core/modules/system/config/schema/system.schema.yml
@@ -141,7 +141,7 @@ system.date_format.*:
           type: date_format
           label: 'PHP date format'
         intl:
-          type: string
+          type: date_format
           label: 'Intl date format'
     langcode:
       type: string
