diff --git a/core/core.services.yml b/core/core.services.yml
index 66b3d9b..2dfcd8d 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -110,7 +110,7 @@ services:
     class: Drupal\Core\Config\InstallStorage
   config.typed:
     class: Drupal\Core\Config\TypedConfigManager
-    arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery']
+    arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery', '@module_handler']
   cron:
     class: Drupal\Core\Cron
     arguments: ['@module_handler', '@lock', '@queue', '@state', '@current_user', '@session_manager']
diff --git a/core/lib/Drupal/Core/Config/TypedConfigManager.php b/core/lib/Drupal/Core/Config/TypedConfigManager.php
index 6fba132..ea2fe50 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,13 @@ 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 +70,14 @@ class TypedConfigManager extends PluginManagerBase implements TypedConfigManager
    *   The storage 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;
   }
 
   /**
@@ -185,6 +196,8 @@ public function getDefinitions() {
         $this->cache->set($this::CACHE_ID, $this->definitions);
       }
     }
+    $this->moduleHandler->alter('config_schema', $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 df1b335..ceb977a 100644
--- a/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/DefaultConfigTest.php
@@ -43,7 +43,8 @@ public function testDefaultConfig() {
     $typed_config = new TypedConfigManager(
       \Drupal::service('config.storage'),
       new TestInstallStorage(InstallStorage::CONFIG_SCHEMA_DIRECTORY),
-      \Drupal::service('cache.discovery')
+      \Drupal::service('cache.discovery'),
+      \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 256bfba..290a787 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -9,6 +9,7 @@
 use Drupal\Core\Entity\EntityInterface;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
+use Drupal\Core\Datetime\DrupalDateTime;
 
 /**
  * Implements hook_help().
@@ -32,6 +33,21 @@ function config_translation_help($route_name, Request $request) {
   }
 }
 
+
+/**
+ * Implements hook_config_schema_alter().
+ */
+function config_translation_config_schema_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']);
+  }
+}
+
+
 /**
  * Implements hook_permission().
  */
diff --git a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
index 46ef47f..07512ca 100644
--- a/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
+++ b/core/modules/config_translation/lib/Drupal/config_translation/Tests/ConfigTranslationUiTest.php
@@ -387,40 +387,73 @@ public function testDateFormatTranslation() {
       'medium' => 'Default medium date',
       'custom_medium' => 'Custom medium date',
     );
-    foreach($formats as $id => $label) {
-      $translation_base_url = 'admin/config/regional/date-time/formats/manage/' . $id . '/translate';
 
-      $this->drupalGet($translation_base_url);
+    $country_default = array(
+      'ES' => 'Spain',
+      //'' => 'None'
+    );
 
-      // 'Add' link should be present for French translation.
-      $translation_page_url = "$translation_base_url/fr/add";
-      $this->assertLinkByHref($translation_page_url);
+    foreach($formats as $id => $label) {
+      foreach($country_default as $country_id => $country) {
+        // Change country in the settings.
+        \Drupal::config('system.date')->set('country.default', $country_id)->save();
 
-      // Make sure original text is present on this page.
-      $this->drupalGet($translation_page_url);
-      $this->assertText($label);
+        $translation_base_url = 'admin/config/regional/date-time/formats/manage/' . $id . '/translate';
 
-      // Update translatable fields.
-      $edit = array(
-        'config_names[system.date_format.' . $id . '][label][translation]' => $id . ' - FR',
-        'config_names[system.date_format.' . $id . '][pattern][pattern.php][translation]' => 'D',
-      );
+        $this->drupalGet($translation_base_url);
 
-      // Save language specific version of form.
-      $this->drupalPostForm($translation_page_url, $edit, t('Save translation'));
+        // 'Add' link should be present for French translation.
+        $translation_page_url = "$translation_base_url/fr/add";
+        $this->assertLinkByHref($translation_page_url);
 
-      // Get translation and check we've got the right value.
-      $override = \Drupal::languageManager()->getLanguageConfigOverride('fr', 'system.date_format.' . $id);
-      $expected = array(
-        'label' => $id . ' - FR',
-        'pattern' => array('php' => 'D'),
-      );
-      $this->assertEqual($expected, $override->get());
+        // Make sure original text is present on this page.
+        $this->drupalGet($translation_page_url);
+        $this->assertText($label);
 
-      // Formatting the date 8 / 27 / 1985 @ 13:37 EST with pattern D should
-      // display "Tue".
-      $formatted_date = format_date(494015820, $id, NULL, NULL, 'fr');
-      $this->assertEqual($formatted_date, 'Tue', 'Got the right formatted date using the date format translation pattern.');
+        // Update translatable fields.
+        if ($country_id == 'ES') {
+          $edit = array(
+            'config_names[system.date_format.' . $id . '][label][translation]' => $id . ' - FR',
+            'config_names[system.date_format.' . $id . '][pattern][pattern.intl][translation]' => 'ccc',
+          );
+        }
+        else {
+          $edit = array(
+            'config_names[system.date_format.' . $id . '][label][translation]' => $id . ' - FR',
+            'config_names[system.date_format.' . $id . '][pattern][pattern.php][translation]' => 'D',
+          );
+        }
+        // Save language specific version of form.
+        $this->drupalPostForm($translation_page_url, $edit, t('Save translation'));
+
+        // Get translation and check we've got the right value.
+        $override = \Drupal::languageManager()->getLanguageConfigOverride('fr', 'system.date_format.' . $id);
+
+        if ($country_id == 'ES') {
+          $expected = array(
+            'label' => $id . ' - FR',
+            'pattern' => array('intl' => 'ccc'),
+          );
+        }
+        else {
+          $expected = array(
+            'label' => $id . ' - FR',
+            'pattern' => array('php' => 'D'),
+          );
+        }
+
+        $this->assertEqual($expected, $override->get());
+
+        // Formatting the date 8 / 27 / 1985 @ 13:37 EST with pattern D should
+        // display "Tue".
+        $formatted_date = format_date(494015820, $id, NULL, NULL, 'fr');
+        if ($country_id == 'ES') {
+          $this->assertEqual($formatted_date, 'mar.', 'Got the right formatted date using the date format translation pattern.');
+        }
+        else {
+          $this->assertEqual($formatted_date, 'Tue', 'Got the right formatted date using the date format translation pattern.');
+        }
+      }
     }
   }
 
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigManager.php
index 3c0dc57..4a2dadc 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 object to use for reading default configuration
    *   data.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The modujle 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/locale.services.yml b/core/modules/locale/locale.services.yml
index f7794c3..a871234 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -1,7 +1,7 @@
 services:
   locale.config.typed:
     class: Drupal\locale\LocaleConfigManager
-    arguments: ['@config.storage', '@config.storage.schema', '@config.storage.installer', '@locale.storage', '@cache.discovery', '@config.factory', '@language_manager']
+    arguments: ['@config.storage', '@config.storage.schema', '@config.storage.installer','@module_handler', '@locale.storage', '@cache.discovery', '@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 690a3ec..eb32248 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
diff --git a/core/modules/system/lib/Drupal/system/Form/DateFormatFormBase.php b/core/modules/system/lib/Drupal/system/Form/DateFormatFormBase.php
index 3dfb81e..c133b7e 100644
--- a/core/modules/system/lib/Drupal/system/Form/DateFormatFormBase.php
+++ b/core/modules/system/lib/Drupal/system/Form/DateFormatFormBase.php
@@ -190,7 +190,19 @@ public function validate(array $form, array &$form_state) {
    */
   public function submit(array $form, array &$form_state) {
     $form_state['redirect_route']['route_name'] = 'system.date_format_list';
-    $form_state['values']['pattern'][$this->patternType] = trim($form_state['values']['date_format_pattern']);
+    // Add both patterns (php and intl) because we need both into the system.date_format.*.yml
+    $patterns = array(
+      'php',
+      'intl'
+    );
+    foreach($patterns as $pattern) {
+      if ($pattern == $this->patternType) {
+        $form_state['values']['pattern'][$this->patternType] = trim($form_state['values']['date_format_pattern']);
+      }
+      else {
+        $form_state['values']['pattern'][$pattern] = '';
+      }
+    }
 
     parent::submit($form, $form_state);
     $this->entity->save();
