diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c199ddf..c47db5e 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -2182,16 +2182,13 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
  */
 function drupal_get_user_timezone() {
   global $user;
-  $config = config('system.date');
-
-  if ($config->get('timezone.user.configurable') && $user->uid && $user->timezone) {
+  if (variable_get('configurable_timezones', 1) && $user->uid && $user->timezone) {
     return $user->timezone;
   }
   else {
     // Ignore PHP strict notice if time zone has not yet been set in the php.ini
     // configuration.
-    $config_data_default_timezone = $config->get('timezone.default');
-    return !empty($config_data_default_timezone) ? $config_data_default_timezone : @date_default_timezone_get();
+    return variable_get('date_default_timezone', @date_default_timezone_get());
   }
 }
 
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 0c52e67..a70b66e 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -1827,14 +1827,14 @@ function format_interval($interval, $granularity = 2, $langcode = NULL) {
  *   A UNIX timestamp to format.
  * @param $type
  *   (optional) The format to use, one of:
- *   - One of the built-in formats: 'system_short', 'system_medium',
- *     'system_long', 'html_datetime', 'html_date', 'html_time',
- *     'html_yearless_date', 'html_week', 'html_month', 'html_year'.
- *   - The name of a date type defined by a module in
- *     hook_date_format_types(), if it's been assigned a format.
+ *   - One of the built-in formats: 'short', 'medium', 'long', 'html_datetime',
+ *     'html_date', 'html_time', 'html_yearless_date', 'html_week',
+ *     'html_month', 'html_year'.
+ *   - The name of a date type defined by a module in hook_date_format_types(),
+ *     if it's been assigned a format.
  *   - The machine name of an administrator-defined date format.
  *   - 'custom', to use $format.
- *   Defaults to 'system_medium'.
+ *   Defaults to 'medium'.
  * @param $format
  *   (optional) If $type is 'custom', a PHP date format string suitable for
  *   input to date(). Use a backslash to escape ordinary text, so it does not
@@ -1850,7 +1850,7 @@ function format_interval($interval, $granularity = 2, $langcode = NULL) {
  * @return
  *   A translated date string in the requested format.
  */
-function format_date($timestamp, $type = 'system_medium', $format = '', $timezone = NULL, $langcode = NULL) {
+function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
   // Use the advanced drupal_static() pattern, since this is called very often.
   static $drupal_static_fast;
   if (!isset($drupal_static_fast)) {
@@ -1871,28 +1871,66 @@ function format_date($timestamp, $type = 'system_medium', $format = '', $timezon
     $langcode = language(LANGUAGE_TYPE_INTERFACE)->langcode;
   }
 
-  // Create a DrupalDateTime object from the timestamp and timezone.
-  $date = new DrupalDateTime($timestamp, $timezones[$timezone]);
+  switch ($type) {
+    case 'short':
+      $format = variable_get('date_format_short', 'm/d/Y - H:i');
+      break;
 
-  // Find the appropriate format type.
-  $key = $date->canUseIntl() ? DrupalDateTime::INTL : DrupalDateTime::PHP;
+    case 'long':
+      $format = variable_get('date_format_long', 'l, F j, Y - H:i');
+      break;
 
-  // If we have a non-custom date format use the provided date format pattern.
-  if ($type != 'custom') {
-    $format = config('system.date')->get('formats.' . $type . '.pattern.' . $key);
-  }
+    case 'html_datetime':
+      $format = variable_get('date_format_html_datetime', 'Y-m-d\TH:i:sO');
+      break;
+
+    case 'html_date':
+      $format = variable_get('date_format_html_date', 'Y-m-d');
+      break;
+
+    case 'html_time':
+      $format = variable_get('date_format_html_time', 'H:i:s');
+      break;
+
+    case 'html_yearless_date':
+      $format = variable_get('date_format_html_yearless_date', 'm-d');
+      break;
+
+    case 'html_week':
+      $format = variable_get('date_format_html_week', 'Y-\WW');
+      break;
 
-  // Fall back to system_medium if a format was not found.
-  if (empty($format)) {
-    $format = config('system.date')->get('formats.system_medium.pattern.' . $key);
+    case 'html_month':
+      $format = variable_get('date_format_html_month', 'Y-m');
+      break;
+
+    case 'html_year':
+      $format = variable_get('date_format_html_year', 'Y');
+      break;
+
+    case 'custom':
+      // No change to format.
+      break;
+
+    case 'medium':
+    default:
+      // Retrieve the format of the custom $type passed.
+      if ($type != 'medium') {
+        $format = variable_get('date_format_' . $type, '');
+      }
+      // Fall back to 'medium'.
+      if ($format === '') {
+        $format = variable_get('date_format_medium', 'D, m/d/Y - H:i');
+      }
+      break;
   }
 
-  // Call $date->format().
-  $settings = array(
-    'langcode' => $langcode,
-    'format_string_type' => $key,
-  );
-  return $date->format($format, $settings);
+  // Create a DrupalDateTime object from the timestamp and timezone.
+  $date_time = new DrupalDateTime($timestamp, $timezones[$timezone]);
+
+  // Call date_format().
+  $settings = array('langcode' => $langcode);
+  return $date_time->format($format, $settings);
 }
 
 /**
diff --git a/core/includes/date.inc b/core/includes/date.inc
new file mode 100644
index 0000000..01ab131
--- /dev/null
+++ b/core/includes/date.inc
@@ -0,0 +1,196 @@
+<?php
+
+/**
+ * @file
+ * Initializes the list of date formats and their locales.
+ */
+
+/**
+ * Provides a default system list of date formats for system_date_formats().
+ */
+function system_default_date_formats() {
+  $formats = array();
+
+  // Short date formats.
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y-m-d H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'm/d/Y - H:i',
+    'locales' => array('en-us'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd/m/Y - H:i',
+    'locales' => array('en-gb', 'en-hk', 'en-ie', 'el-gr', 'es-es', 'fr-be', 'fr-fr', 'fr-lu', 'it-it', 'nl-be', 'pt-pt'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y/m/d - H:i',
+    'locales' => array('en-ca', 'fr-ca', 'no-no', 'sv-se'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd.m.Y - H:i',
+    'locales' => array('de-ch', 'de-de', 'de-lu', 'fi-fi', 'fr-ch', 'is-is', 'pl-pl', 'ro-ro', 'ru-ru'),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'm/d/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'd/m/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y/m/d - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'M j Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'j M Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y M j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'M j Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'j M Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'short',
+    'format' => 'Y M j - g:ia',
+    'locales' => array(),
+  );
+
+  // Medium date formats.
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y-m-d H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, m/d/Y - H:i',
+    'locales' => array('en-us'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, d/m/Y - H:i',
+    'locales' => array('en-gb', 'en-hk', 'en-ie', 'el-gr', 'es-es', 'fr-be', 'fr-fr', 'fr-lu', 'it-it', 'nl-be', 'pt-pt'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y/m/d - H:i',
+    'locales' => array('en-ca', 'fr-ca', 'no-no', 'sv-se'),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'F j, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j F, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'Y, F j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, m/d/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, d/m/Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'D, Y/m/d - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'F j, Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j F Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'Y, F j - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'medium',
+    'format' => 'j. F Y - G:i',
+    'locales' => array(),
+  );
+
+  // Long date formats.
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, F j, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j F, Y - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, Y,  F j - H:i',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, F j, Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j F Y - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, Y,  F j - g:ia',
+    'locales' => array(),
+  );
+  $formats[] = array(
+    'type' => 'long',
+    'format' => 'l, j. F Y - G:i',
+    'locales' => array(),
+  );
+
+  return $formats;
+}
diff --git a/core/includes/form.inc b/core/includes/form.inc
index c63e382..002de6f 100644
--- a/core/includes/form.inc
+++ b/core/includes/form.inc
@@ -2996,8 +2996,7 @@ function form_process_date($element) {
   $element['#tree'] = TRUE;
 
   // Determine the order of day, month, year in the site's chosen date format.
-  $format = config('system.date')->get('formats.system_short.pattern');
-  $format = $format['php'];
+  $format = variable_get('date_format_short', 'm/d/Y - H:i');
   $sort = array();
   $sort['day'] = max(strpos($format, 'd'), strpos($format, 'j'));
   $sort['month'] = max(strpos($format, 'm'), strpos($format, 'M'));
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 5366436..efeca48 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -1938,7 +1938,7 @@ function _install_configure_form($form, &$form_state, &$install_state) {
     '#type' => 'select',
     '#title' => st('Default country'),
     '#empty_value' => '',
-    '#default_value' => config('system.date')->get('country.default'),
+    '#default_value' => variable_get('site_default_country', NULL),
     '#options' => $countries,
     '#description' => st('Select the default country for the site.'),
     '#weight' => 0,
@@ -2011,10 +2011,8 @@ function install_configure_form_submit($form, &$form_state) {
     ->set('mail', $form_state['values']['site_mail'])
     ->save();
 
-  config('system.date')
-    ->set('timezone.default', $form_state['values']['date_default_timezone'])
-    ->set('country.default', $form_state['values']['site_default_country'])
-    ->save();
+  variable_set('date_default_timezone', $form_state['values']['date_default_timezone']);
+  variable_set('site_default_country', $form_state['values']['site_default_country']);
 
   // Enable update.module if this option was selected.
   if ($form_state['values']['update_status_module'][1]) {
diff --git a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
index 6d60656..775e668 100644
--- a/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
+++ b/core/lib/Drupal/Core/Datetime/DrupalDateTime.php
@@ -60,7 +60,7 @@ public function __construct($time = 'now', $timezone = NULL, $format = NULL, $se
 
     // We can set the langcode and country using Drupal values.
     $settings['langcode'] = !empty($settings['langcode']) ? $settings['langcode'] : language(LANGUAGE_TYPE_INTERFACE)->langcode;
-    $settings['country'] = !empty($settings['country']) ? $settings['country'] : config('system.date')->get('country.default');
+    $settings['country'] = !empty($settings['country']) ? $settings['country'] : variable_get('site_default_country');
 
     // Instantiate the parent class.
     parent::__construct($time, $timezone, $format, $settings);
diff --git a/core/modules/aggregator/aggregator.pages.inc b/core/modules/aggregator/aggregator.pages.inc
index c8d7a70..78ca5bc 100644
--- a/core/modules/aggregator/aggregator.pages.inc
+++ b/core/modules/aggregator/aggregator.pages.inc
@@ -335,7 +335,7 @@ function template_preprocess_aggregator_item(&$variables) {
     $variables['source_date'] = t('%ago ago', array('%ago' => format_interval(REQUEST_TIME - $item->timestamp)));
   }
   else {
-    $variables['source_date'] = format_date($item->timestamp, 'system_medium');
+    $variables['source_date'] = format_date($item->timestamp, 'custom', variable_get('date_format_medium', 'D, m/d/Y - H:i'));
   }
 
   $variables['categories'] = array();
diff --git a/core/modules/comment/comment.admin.inc b/core/modules/comment/comment.admin.inc
index db73365..e0a0165 100644
--- a/core/modules/comment/comment.admin.inc
+++ b/core/modules/comment/comment.admin.inc
@@ -128,7 +128,7 @@ function comment_admin_overview($form, &$form_state, $arg) {
           '#href' => 'node/' . $comment->nid,
         ),
       ),
-      'changed' => format_date($comment->changed, 'system_short'),
+      'changed' => format_date($comment->changed, 'short'),
     );
     $links = array();
     $links['edit'] = array(
diff --git a/core/modules/comment/comment.tokens.inc b/core/modules/comment/comment.tokens.inc
index b15d79e..c77cb67 100644
--- a/core/modules/comment/comment.tokens.inc
+++ b/core/modules/comment/comment.tokens.inc
@@ -186,11 +186,11 @@ function comment_tokens($type, $tokens, array $data = array(), array $options =
           break;
 
         case 'created':
-          $replacements[$original] = format_date($comment->created, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($comment->created, 'medium', '', NULL, $langcode);
           break;
 
         case 'changed':
-          $replacements[$original] = format_date($comment->changed, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($comment->changed, 'medium', '', NULL, $langcode);
           break;
 
         case 'node':
diff --git a/core/modules/dblog/dblog.admin.inc b/core/modules/dblog/dblog.admin.inc
index dfa7190..d6b921a 100644
--- a/core/modules/dblog/dblog.admin.inc
+++ b/core/modules/dblog/dblog.admin.inc
@@ -63,7 +63,7 @@ function dblog_overview() {
         // Cells
         array('class' => array('icon')),
         t($dblog->type),
-        format_date($dblog->timestamp, 'system_short'),
+        format_date($dblog->timestamp, 'short'),
         theme('dblog_message', array('event' => $dblog, 'link' => TRUE)),
         theme('username', array('account' => $dblog)),
         filter_xss($dblog->link),
@@ -162,7 +162,7 @@ function dblog_event($id) {
       ),
       array(
         array('data' => t('Date'), 'header' => TRUE),
-        format_date($dblog->timestamp, 'system_long'),
+        format_date($dblog->timestamp, 'long'),
       ),
       array(
         array('data' => t('User'), 'header' => TRUE),
diff --git a/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php b/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
index 187c41e..4d56b7b 100644
--- a/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/FileTokenReplaceTest.php
@@ -56,8 +56,8 @@ function testFileTokenReplacement() {
     $tests['[file:mime]'] = check_plain($file->filemime);
     $tests['[file:size]'] = format_size($file->filesize);
     $tests['[file:url]'] = check_plain(file_create_url($file->uri));
-    $tests['[file:timestamp]'] = format_date($file->timestamp, 'system_medium', '', NULL, $language_interface->langcode);
-    $tests['[file:timestamp:short]'] = format_date($file->timestamp, 'system_short', '', NULL, $language_interface->langcode);
+    $tests['[file:timestamp]'] = format_date($file->timestamp, 'medium', '', NULL, $language_interface->langcode);
+    $tests['[file:timestamp:short]'] = format_date($file->timestamp, 'short', '', NULL, $language_interface->langcode);
     $tests['[file:owner]'] = check_plain(user_format_name($this->admin_user));
     $tests['[file:owner:uid]'] = $file->uid;
 
diff --git a/core/modules/locale/locale.module b/core/modules/locale/locale.module
index 7ed44b6..85ed5d1 100644
--- a/core/modules/locale/locale.module
+++ b/core/modules/locale/locale.module
@@ -573,7 +573,7 @@ function locale_library_info_alter(&$libraries, $module) {
           'ui' => array(
             'datepicker' => array(
               'isRTL' => $language_interface->direction == LANGUAGE_RTL,
-              'firstDay' => config('system.date')->get('first_day'),
+              'firstDay' => variable_get('date_first_day', 0),
             ),
           ),
         ),
diff --git a/core/modules/node/node.admin.inc b/core/modules/node/node.admin.inc
index 79705be..8a49c9c 100644
--- a/core/modules/node/node.admin.inc
+++ b/core/modules/node/node.admin.inc
@@ -539,7 +539,7 @@ function node_admin_nodes() {
       'type' => check_plain(node_get_type_label($node)),
       'author' => theme('username', array('account' => $node)),
       'status' => $node->status ? t('published') : t('not published'),
-      'changed' => format_date($node->changed, 'system_short'),
+      'changed' => format_date($node->changed, 'short'),
     );
     if ($multilingual) {
       $options[$node->nid]['language_name'] = language_name($node->langcode);
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index e169d7f..71c72b8 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -266,13 +266,13 @@ function node_revision_overview($node) {
   foreach ($revisions as $revision) {
     $row = array();
     if ($revision->current_vid > 0) {
-      $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'system_short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
+      $row[] = array('data' => t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid"), '!username' => theme('username', array('account' => $revision))))
                                . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : ''),
                      'class' => array('revision-current'));
       $row[] = array('data' => drupal_placeholder(t('current revision')), 'class' => array('revision-current'));
     }
     else {
-      $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'system_short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision))))
+      $row[] = t('!date by !username', array('!date' => l(format_date($revision->timestamp, 'short'), "node/$node->nid/revisions/$revision->vid/view"), '!username' => theme('username', array('account' => $revision))))
                . (($revision->log != '') ? '<p class="revision-log">' . filter_xss($revision->log) . '</p>' : '');
       if ($revert_permission) {
         $links['revert'] = array(
diff --git a/core/modules/node/node.tokens.inc b/core/modules/node/node.tokens.inc
index 2388135..2d783c9 100644
--- a/core/modules/node/node.tokens.inc
+++ b/core/modules/node/node.tokens.inc
@@ -176,11 +176,11 @@ function node_tokens($type, $tokens, array $data = array(), array $options = arr
           break;
 
         case 'created':
-          $replacements[$original] = format_date($node->created, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($node->created, 'medium', '', NULL, $langcode);
           break;
 
         case 'changed':
-          $replacements[$original] = format_date($node->changed, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($node->changed, 'medium', '', NULL, $langcode);
           break;
       }
     }
diff --git a/core/modules/openid/lib/Drupal/openid/Tests/OpenIDRegistrationTest.php b/core/modules/openid/lib/Drupal/openid/Tests/OpenIDRegistrationTest.php
index 9822ff9..debb9cd 100644
--- a/core/modules/openid/lib/Drupal/openid/Tests/OpenIDRegistrationTest.php
+++ b/core/modules/openid/lib/Drupal/openid/Tests/OpenIDRegistrationTest.php
@@ -41,11 +41,8 @@ function setUp() {
    */
   function testRegisterUserWithEmailVerification() {
     config('user.settings')->set('verify_mail', TRUE)->save();
-
-    config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('timezone.default', 'Europe/Brussels')
-      ->save();
+    variable_get('configurable_timezones', 1);
+    variable_set('date_default_timezone', 'Europe/Brussels');
 
     // Tell openid_test.module to respond with these SREG fields.
     variable_set('openid_test_response', array(
@@ -101,11 +98,8 @@ function testRegisterUserWithEmailVerification() {
    */
   function testRegisterUserWithoutEmailVerification() {
     config('user.settings')->set('verify_mail', FALSE)->save();
-
-    config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('timezone.default', 'Europe/Brussels')
-      ->save();
+    variable_get('configurable_timezones', 1);
+    variable_set('date_default_timezone', 'Europe/Brussels');
 
     // Tell openid_test.module to respond with these SREG fields.
     variable_set('openid_test_response', array(
@@ -145,10 +139,8 @@ function testRegisterUserWithoutEmailVerification() {
    * information (a username that is already taken, and no e-mail address).
    */
   function testRegisterUserWithInvalidSreg() {
-    config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('timezone.default', 'Europe/Brussels')
-      ->save();
+    variable_get('configurable_timezones', 1);
+    variable_set('date_default_timezone', 'Europe/Brussels');
 
     // Tell openid_test.module to respond with these SREG fields.
     $web_user = $this->drupalCreateUser(array());
@@ -198,6 +190,7 @@ function testRegisterUserWithInvalidSreg() {
    * information (i.e. no username or e-mail address).
    */
   function testRegisterUserWithoutSreg() {
+    variable_get('configurable_timezones', 1);
 
     // Load the front page to get the user login block.
     $this->drupalGet('');
@@ -237,9 +230,7 @@ function testRegisterUserWithoutSreg() {
    */
   function testRegisterUserWithAXButNoSREG() {
     config('user.settings')->set('verify_mail', FALSE)->save();
-    config('system.date')
-      ->set('timezone.default', 'Europe/Brussels')
-      ->save();
+    variable_set('date_default_timezone', 'Europe/Brussels');
 
     // Tell openid_test.module to respond with these AX fields.
     variable_set('openid_test_response', array(
diff --git a/core/modules/search/search.pages.inc b/core/modules/search/search.pages.inc
index 9d99063..b6a1930 100644
--- a/core/modules/search/search.pages.inc
+++ b/core/modules/search/search.pages.inc
@@ -122,7 +122,7 @@ function template_preprocess_search_result(&$variables) {
     $info['user'] = $result['user'];
   }
   if (!empty($result['date'])) {
-    $info['date'] = format_date($result['date'], 'system_short');
+    $info['date'] = format_date($result['date'], 'short');
   }
   if (isset($result['extra']) && is_array($result['extra'])) {
     $info = array_merge($info, $result['extra']);
diff --git a/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php b/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
index dd25d52..0b5909d 100644
--- a/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
+++ b/core/modules/statistics/lib/Drupal/statistics/Tests/StatisticsTokenReplaceTest.php
@@ -46,7 +46,7 @@ function testStatisticsTokenReplacement() {
     $tests['[node:total-count]'] = 1;
     $tests['[node:day-count]'] = 1;
     $tests['[node:last-view]'] = format_date($statistics['timestamp']);
-    $tests['[node:last-view:short]'] = format_date($statistics['timestamp'], 'system_short');
+    $tests['[node:last-view:short]'] = format_date($statistics['timestamp'], 'short');
 
     // Test to make sure that we generated something for each token.
     $this->assertFalse(in_array(0, array_map('strlen', $tests)), 'No empty tokens generated.');
diff --git a/core/modules/system/config/system.date.yml b/core/modules/system/config/system.date.yml
deleted file mode 100644
index a1b1120..0000000
--- a/core/modules/system/config/system.date.yml
+++ /dev/null
@@ -1,70 +0,0 @@
-first_day: '0'
-country:
-  default: ''
-timezone:
-  default: ''
-  user:
-    configurable: '1'
-    default: '0'
-    warn: '0'
-formats:
-  system_long:
-    name: 'Default Long Date'
-    pattern:
-      php: 'l, F j, Y - H:i'
-      intl: 'EEEE, LLLL d, yyyy - kk:mm'
-    locked: 0
-  system_medium:
-    name: 'Default Medium Date'
-    pattern:
-      php: 'D, m/d/Y - H:i'
-      intl: 'ccc, MM/dd/yyyy - kk:mm'
-    locked: 0
-  system_short:
-    name: 'Default Short Date'
-    pattern:
-      php: 'm/d/Y - H:i'
-      intl: 'MM/dd/yyyy - kk:mm'
-    locked: 0
-  html_datetime:
-    name: 'HTML Datetime'
-    pattern:
-      php: 'Y-m-d\TH:i:sO'
-      intl: "yyyy-MM-dd'Tkk:mm:ssZZ"
-    locked: 1
-  html_date:
-    name: 'HTML Date'
-    pattern:
-      php: 'Y-m-d'
-      intl: 'yyyy-MM-dd'
-    locked: 1
-  html_time:
-    name: 'HTML Time'
-    pattern:
-      php: 'H:i:s'
-      intl: 'H:mm:ss'
-    locked: 1
-  html_yearless_date:
-    name: 'HTML Yearless date'
-    pattern:
-      php: 'm-d'
-      intl: 'MM-d'
-    locked: 1
-  html_week:
-    name: 'HTML Week'
-    pattern:
-      php: 'Y-\WW'
-      intl: "Y-'WW"
-    locked: 1
-  html_month:
-    name: 'HTML Month'
-    pattern:
-      php: 'Y-m'
-      intl: 'Y-MM'
-    locked: 1
-  html_year:
-    name: 'HTML Year'
-    pattern:
-      php: 'Y'
-      intl: 'Y'
-    locked: 1
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
index 5d8858e..d3cd9e6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/FormatDateTest.php
@@ -35,19 +35,15 @@ public static function getInfo() {
   }
 
   function setUp() {
-    parent::setUp('language');
-    config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('formats.system_long.pattern.php', 'l, j. F Y - G:i')
-      ->set('formats.system_medium.pattern.php', 'j. F Y - G:i')
-      ->set('formats.system_short.pattern.php', 'Y M j - g:ia')
-      ->save();
-
+    parent::setUp();
+    variable_set('configurable_timezones', 1);
+    variable_set('date_format_long', 'l, j. F Y - G:i');
+    variable_set('date_format_medium', 'j. F Y - G:i');
+    variable_set('date_format_short', 'Y M j - g:ia');
     variable_set('locale_custom_strings_' . self::LANGCODE, array(
       '' => array('Sunday' => 'domingo'),
       'Long month name' => array('March' => 'marzo'),
     ));
-
     $this->refreshVariables();
   }
 
@@ -60,16 +56,21 @@ function testAdminDefinedFormatDate() {
     $this->drupalLogin($this->admin_user);
 
     // Add new date format.
+    $admin_date_format = 'j M y';
+    $edit = array('date_format' => $admin_date_format);
+    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, 'Add format');
+
+    // Add new date type.
     $edit = array(
-      'date_format_id' => 'example_style',
-      'date_format_name' => 'Example Style',
-      'date_format_pattern' => 'j M y',
+      'date_type' => 'Example Style',
+      'machine_name' => 'example_style',
+      'date_format' => $admin_date_format,
     );
-    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
+    $this->drupalPost('admin/config/regional/date-time/types/add', $edit, 'Add date type');
 
     $timestamp = strtotime('2007-03-10T00:00:00+00:00');
     $this->assertIdentical(format_date($timestamp, 'example_style', '', 'America/Los_Angeles'), '9 Mar 07', 'Test format_date() using an admin-defined date type.');
-    $this->assertIdentical(format_date($timestamp, 'undefined_style'), format_date($timestamp, 'system_medium'), 'Test format_date() defaulting to medium when $type not found.');
+    $this->assertIdentical(format_date($timestamp, 'undefined_style'), format_date($timestamp, 'medium'), 'Test format_date() defaulting to medium when $type not found.');
   }
 
   /**
@@ -122,9 +123,9 @@ function testFormatDate() {
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', 'Test a different language.');
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London'), 'Monday, 26-Mar-07 01:00:00 BST', 'Test a different time zone.');
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T'), 'domingo, 25-Mar-07 17:00:00 PDT', 'Test custom date format.');
-    $this->assertIdentical(format_date($timestamp, 'system_long'), 'domingo, 25. marzo 2007 - 17:00', 'Test long date format.');
-    $this->assertIdentical(format_date($timestamp, 'system_medium'), '25. marzo 2007 - 17:00', 'Test medium date format.');
-    $this->assertIdentical(format_date($timestamp, 'system_short'), '2007 Mar 25 - 5:00pm', 'Test short date format.');
+    $this->assertIdentical(format_date($timestamp, 'long'), 'domingo, 25. marzo 2007 - 17:00', 'Test long date format.');
+    $this->assertIdentical(format_date($timestamp, 'medium'), '25. marzo 2007 - 17:00', 'Test medium date format.');
+    $this->assertIdentical(format_date($timestamp, 'short'), '2007 Mar 25 - 5:00pm', 'Test short date format.');
     $this->assertIdentical(format_date($timestamp), '25. marzo 2007 - 17:00', 'Test default date format.');
     // Test HTML time element formats.
     $this->assertIdentical(format_date($timestamp, 'html_datetime'), '2007-03-25T17:00:00-0700', 'Test html_datetime date format.');
diff --git a/core/modules/system/lib/Drupal/system/Tests/Datetime/DrupalDateTimeTest.php b/core/modules/system/lib/Drupal/system/Tests/Datetime/DrupalDateTimeTest.php
index 5539a61..ea10896 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Datetime/DrupalDateTimeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Datetime/DrupalDateTimeTest.php
@@ -48,8 +48,8 @@ public function testDateTimezone() {
     $date_string = '2007-01-31 21:00:00';
 
     // Make sure no site timezone has been set.
-    config('system.date')->set('timezone.default', NULL)->save();
-    config('system.date')->set('timezone.user.configurable', 0)->save();
+    variable_set('date_default_timezone', NULL);
+    variable_set('configurable_timezones', 0);
 
     // Detect the system timezone.
     $system_timezone = date_default_timezone_get();
@@ -66,7 +66,7 @@ public function testDateTimezone() {
     $this->assertTrue($timezone == 'America/Yellowknife', 'DrupalDateTime uses the specified timezone if provided.');
 
     // Set a site timezone.
-    config('system.date')->set('timezone.default', 'Europe/Warsaw')->save();
+    variable_set('date_default_timezone', 'Europe/Warsaw');
 
     // Create a date object with an unspecified timezone, which should
     // end up using the site timezone.
@@ -75,7 +75,7 @@ public function testDateTimezone() {
     $this->assertTrue($timezone == 'Europe/Warsaw', 'DrupalDateTime uses the site timezone if provided.');
 
     // Create user.
-    config('system.date')->set('timezone.user.configurable', 1)->save();
+    variable_set('configurable_timezones', 1);
     $test_user = $this->drupalCreateUser(array());
     $this->drupalLogin($test_user);
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php b/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php
index 172973d..10f49b9 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/DateFormatsLanguageTest.php
@@ -19,7 +19,7 @@ class DateFormatsLanguageTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'locale');
+  public static $modules = array('node', 'language');
 
   public static function getInfo() {
     return array(
@@ -57,39 +57,20 @@ function testLocalizeDateFormats() {
     );
     $this->drupalPost('admin/config/regional/language/detection', $edit, t('Save settings'));
 
-    // Add new date format for French.
-    $edit = array(
-      'date_format_id' => 'example_style_fr',
-      'date_format_name' => 'Example Style',
-      'date_format_pattern' => 'd.m.Y - H:i',
-      'date_langcode[]' => array('fr'),
-    );
-    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
-
-    // Add new date format for English.
-    $edit = array(
-      'date_format_id' => 'example_style_en',
-      'date_format_name' => 'Example Style',
-      'date_format_pattern' => 'j M Y - g:ia',
-      'date_langcode[]' => array('en'),
-    );
-    $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
-
     // Configure date formats.
     $this->drupalGet('admin/config/regional/date-time/locale');
     $this->assertText('French', 'Configured languages appear.');
     $edit = array(
-      'date_format_system_long' => 'example_style_fr',
-      'date_format_system_medium' => 'example_style_fr',
-      'date_format_system_short' => 'example_style_fr',
+      'date_format_long' => 'd.m.Y - H:i',
+      'date_format_medium' => 'd.m.Y - H:i',
+      'date_format_short' => 'd.m.Y - H:i',
     );
     $this->drupalPost('admin/config/regional/date-time/locale/fr/edit', $edit, t('Save configuration'));
     $this->assertText(t('Configuration saved.'), 'French date formats updated.');
-
     $edit = array(
-      'date_format_system_long' => 'example_style_en',
-      'date_format_system_medium' => 'example_style_en',
-      'date_format_system_short' => 'example_style_en',
+      'date_format_long' => 'j M Y - g:ia',
+      'date_format_medium' => 'j M Y - g:ia',
+      'date_format_short' => 'j M Y - g:ia',
     );
     $this->drupalPost('admin/config/regional/date-time/locale/en/edit', $edit, t('Save configuration'));
     $this->assertText(t('Configuration saved.'), 'English date formats updated.');
@@ -104,10 +85,5 @@ function testLocalizeDateFormats() {
     $this->drupalGet('fr/node/' . $node->nid);
     $french_date = format_date($node->created, 'custom', 'd.m.Y');
     $this->assertText($french_date, 'French date format appears');
-
-    // Make sure we can reset dates back to default.
-    $this->drupalPost('admin/config/regional/date-time/locale/en/reset', array(), t('Reset'));
-    $this->drupalGet('node/' . $node->nid);
-    $this->assertNoText($english_date, 'English date format does not appear');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/DateTimeTest.php b/core/modules/system/lib/Drupal/system/Tests/System/DateTimeTest.php
index 53dccbe..8483da2 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/DateTimeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/DateTimeTest.php
@@ -38,16 +38,15 @@ function setUp() {
     $this->drupalLogin($this->admin_user);
   }
 
+
   /**
    * Test time zones and DST handling.
    */
   function testTimeZoneHandling() {
     // Setup date/time settings for Honolulu time.
-    $config = config('system.date')
-      ->set('timezone.default', 'Pacific/Honolulu')
-      ->set('timezone.user.configurable', 0)
-      ->set('formats.system_medium.pattern.php', 'Y-m-d H:i:s O')
-      ->save();
+    variable_set('date_default_timezone', 'Pacific/Honolulu');
+    variable_set('configurable_timezones', 0);
+    variable_set('date_format_medium', 'Y-m-d H:i:s O');
 
     // Create some nodes with different authored-on dates.
     $date1 = '2007-01-31 21:00:00 -1000';
@@ -62,7 +61,7 @@ function testTimeZoneHandling() {
     $this->assertText('2007-07-31 21:00:00 -1000', 'Date should be identical, with GMT offset of -10 hours.');
 
     // Set time zone to Los Angeles time.
-    $config->set('timezone.default', 'America/Los_Angeles')->save();
+    variable_set('date_default_timezone', 'America/Los_Angeles');
 
     // Confirm date format and time zone.
     $this->drupalGet("node/$node1->nid");
@@ -72,33 +71,64 @@ function testTimeZoneHandling() {
   }
 
   /**
+   * Test date type configuration.
+   */
+  function testDateTypeConfiguration() {
+    // Confirm system date types appear.
+    $this->drupalGet('admin/config/regional/date-time');
+    $this->assertText(t('Medium'), 'System date types appear in date type list.');
+    $this->assertNoRaw('href="/admin/config/regional/date-time/types/medium/delete"', 'No delete link appear for system date types.');
+
+    // Add custom date type.
+    $this->clickLink(t('Add date type'));
+    $date_type = strtolower($this->randomName(8));
+    $machine_name = 'machine_' . $date_type;
+    $date_format = 'd.m.Y - H:i';
+    $edit = array(
+      'date_type' => $date_type,
+      'machine_name' => $machine_name,
+      'date_format' => $date_format,
+    );
+    $this->drupalPost('admin/config/regional/date-time/types/add', $edit, t('Add date type'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('New date type added successfully.'), 'Date type added confirmation message appears.');
+    $this->assertText($date_type, 'Custom date type appears in the date type list.');
+    $this->assertText(t('delete'), 'Delete link for custom date type appears.');
+
+    // Delete custom date type.
+    $this->clickLink(t('delete'));
+    $this->drupalPost('admin/config/regional/date-time/types/' . $machine_name . '/delete', array(), t('Remove'));
+    $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time', array('absolute' => TRUE)), 'Correct page redirection.');
+    $this->assertText(t('Removed date type ' . $date_type), 'Custom date type removed.');
+  }
+
+  /**
    * Test date format configuration.
    */
   function testDateFormatConfiguration() {
     // Confirm 'no custom date formats available' message appears.
     $this->drupalGet('admin/config/regional/date-time/formats');
+    $this->assertText(t('No custom date formats available.'), 'No custom date formats message appears.');
 
     // Add custom date format.
     $this->clickLink(t('Add format'));
-    $date_format_id = strtolower($this->randomName(8));
-    $name = ucwords($date_format_id);
-    $date_format = 'd.m.Y - H:i';
     $edit = array(
-      'date_format_id' => $date_format_id,
-      'date_format_name' => $name,
-      'date_format_pattern' => $date_format,
+      'date_format' => 'Y',
     );
     $this->drupalPost('admin/config/regional/date-time/formats/add', $edit, t('Add format'));
     $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
-    $this->assertText(t('Custom date format updated.'), 'Date format added confirmation message appears.');
-    $this->assertText($date_format_id, 'Custom date format appears in the date format list.');
-    $this->assertText(t('delete'), 'Delete link for custom date format appears.');
+    $this->assertNoText(t('No custom date formats available.'), 'No custom date formats message does not appear.');
+    $this->assertText(t('Custom date format added.'), 'Custom date format added.');
+
+    // Ensure custom date format appears in date type configuration options.
+    $this->drupalGet('admin/config/regional/date-time');
+    $this->assertRaw('<option value="Y">', 'Custom date format appears in options.');
 
     // Edit custom date format.
     $this->drupalGet('admin/config/regional/date-time/formats');
     $this->clickLink(t('edit'));
     $edit = array(
-      'date_format_pattern' => 'Y m',
+      'date_format' => 'Y m',
     );
     $this->drupalPost($this->getUrl(), $edit, t('Save format'));
     $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
@@ -106,37 +136,80 @@ function testDateFormatConfiguration() {
 
     // Delete custom date format.
     $this->clickLink(t('delete'));
-    $this->drupalPost('admin/config/regional/date-time/formats/' . $date_format_id . '/delete', array(), t('Remove'));
+    $this->drupalPost($this->getUrl(), array(), t('Remove'));
     $this->assertEqual($this->getUrl(), url('admin/config/regional/date-time/formats', array('absolute' => TRUE)), 'Correct page redirection.');
-    $this->assertText(t('Removed date format ' . $name), 'Custom date format removed.');
-
-    // Make sure the date does not exist in config.
-    $date_format = config('system.date')->get('formats.' . $date_format_id);
-    $this->assertIdentical($date_format, NULL);
+    $this->assertText(t('Removed date format'), 'Custom date format removed successfully.');
   }
 
   /**
    * Test if the date formats are stored properly.
    */
   function testDateFormatStorage() {
-    $date_format_info = array(
-      'name' => 'testDateFormatStorage Short Format',
-      'pattern' => array('php' => 'dmYHis'),
+    $date_format = array(
+      'type' => 'short',
+      'format' => 'dmYHis',
+      'locked' => 0,
+      'is_new' => 1,
     );
-
-    system_date_format_save('test_short', $date_format_info);
-
-    $format = config('system.date')->get('formats.test_short.pattern.php');
-    $this->assertEqual('dmYHis', $format, 'Unlocalized date format resides in general config.');
-
-    $date_format_info['locales'] = array('en');
-
-    system_date_format_save('test_short_en', $date_format_info);
-
-    $format = config('system.date')->get('formats.test_short_en.pattern.php');
-    $this->assertEqual('dmYHis', $format, 'Localized date format resides in general config too.');
-
-    $format = config('locale.config.en.system.date')->get('formats.test_short_en.pattern.php');
-    $this->assertEqual('dmYHis', $format, 'Localized date format resides in localized config.');
+    system_date_format_save($date_format);
+
+    $format = db_select('date_formats', 'df')
+      ->fields('df', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'dmYHis')
+      ->execute()
+      ->fetchField();
+    $this->verbose($format);
+    $this->assertEqual('dmYHis', $format, 'Unlocalized date format resides in general table.');
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'dmYHis')
+      ->execute()
+      ->fetchField();
+    $this->assertFalse($format, 'Unlocalized date format resides not in localized table.');
+
+    // Enable German language
+    $language = new Language(array(
+      'langcode' => 'de',
+      'default' => TRUE,
+    ));
+    language_save($language);
+
+    $date_format = array(
+      'type' => 'short',
+      'format' => 'YMDHis',
+      'locales' => array('de', 'tr'),
+      'locked' => 0,
+      'is_new' => 1,
+    );
+    system_date_format_save($date_format);
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->condition('language', 'de')
+      ->execute()
+      ->fetchField();
+    $this->assertEqual('YMDHis', $format, 'Localized date format resides in localized table.');
+
+    $format = db_select('date_formats', 'df')
+      ->fields('df', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->execute()
+      ->fetchField();
+    $this->assertEqual('YMDHis', $format, 'Localized date format resides in general table too.');
+
+    $format = db_select('date_format_locale', 'dfl')
+      ->fields('dfl', array('format'))
+      ->condition('type', 'short')
+      ->condition('format', 'YMDHis')
+      ->condition('language', 'tr')
+      ->execute()
+      ->fetchColumn();
+    $this->assertFalse($format, 'Localized date format for disabled language is ignored.');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/TokenReplaceTest.php b/core/modules/system/lib/Drupal/system/Tests/System/TokenReplaceTest.php
index 1c367fb..3859041 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/TokenReplaceTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/TokenReplaceTest.php
@@ -44,7 +44,7 @@ function testTokenReplacement() {
     $target .= check_plain($account->name);
     $target .= format_interval(REQUEST_TIME - $node->created, 2, $language_interface->langcode);
     $target .= check_plain($user->name);
-    $target .= format_date(REQUEST_TIME, 'system_short', '', NULL, $language_interface->langcode);
+    $target .= format_date(REQUEST_TIME, 'short', '', NULL, $language_interface->langcode);
 
     // Test that the clear parameter cleans out non-existent tokens.
     $result = token_replace($source, array('node' => $node), array('langcode' => $language_interface->langcode, 'clear' => TRUE));
@@ -154,9 +154,9 @@ function testSystemDateTokenReplacement() {
 
     // Generate and test tokens.
     $tests = array();
-    $tests['[date:short]'] = format_date($date, 'system_short', '', NULL, $language_interface->langcode);
-    $tests['[date:medium]'] = format_date($date, 'system_medium', '', NULL, $language_interface->langcode);
-    $tests['[date:long]'] = format_date($date, 'system_long', '', NULL, $language_interface->langcode);
+    $tests['[date:short]'] = format_date($date, 'short', '', NULL, $language_interface->langcode);
+    $tests['[date:medium]'] = format_date($date, 'medium', '', NULL, $language_interface->langcode);
+    $tests['[date:long]'] = format_date($date, 'long', '', NULL, $language_interface->langcode);
     $tests['[date:custom:m/j/Y]'] = format_date($date, 'custom', 'm/j/Y', NULL, $language_interface->langcode);
     $tests['[date:since]'] = format_interval((REQUEST_TIME - $date), 2, $language_interface->langcode);
     $tests['[date:raw]'] = filter_xss($date);
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 717f650..7de746f 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -8,7 +8,6 @@
 use Symfony\Component\HttpFoundation\JsonResponse;
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
-use Drupal\Core\Datetime\DrupalDateTime;
 
 /**
  * Menu callback; Provide the administration overview page.
@@ -1861,13 +1860,11 @@ function system_rss_feeds_settings_submit($form, &$form_state) {
  * Form builder; Configure the site regional settings.
  *
  * @ingroup forms
- * @see system_config_form()
+ * @see system_settings_form()
  * @see system_regional_settings_submit()
  */
-function system_regional_settings($form, &$form_state) {
+function system_regional_settings() {
   $countries = country_get_list();
-  $system_date = config('system.date');
-  $system_date = config('system.date');
 
   // Date settings:
   $zones = system_time_zones();
@@ -1881,7 +1878,7 @@ function system_regional_settings($form, &$form_state) {
     '#type' => 'select',
     '#title' => t('Default country'),
     '#empty_value' => '',
-    '#default_value' => $system_date->get('country.default'),
+    '#default_value' => variable_get('site_default_country', ''),
     '#options' => $countries,
     '#attributes' => array('class' => array('country-detect')),
   );
@@ -1889,7 +1886,7 @@ function system_regional_settings($form, &$form_state) {
   $form['locale']['date_first_day'] = array(
     '#type' => 'select',
     '#title' => t('First day of week'),
-    '#default_value' => $system_date->get('first_day'),
+    '#default_value' => variable_get('date_first_day', 0),
     '#options' => array(0 => t('Sunday'), 1 => t('Monday'), 2 => t('Tuesday'), 3 => t('Wednesday'), 4 => t('Thursday'), 5 => t('Friday'), 6 => t('Saturday')),
   );
 
@@ -1898,16 +1895,14 @@ function system_regional_settings($form, &$form_state) {
     '#title' => t('Time zones'),
   );
 
-  $date_default_timezone = $system_date->get('timezone.default');
-  $date_default_timezone = $system_date->get('timezone.default');
   $form['timezone']['date_default_timezone'] = array(
     '#type' => 'select',
     '#title' => t('Default time zone'),
-    '#default_value' => isset($date_default_timezone) ? $date_default_timezone : date_default_timezone_get(),
+    '#default_value' => variable_get('date_default_timezone', date_default_timezone_get()),
     '#options' => $zones,
   );
 
-  $configurable_timezones = $system_date->get('timezone.user.configurable');
+  $configurable_timezones = variable_get('configurable_timezones', 1);
   $form['timezone']['configurable_timezones'] = array(
     '#type' => 'checkbox',
     '#title' => t('Users may set their own time zone.'),
@@ -1927,14 +1922,14 @@ function system_regional_settings($form, &$form_state) {
   $form['timezone']['configurable_timezones_wrapper']['empty_timezone_message'] = array(
     '#type' => 'checkbox',
     '#title' => t('Remind users at login if their time zone is not set.'),
-    '#default_value' => $system_date->get('timezone.user.warn'),
+    '#default_value' => variable_get('empty_timezone_message', 0),
     '#description' => t('Only applied if users may set their own time zone.')
   );
 
   $form['timezone']['configurable_timezones_wrapper']['user_default_timezone'] = array(
     '#type' => 'radios',
     '#title' => t('Time zone for new users'),
-    '#default_value' => $system_date->get('timezone.user.default'),
+    '#default_value' => variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT),
     '#options' => array(
       DRUPAL_USER_TIMEZONE_DEFAULT => t('Default time zone.'),
       DRUPAL_USER_TIMEZONE_EMPTY   => t('Empty time zone.'),
@@ -1943,24 +1938,209 @@ function system_regional_settings($form, &$form_state) {
     '#description' => t('Only applied if users may set their own time zone.')
   );
 
-  return system_config_form($form, $form_state);
+  return system_settings_form($form);
 }
 
 /**
- * Form builder submit handler; Handles submission for regional settings.
+ * Form builder; Configure the site date and time settings.
  *
  * @ingroup forms
- * @see system_regional_settings()
- */
-function system_regional_settings_submit($form, &$form_state) {
-  config('system.date')
-    ->set('country.default', $form_state['values']['site_default_country'])
-    ->set('first_day', $form_state['values']['date_first_day'])
-    ->set('timezone.default', $form_state['values']['date_default_timezone'])
-    ->set('timezone.user.configurable', $form_state['values']['configurable_timezones'])
-    ->set('timezone.user.warn', $form_state['values']['empty_timezone_message'])
-    ->set('timezone.user.default', $form_state['values']['user_default_timezone'])
-    ->save();
+ * @see system_settings_form()
+ */
+function system_date_time_settings() {
+  // Get list of all available date types.
+  drupal_static_reset('system_get_date_types');
+  $format_types = system_get_date_types();
+
+  // Get list of all available date formats.
+  $all_formats = array();
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(); // Call this to rebuild the list, and to have default list.
+  foreach ($date_formats as $type => $format_info) {
+    $all_formats = array_merge($all_formats, $format_info);
+  }
+  $custom_formats = system_get_date_formats('custom');
+  if (!empty($format_types)) {
+    foreach ($format_types as $type => $type_info) {
+      // If a system type, only show the available formats for that type and
+      // custom ones.
+      if ($type_info['locked'] == 1) {
+        $formats = system_get_date_formats($type);
+        if (empty($formats)) {
+          $formats = $all_formats;
+        }
+        elseif (!empty($custom_formats)) {
+          $formats = array_merge($formats, $custom_formats);
+        }
+      }
+      // If a user configured type, show all available date formats.
+      else {
+        $formats = $all_formats;
+      }
+
+      $choices = array();
+      foreach ($formats as $f => $format) {
+        $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+      }
+      reset($formats);
+      $default = variable_get('date_format_' . $type, key($formats));
+
+      // Get date type info for this date type.
+      $type_info = system_get_date_types($type);
+      $form['formats']['#theme'] = 'system_date_time_settings';
+
+      // Show date format select list.
+      $form['formats']['format']['date_format_' . $type] = array(
+        '#type' => 'select',
+        '#title' => check_plain($type_info['title']),
+        '#attributes' => array('class' => array('date-format')),
+        '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
+        '#options' => $choices,
+      );
+
+      $links = array();
+      // If this isn't a system provided type, allow the user to remove it from
+      // the system.
+      if ($type_info['locked'] == 0) {
+        $links['delete'] = array(
+          'title' => t('delete'),
+          'href' => "admin/config/regional/date-time/types/$type/delete",
+        );
+      }
+      $form['formats']['operations']["date_format_$type"] = array(
+        '#type' => 'operations',
+        '#links' => $links,
+      );
+    }
+  }
+
+  // Display a message if no date types configured.
+  $form['#empty_text'] = t('No date types available. <a href="@link">Add date type</a>.', array('@link' => url('admin/config/regional/date-time/types/add')));
+
+  return system_settings_form($form);
+}
+
+/**
+ * Returns HTML for the date settings form.
+ *
+ * @param $variables
+ *   An associative array containing:
+ *   - form: A render element representing the form.
+ *
+ * @ingroup themeable
+ */
+function theme_system_date_time_settings($variables) {
+  $form = $variables['form'];
+  $header = array(
+    t('Date type'),
+    t('Format'),
+    t('Operations'),
+  );
+
+  foreach (element_children($form['format']) as $key) {
+    $row = array();
+    $row[] = $form['format'][$key]['#title'];
+    $form['format'][$key]['#title_display'] = 'invisible';
+    $row[] = array('data' => drupal_render($form['format'][$key]));
+    $row[] = drupal_render($form['operations'][$key]);
+    $rows[] = $row;
+  }
+
+  $output = theme('table', array('header' => $header, 'rows' => $rows, 'attributes' => array('id' => 'system-date-types')));
+  $output .= drupal_render_children($form);
+
+  return $output;
+}
+
+
+/**
+ * Add new date type.
+ *
+ * @ingroup forms
+ * @ingroup system_add_date_format_type_form_validate()
+ * @ingroup system_add_date_format_type_form_submit()
+ */
+function system_add_date_format_type_form($form, &$form_state) {
+  $form['date_type'] = array(
+    '#title' => t('Date type'),
+    '#type' => 'textfield',
+    '#required' => TRUE,
+  );
+  $form['machine_name'] = array(
+    '#type' => 'machine_name',
+    '#machine_name' => array(
+      'exists' => 'system_get_date_types',
+      'source' => array('date_type'),
+    ),
+  );
+
+  // Get list of all available date formats.
+  $formats = array();
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(); // Call this to rebuild the list, and to have default list.
+  foreach ($date_formats as $type => $format_info) {
+    $formats = array_merge($formats, $format_info);
+  }
+  $custom_formats = system_get_date_formats('custom');
+  if (!empty($custom_formats)) {
+    $formats = array_merge($formats, $custom_formats);
+  }
+  $choices = array();
+  foreach ($formats as $f => $format) {
+    $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
+  }
+  // Show date format select list.
+  $form['date_format'] = array(
+    '#type' => 'select',
+    '#title' => t('Date format'),
+    '#attributes' => array('class' => array('date-format')),
+    '#options' => $choices,
+    '#required' => TRUE,
+  );
+
+  $form['actions'] = array('#type' => 'actions');
+  $form['actions']['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Add date type'),
+  );
+
+  $form['#validate'][] = 'system_add_date_format_type_form_validate';
+  $form['#submit'][] = 'system_add_date_format_type_form_submit';
+
+  return $form;
+}
+
+/**
+ * Validate system_add_date_format_type form submissions.
+ */
+function system_add_date_format_type_form_validate($form, &$form_state) {
+  if (!empty($form_state['values']['machine_name']) && !empty($form_state['values']['date_type'])) {
+    if (!preg_match("/^[a-zA-Z0-9_]+$/", trim($form_state['values']['machine_name']))) {
+      form_set_error('machine_name', t('The date type must contain only alphanumeric characters and underscores.'));
+    }
+    $types = system_get_date_types();
+    if (in_array(trim($form_state['values']['machine_name']), array_keys($types))) {
+      form_set_error('machine_name', t('This date type already exists. Enter a unique type.'));
+    }
+  }
+}
+
+/**
+ * Process system_add_date_format_type form submissions.
+ */
+function system_add_date_format_type_form_submit($form, &$form_state) {
+  $machine_name = trim($form_state['values']['machine_name']);
+
+  $format_type = array();
+  $format_type['title'] = trim($form_state['values']['date_type']);
+  $format_type['type'] = $machine_name;
+  $format_type['locked'] = 0;
+  $format_type['is_new'] = 1;
+  system_date_format_type_save($format_type);
+  variable_set('date_format_' . $machine_name, $form_state['values']['date_format']);
+
+  drupal_set_message(t('New date type added successfully.'));
+  $form_state['redirect'] = 'admin/config/regional/date-time';
 }
 
 /**
@@ -2500,18 +2680,16 @@ function theme_system_themes_page($variables) {
 
 /**
  * Menu callback; present a form for deleting a date format.
- *
- * @param string $date_format_id
- *   The machine name for the date format that may be deleted.
  */
-function system_date_delete_format_form($form, &$form_state, $date_format_id) {
-  $form['date_format_id'] = array(
+function system_date_delete_format_form($form, &$form_state, $dfid) {
+  $form['dfid'] = array(
     '#type' => 'value',
-    '#value' => $date_format_id,
+    '#value' => $dfid,
   );
-  $format = system_get_date_formats($date_format_id);
+  $format = system_get_date_format($dfid);
+
   $output = confirm_form($form,
-    t('Are you sure you want to remove the format %name : %format?', array('%name' => $format['name'], '%format' => format_date(REQUEST_TIME, $date_format_id))),
+    t('Are you sure you want to remove the format %format?', array('%format' => format_date(REQUEST_TIME, 'custom', $format->format))),
     'admin/config/regional/date-time/formats',
     t('This action cannot be undone.'),
     t('Remove'), t('Cancel'),
@@ -2526,53 +2704,76 @@ function system_date_delete_format_form($form, &$form_state, $date_format_id) {
  */
 function system_date_delete_format_form_submit($form, &$form_state) {
   if ($form_state['values']['confirm']) {
-    $format = system_get_date_formats($form_state['values']['date_format_id']);
-    system_date_format_delete($form_state['values']['date_format_id']);
-    drupal_set_message(t('Removed date format %format.', array('%format' => $format['name'])));
+    $format = system_get_date_format($form_state['values']['dfid']);
+    system_date_format_delete($form_state['values']['dfid']);
+    drupal_set_message(t('Removed date format %format.', array('%format' => format_date(REQUEST_TIME, 'custom', $format->format))));
     $form_state['redirect'] = 'admin/config/regional/date-time/formats';
   }
 }
 
 /**
+ * Menu callback; present a form for deleting a date type.
+ */
+function system_delete_date_format_type_form($form, &$form_state, $format_type) {
+  $form['format_type'] = array(
+    '#type' => 'value',
+    '#value' => $format_type,
+  );
+  $type_info = system_get_date_types($format_type);
+
+  $output = confirm_form($form,
+    t('Are you sure you want to remove the date type %type?', array('%type' => $type_info['title'])),
+    'admin/config/regional/date-time',
+    t('This action cannot be undone.'),
+    t('Remove'), t('Cancel'),
+    'confirm'
+  );
+
+  return $output;
+}
+
+/**
+ * Delete a configured date type.
+ */
+function system_delete_date_format_type_form_submit($form, &$form_state) {
+  if ($form_state['values']['confirm']) {
+    $type_info = system_get_date_types($form_state['values']['format_type']);
+    system_date_format_type_delete($form_state['values']['format_type']);
+    drupal_set_message(t('Removed date type %type.', array('%type' => $type_info['title'])));
+    $form_state['redirect'] = 'admin/config/regional/date-time';
+  }
+}
+
+
+/**
  * Displays the date format strings overview page.
  */
 function system_date_time_formats() {
-  $header = array(
-    array('data' => t('Machine name'), 'field' => 'machine_name'),
-    array('data' => t('Name'), 'field' => 'name'),
-    array('data' => t('Pattern'), 'field' => 'pattern'),
-    array('data' => t('Operations'))
-  );
+  $header = array(t('Format'), t('Operations'));
   $rows = array();
 
-  $formats = system_get_date_formats();
-
+  drupal_static_reset('system_get_date_formats');
+  $formats = system_get_date_formats('custom');
   if (!empty($formats)) {
-    foreach ($formats as $date_format_id => $format_info) {
-      // Do not display date formats that are locked.
-      if (empty($format_info['locked'])) {
-        $row = array();
-        $row[] = array('data' => $date_format_id);
-        $row[] = array('data' => $format_info['name']);
-        $row[] = array('data' => format_date(REQUEST_TIME, $date_format_id));
-
-        // Prepare Operational links.
-        $links = array();
-        $links['edit'] = array(
-          'title' => t('edit'),
-          'href' => 'admin/config/regional/date-time/formats/' . $date_format_id . '/edit',
-        );
-        $links['delete'] = array(
-          'title' => t('delete'),
-          'href' => 'admin/config/regional/date-time/formats/' . $date_format_id . '/delete',
-        );
-        $row['operations'] = array('data' => array(
+    foreach ($formats as $format) {
+      $row = array();
+      $row[] = array('data' => format_date(REQUEST_TIME, 'custom', $format['format']));
+      $links = array();
+      $links['edit'] = array(
+        'title' => t('edit'),
+        'href' => 'admin/config/regional/date-time/formats/' . $format['dfid'] . '/edit',
+      );
+      $links['delete'] = array(
+        'title' => t('delete'),
+        'href' => 'admin/config/regional/date-time/formats/' . $format['dfid'] . '/delete',
+      );
+      $row[] = array(
+        'data' => array(
           '#type' => 'operations',
           '#links' => $links,
-        ));
-
-        $rows[] = $row;
-      }
+        ),
+      );
+      $rows[] = $row;
     }
   }
 
@@ -2588,52 +2789,24 @@ function system_date_time_formats() {
 
 /**
  * Allow users to add additional date formats.
- *
- * @param string $date_format_id
- *   (optional) When present, provides the machine name of the date format that
- *   is being modified. Defaults to an empty string.
  */
-function system_configure_date_formats_form($form, &$form_state, $date_format_id = '') {
-  $formats = system_get_date_formats();
-  $format_info = config('system.date')->get('formats.' . $date_format_id);
-  $patterns = $format_info['pattern'];
-  $date = new DrupalDateTime;
-  $pattern = $date->canUseIntl() ? $patterns[DrupalDateTime::INTL] : $patterns[DrupalDateTime::PHP];
-
-  $form['date_format_name'] = array(
-    '#type' => 'textfield',
-    '#title' => 'Name',
-    '#maxlength' => 100,
-    '#description' => t('Name of the date format'),
-    '#default_value' => empty($format_info['name']) ? '' : $format_info['name']
-  );
+function system_configure_date_formats_form($form, &$form_state, $dfid = 0) {
+  if ($dfid) {
+    $form['dfid'] = array(
+      '#type' => 'value',
+      '#value' => $dfid,
+    );
+    $format = system_get_date_format($dfid);
+  }
 
-  $now = !empty($date_format_id) ? t('Displayed as %date', array('%date' => format_date(REQUEST_TIME, $date_format_id))) : '';
+  $now = ($dfid ? t('Displayed as %date', array('%date' => format_date(REQUEST_TIME, 'custom', $format->format))) : '');
 
-  $form['date_format_id'] = array(
-    '#type' => 'machine_name',
-    '#title' => t('Machine-readable name'),
-    '#description' => t('A unique machine-readable name. Can only contain lowercase letters, numbers, and underscores.'),
-    '#disabled' => !empty($date_format_id),
-    '#default_value' => $date_format_id,
-    '#machine_name' => array(
-      'exists' => 'system_date_format_exists',
-      'source' => array('date_format_name'),
-    ),
-  );
-
-  if (class_exists('intlDateFormatter')) {
-    $description = t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://userguide.icu-project.org/formatparse/datetime'));
-  }
-  else {
-    $description = t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://php.net/manual/function.date.php'));
-  }
-  $form['date_format_pattern'] = array(
+  $form['date_format'] = array(
     '#type' => 'textfield',
     '#title' => t('Format string'),
     '#maxlength' => 100,
-    '#description' => $description,
-    '#default_value' => empty($pattern) ? '' : $pattern,
+    '#description' => t('A user-defined date format. See the <a href="@url">PHP manual</a> for available options.', array('@url' => 'http://php.net/manual/function.date.php')),
+    '#default_value' => ($dfid ? $format->format : ''),
     '#field_suffix' => ' <small id="edit-date-format-suffix">' . $now . '</small>',
     '#ajax' => array(
       'callback' => 'system_date_time_lookup',
@@ -2643,78 +2816,44 @@ function system_configure_date_formats_form($form, &$form_state, $date_format_id
     '#required' => TRUE,
   );
 
-  $languages = language_list();
-
-  $options = array();
-  foreach ($languages as $langcode => $data) {
-    $options[$langcode] = $data->name;
-  }
-
-  if (!empty($options)) {
-    $form['date_langcode'] = array(
-      '#title' => t('Select localizations'),
-      '#type' => 'select',
-      '#options' => $options,
-      '#multiple' => TRUE,
-      '#default_value' => empty($format_info['locales']) ? '' : $format_info['locales']
-    );
-  }
-
   $form['actions'] = array('#type' => 'actions');
   $form['actions']['update'] = array(
     '#type' => 'submit',
-    '#value' => (!empty($date_format_id) ? t('Save format') : t('Add format')),
+    '#value' => ($dfid ? t('Save format') : t('Add format')),
   );
 
-  $form['#validate'][] = 'system_date_formats_form_validate';
-  $form['#submit'][] = 'system_date_formats_form_submit';
+  $form['#validate'][] = 'system_add_date_formats_form_validate';
+  $form['#submit'][] = 'system_add_date_formats_form_submit';
 
   return $form;
 }
 
 /**
- * Checks if the chosen machine_name exists or not.
- */
-function system_date_format_exists($candidate_machine_name) {
-  if ($formats = system_get_date_formats()) {
-    return array_key_exists($candidate_machine_name, $formats);
-  }
-  return FALSE;
-}
-
-/**
- * Validate date format string submission.
+ * Validate new date format string submission.
  */
-function system_date_formats_form_validate($form, &$form_state) {
-  $formats = system_get_date_formats();
-  $format = trim($form_state['values']['date_format_pattern']);
-
-  // The machine name field should already check to see if the requested
-  // machine name is available. Regardless of machine_name or human readable
-  // name, check to see if the provided pattern exists.
-  if (!empty($formats) && in_array($format, array_values($formats)) && (!isset($form_state['values']['date_format_id']) || $form_state['values']['date_format_id'] != $formats[$format]['date_format_id'])) {
+function system_add_date_formats_form_validate($form, &$form_state) {
+  $formats = system_get_date_formats('custom');
+  $format = trim($form_state['values']['date_format']);
+  if (!empty($formats) && in_array($format, array_keys($formats)) && (!isset($form_state['values']['dfid']) || $form_state['values']['dfid'] != $formats[$format]['dfid'])) {
     form_set_error('date_format', t('This format already exists. Enter a unique format string.'));
   }
 }
 
 /**
- * Process date format string submission.
+ * Process new date format string submission.
  */
-function system_date_formats_form_submit($form, &$form_state) {
-  $date = new DrupalDateTime;
-  $pattern_type = $date->canUseIntl() ? DrupalDateTime::INTL : DrupalDateTime::PHP;
+function system_add_date_formats_form_submit($form, &$form_state) {
   $format = array();
-  $format['name'] = check_plain($form_state['values']['date_format_name']);
-  $format['pattern'][$pattern_type] = trim($form_state['values']['date_format_pattern']);
-  $format['locales'] = !empty($form_state['values']['date_langcode']) ? $form_state['values']['date_langcode'] : array();
-  // Formats created in the UI are not locked.
+  $format['format'] = trim($form_state['values']['date_format']);
+  $format['type'] = 'custom';
   $format['locked'] = 0;
-
-  system_date_format_save($form_state['values']['date_format_id'], $format);
-  if (!empty($form_state['values']['date_format_id'])) {
+  if (!empty($form_state['values']['dfid'])) {
+    system_date_format_save($format, $form_state['values']['dfid']);
     drupal_set_message(t('Custom date format updated.'));
   }
   else {
+    $format['is_new'] = 1;
+    system_date_format_save($format);
     drupal_set_message(t('Custom date format added.'));
   }
 
@@ -2777,36 +2916,36 @@ function system_date_format_localize_form($form, &$form_state, $langcode) {
     '#value' => $langcode,
   );
 
+  // Get list of date format types.
+  $types = system_get_date_types();
+
   // Get list of available formats.
   $formats = system_get_date_formats();
   $choices = array();
-  foreach ($formats as $date_format_id => $format_info) {
-    // Ignore values that are localized.
-    if (empty($format_info['locales'])) {
-      $choices[$date_format_id] = format_date(REQUEST_TIME, $date_format_id);
-    }
-    else {
-      unset($formats[$date_format_id]);
+  foreach ($formats as $type => $list) {
+    foreach ($list as $f => $format) {
+      $choices[$f] = format_date(REQUEST_TIME, 'custom', $f);
     }
   }
+  reset($formats);
 
   // Get configured formats for each language.
   $locale_formats = system_date_format_locale($langcode);
-  if (!empty($locale_formats)) {
-    $formats += $locale_formats;
-    foreach ($locale_formats as $date_format_id => $format_info) {
-      $choices[$date_format_id] = format_date(REQUEST_TIME, $date_format_id);
+  // Display a form field for each format type.
+  foreach ($types as $type => $type_info) {
+    if (!empty($locale_formats) && in_array($type, array_keys($locale_formats))) {
+      $default = $locale_formats[$type];
+    }
+    else {
+      $default = variable_get('date_format_' . $type, key($formats));
     }
-  }
 
-  // Display a form field for each format type.
-  foreach ($formats as $date_format_id => $format_info) {
     // Show date format select list.
-    $form['date_formats']['date_format_' . $date_format_id] = array(
+    $form['date_formats']['date_format_' . $type] = array(
       '#type' => 'select',
-      '#title' => check_plain($format_info['name']),
+      '#title' => check_plain($type_info['title']),
       '#attributes' => array('class' => array('date-format')),
-      '#default_value' => isset($choices[$date_format_id]) ? $date_format_id : 'custom',
+      '#default_value' => (isset($choices[$default]) ? $default : 'custom'),
       '#options' => $choices,
     );
   }
@@ -2825,8 +2964,8 @@ function system_date_format_localize_form($form, &$form_state, $langcode) {
  */
 function system_date_time_lookup($form, &$form_state) {
   $format = '';
-  if (!empty($form_state['values']['date_format_pattern'])) {
-    $format = t('Displayed as %date_format', array('%date_format' => format_date(REQUEST_TIME, 'custom', $form_state['values']['date_format_pattern'])));
+  if (!empty($form_state['values']['date_format'])) {
+    $format = t('Displayed as %date_format', array('%date_format' => format_date(REQUEST_TIME, 'custom', $form_state['values']['date_format'])));
   }
   // Return a command instead of a string, since the Ajax framework
   // automatically prepends an additional empty DIV element for a string, which
@@ -2841,12 +2980,14 @@ function system_date_time_lookup($form, &$form_state) {
 function system_date_format_localize_form_submit($form, &$form_state) {
   $langcode = $form_state['values']['langcode'];
 
-  $formats = system_get_date_formats();
-  foreach ($formats as $date_format_id => $format_info) {
-    if (isset($form_state['values']['date_format_' . $date_format_id])) {
-      $format = $form_state['values']['date_format_' . $date_format_id];
-      system_date_format_localize_form_save($langcode, $date_format_id, $formats[$format]['pattern']);
+  // Get list of date format types.
+  $types = system_get_date_types();
+  foreach ($types as $type => $type_info) {
+    $format = $form_state['values']['date_format_' . $type];
+    if ($format == 'custom') {
+      $format = $form_state['values']['date_format_' . $type . '_custom'];
     }
+    system_date_format_localize_form_save($langcode, $type, $format);
   }
   drupal_set_message(t('Configuration saved.'));
   $form_state['redirect'] = 'admin/config/regional/date-time/locale';
@@ -2864,8 +3005,8 @@ function system_date_format_localize_form_submit($form, &$form_state) {
 function theme_system_date_format_localize_form($variables) {
   $form = $variables['form'];
   $header = array(
-    'machine_name' => t('Machine Name'),
-    'pattern' => t('Format'),
+    t('Date type'),
+    t('Format'),
   );
 
   foreach (element_children($form['date_formats']) as $key) {
@@ -2906,8 +3047,9 @@ function system_date_format_localize_reset_form($form, &$form_state, $langcode)
  * Form submission handler for locale_date_format_reset_form().
  */
 function system_date_format_localize_reset_form_submit($form, &$form_state) {
-  config('locale.config.' . $form['langcode']['#value'] . '.system.date')
-    ->delete();
+  db_delete('date_format_locale')
+    ->condition('language', $form_state['values']['langcode'])
+    ->execute();
   $form_state['redirect'] = 'admin/config/regional/date-time/locale';
 }
 
@@ -2917,13 +3059,23 @@ function system_date_format_localize_reset_form_submit($form, &$form_state) {
  * @param $langcode
  *   Language code, can be 2 characters, e.g. 'en' or 5 characters, e.g.
  *   'en-CA'.
- * @param $date_format_id
- *   Date format id, e.g. 'short', 'medium'.
+ * @param $type
+ *   Date format type, e.g. 'short', 'medium'.
  * @param $format
  *   The date format string.
  */
-function system_date_format_localize_form_save($langcode, $date_format_id, $format) {
-  config('locale.config.' . $langcode . '.system.date')
-    ->set('formats.' . $date_format_id . '.pattern', $format)
-    ->save();
+function system_date_format_localize_form_save($langcode, $type, $format) {
+  $locale_format = array();
+  $locale_format['language'] = $langcode;
+  $locale_format['type'] = $type;
+  $locale_format['format'] = $format;
+
+  $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE language = :langcode AND type = :type', 0, 1, array(':langcode' => $langcode, ':type' => $type))->fetchField();
+  if ($is_existing) {
+    $keys = array('type', 'language');
+    drupal_write_record('date_format_locale', $locale_format, $keys);
+  }
+  else {
+    drupal_write_record('date_format_locale', $locale_format);
+  }
 }
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index f289e04..5e3582f 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -1838,6 +1838,10 @@ function hook_theme($existing, $type, $theme, $path) {
       'render element' => 'requirements',
       'file' => 'system.admin.inc',
     ),
+    'system_date_time_settings' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
   );
 }
 
@@ -3306,6 +3310,143 @@ function hook_archiver_info_alter(&$info) {
 }
 
 /**
+ * Define additional date types.
+ *
+ * Next to the 'long', 'medium' and 'short' date types defined in core, any
+ * module can define additional types that can be used when displaying dates,
+ * by implementing this hook. A date type is basically just a name for a date
+ * format.
+ *
+ * Date types are used in the administration interface: a user can assign
+ * date format types defined in hook_date_formats() to date types defined in
+ * this hook. Once a format has been assigned by a user, the machine name of a
+ * type can be used in the format_date() function to format a date using the
+ * chosen formatting.
+ *
+ * To define a date type in a module and make sure a format has been assigned to
+ * it, without requiring a user to visit the administrative interface, use
+ * @code variable_set('date_format_' . $type, $format); @endcode
+ * where $type is the machine-readable name defined here, and $format is a PHP
+ * date format string.
+ *
+ * To avoid namespace collisions with date types defined by other modules, it is
+ * recommended that each date type starts with the module name. A date type
+ * can consist of letters, numbers and underscores.
+ *
+ * @return
+ *   An array of date types where the keys are the machine-readable names and
+ *   the values are the human-readable labels.
+ *
+ * @see hook_date_formats()
+ * @see format_date()
+ */
+function hook_date_format_types() {
+  // Define the core date format types.
+  return array(
+    'long' => t('Long'),
+    'medium' => t('Medium'),
+    'short' => t('Short'),
+  );
+}
+
+/**
+ * Modify existing date types.
+ *
+ * Allows other modules to modify existing date types like 'long'. Called by
+ * _system_date_format_types_build(). For instance, A module may use this hook
+ * to apply settings across all date types, such as locking all date types so
+ * they appear to be provided by the system.
+ *
+ * @param $types
+ *   A list of date types. Each date type is keyed by the machine-readable name
+ *   and the values are associative arrays containing:
+ *   - is_new: Set to FALSE to override previous settings.
+ *   - module: The name of the module that created the date type.
+ *   - type: The machine-readable date type name.
+ *   - title: The human-readable date type name.
+ *   - locked: Specifies that the date type is system-provided.
+ */
+function hook_date_format_types_alter(&$types) {
+  foreach ($types as $name => $type) {
+    $types[$name]['locked'] = 1;
+  }
+}
+
+/**
+ * Define additional date formats.
+ *
+ * This hook is used to define the PHP date format strings that can be assigned
+ * to date types in the administrative interface. A module can provide date
+ * format strings for the core-provided date types ('long', 'medium', and
+ * 'short'), or for date types defined in hook_date_format_types() by itself
+ * or another module.
+ *
+ * Since date formats can be locale-specific, you can specify the locales that
+ * each date format string applies to. There may be more than one locale for a
+ * format. There may also be more than one format for the same locale. For
+ * example d/m/Y and Y/m/d work equally well in some locales. You may wish to
+ * define some additional date formats that aren't specific to any one locale,
+ * for example, "Y m". For these cases, the 'locales' component of the return
+ * value should be omitted.
+ *
+ * Providing a date format here does not normally assign the format to be
+ * used with the associated date type -- a user has to choose a format for each
+ * date type in the administrative interface. There is one exception: locale
+ * initialization chooses a locale-specific format for the three core-provided
+ * types (see system_get_localized_date_format() for details). If your module
+ * needs to ensure that a date type it defines has a format associated with it,
+ * call @code variable_set('date_format_' . $type, $format); @endcode
+ * where $type is the machine-readable name defined in hook_date_format_types(),
+ * and $format is a PHP date format string.
+ *
+ * @return
+ *   A list of date formats to offer as choices in the administrative
+ *   interface. Each date format is a keyed array consisting of three elements:
+ *   - 'type': The date type name that this format can be used with, as
+ *     declared in an implementation of hook_date_format_types().
+ *   - 'format': A PHP date format string to use when formatting dates. It
+ *     can contain any of the formatting options described at
+ *     http://php.net/manual/function.date.php
+ *   - 'locales': (optional) An array of 2 and 5 character locale codes,
+ *     defining which locales this format applies to (for example, 'en',
+ *     'en-us', etc.). If your date format is not language-specific, leave this
+ *     array empty.
+ *
+ * @see hook_date_format_types()
+ */
+function hook_date_formats() {
+  return array(
+    array(
+      'type' => 'mymodule_extra_long',
+      'format' => 'l jS F Y H:i:s e',
+      'locales' => array('en-ie'),
+    ),
+    array(
+      'type' => 'mymodule_extra_long',
+      'format' => 'l jS F Y h:i:sa',
+      'locales' => array('en', 'en-us'),
+    ),
+    array(
+      'type' => 'short',
+      'format' => 'F Y',
+      'locales' => array(),
+    ),
+  );
+}
+
+/**
+ * Alter date formats declared by another module.
+ *
+ * Called by _system_date_format_types_build() to allow modules to alter the
+ * return values from implementations of hook_date_formats().
+ */
+function hook_date_formats_alter(&$formats) {
+  foreach ($formats as $id => $format) {
+    $formats[$id]['locales'][] = 'en-ca';
+  }
+}
+
+/**
  * Alters theme operation links.
  *
  * @param $theme_groups
@@ -3454,7 +3595,7 @@ function hook_tokens($type, $tokens, array $data = array(), array $options = arr
           break;
 
         case 'created':
-          $replacements[$original] = format_date($node->created, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($node->created, 'medium', '', NULL, $langcode);
           break;
       }
     }
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 24bbc9b..d7ceb4d 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -2241,22 +2241,6 @@ function system_update_8037() {
 }
 
 /**
- * Moves site system regional settings from variable to config.
- *
- * @ingroup config_upgrade
- */
-function system_update_8038() {
-  update_variables_to_config('system.date', array(
-    'site_default_country' => 'country.default',
-    'date_first_day' => 'first_day',
-    'date_default_timezone' => 'timezone.default',
-    'configurable_timezones' => 'timezone.user.configurable',
-    'empty_timezone_message' => 'timezone.user.warn',
-    'user_default_timezone' => 'timezone.user.default',
-  ));
-}
-
-/**
  * @} End of "defgroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 1850f74..e837fe9 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -188,6 +188,10 @@ function system_theme() {
     'system_compact_link' => array(
       'variables' => array(),
     ),
+    'system_date_time_settings' => array(
+      'render element' => 'form',
+      'file' => 'system.admin.inc',
+    ),
     'system_date_format_localize_form' => array(
       'render element' => 'form',
     ),
@@ -849,10 +853,48 @@ function system_menu() {
     'file' => 'system.admin.inc',
   );
   $items['admin/config/regional/date-time'] = array(
+    'title' => 'Date and time',
+    'description' => 'Configure display formats for date and time.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_date_time_settings'),
+    'access arguments' => array('administer site configuration'),
+    'weight' => -15,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types'] = array(
+    'title' => 'Types',
+    'description' => 'Configure display formats for date and time.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_date_time_settings'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_DEFAULT_LOCAL_TASK,
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types/add'] = array(
+    'title' => 'Add date type',
+    'description' => 'Add new date type.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_add_date_format_type_form'),
+    'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_ACTION,
+    'weight' => -10,
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/types/%/delete'] = array(
+    'title' => 'Delete date type',
+    'description' => 'Allow users to delete a configured date type.',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('system_delete_date_format_type_form', 5),
+    'access arguments' => array('administer site configuration'),
+    'file' => 'system.admin.inc',
+  );
+  $items['admin/config/regional/date-time/formats'] = array(
     'title' => 'Formats',
     'description' => 'Configure display format strings for date and time.',
     'page callback' => 'system_date_time_formats',
     'access arguments' => array('administer site configuration'),
+    'type' => MENU_LOCAL_TASK,
     'weight' => -9,
     'file' => 'system.admin.inc',
   );
@@ -866,7 +908,7 @@ function system_menu() {
     'weight' => -10,
     'file' => 'system.admin.inc',
   );
-  $items['admin/config/regional/date-time/formats/%system_date_format/edit'] = array(
+  $items['admin/config/regional/date-time/formats/%/edit'] = array(
     'title' => 'Edit date format',
     'description' => 'Allow users to edit a configured date format.',
     'page callback' => 'drupal_get_form',
@@ -874,7 +916,7 @@ function system_menu() {
     'access arguments' => array('administer site configuration'),
     'file' => 'system.admin.inc',
   );
-  $items['admin/config/regional/date-time/formats/%system_date_format/delete'] = array(
+  $items['admin/config/regional/date-time/formats/%/delete'] = array(
     'title' => 'Delete date format',
     'description' => 'Allow users to delete a configured date format.',
     'page callback' => 'drupal_get_form',
@@ -2274,6 +2316,24 @@ function system_filetransfer_info() {
  * Implements hook_init().
  */
 function system_init() {
+  global $conf;
+
+  $language_interface = language(LANGUAGE_TYPE_INTERFACE);
+  // For each date type (e.g. long, short), get the localized date format
+  // for the user's current language and override the default setting for it
+  // in $conf. This should happen on all pages except the date and time formats
+  // settings page, where we want to display the site default and not the
+  // localized version.
+  if (strpos(current_path(), 'admin/config/regional/date-time/formats') !== 0) {
+    $languages = array($language_interface->langcode);
+
+    // Setup appropriate date formats for this locale.
+    $formats = system_get_localized_date_format($languages);
+    foreach ($formats as $format_type => $format) {
+      $conf[$format_type] = $format;
+    }
+  }
+
   $path = drupal_get_path('module', 'system');
   // Add the CSS for this module. These aren't in system.info, because they
   // need to be in the CSS_SYSTEM group rather than the CSS_DEFAULT group.
@@ -2319,14 +2379,52 @@ function system_init() {
  *   An array of date formats.
  */
 function system_get_localized_date_format($languages) {
+  $formats = array();
+
   // Get list of different format types.
+  $format_types = system_get_date_types();
+  $short_default = variable_get('date_format_short', 'm/d/Y - H:i');
+
+  // Loop through each language until we find one with some date formats
+  // configured.
   foreach ($languages as $language) {
-    $date_formats = config('locale.config.' . $language . '.system.date')->get('formats');
+    $date_formats = system_date_format_locale($language);
     if (!empty($date_formats)) {
-      return $date_formats;
+      // We have locale-specific date formats, so check for their types. If
+      // we're missing a type, use the default setting instead.
+      foreach ($format_types as $type => $type_info) {
+        // If format exists for this language, use it.
+        if (!empty($date_formats[$type])) {
+          $formats['date_format_' . $type] = $date_formats[$type];
+        }
+        // Otherwise get default variable setting. If this is not set, default
+        // to the short format.
+        else {
+          $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
+        }
+      }
+
+      // Return on the first match.
+      return $formats;
+    }
+  }
+
+  // No locale specific formats found, so use defaults.
+  $system_types = array('short', 'medium', 'long');
+  // Handle system types separately as they have defaults if no variable exists.
+  $formats['date_format_short'] = $short_default;
+  $formats['date_format_medium'] = variable_get('date_format_medium', 'D, m/d/Y - H:i');
+  $formats['date_format_long'] = variable_get('date_format_long', 'l, F j, Y - H:i');
+
+  // For non-system types, get the default setting, otherwise use the short
+  // format.
+  foreach ($format_types as $type => $type_info) {
+    if (!in_array($type, $system_types)) {
+      $formats['date_format_' . $type] = variable_get('date_format_' . $type, $short_default);
     }
   }
-  return array();
+
+  return $formats;
 }
 
 /**
@@ -2364,7 +2462,7 @@ function system_custom_theme() {
  * Implements hook_form_FORM_ID_alter().
  */
 function system_form_user_profile_form_alter(&$form, &$form_state) {
-  if (config('system.date')->get('timezone.user.configurable')) {
+  if (variable_get('configurable_timezones', 1)) {
     system_user_timezone($form, $form_state);
   }
   return $form;
@@ -2374,8 +2472,7 @@ function system_form_user_profile_form_alter(&$form, &$form_state) {
  * Implements hook_form_FORM_ID_alter().
  */
 function system_form_user_register_form_alter(&$form, &$form_state) {
-  $config = config('system.date');
-  if ($config->get('timezone.user.configurable') && $config->get('timezone.user.default') == DRUPAL_USER_TIMEZONE_SELECT) {
+  if (variable_get('configurable_timezones', 1) && variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT) == DRUPAL_USER_TIMEZONE_SELECT) {
     system_user_timezone($form, $form_state);
     return $form;
   }
@@ -2385,9 +2482,8 @@ function system_form_user_register_form_alter(&$form, &$form_state) {
  * Implements hook_user_presave().
  */
 function system_user_presave($account) {
-  $config = config('system.date');
-  if ($config->get('timezone.user.configurable') && empty($account->timezone) && !$config->get('timezone.user.default')) {
-    $account->timezone = $config->get('timezone.default');
+  if (variable_get('configurable_timezones', 1) && empty($account->timezone) && !variable_get('user_default_timezone', DRUPAL_USER_TIMEZONE_DEFAULT)) {
+    $account->timezone = variable_get('date_default_timezone', '');
   }
 }
 
@@ -2395,9 +2491,8 @@ function system_user_presave($account) {
  * Implements hook_user_login().
  */
 function system_user_login($edit, $account) {
-  $config = config('system.date');
   // If the user has a NULL time zone, notify them to set a time zone.
-  if (!$account->timezone && $config->get('timezone.user.configurable') && $config->get('timezone.user.warn')) {
+  if (!$account->timezone && variable_get('configurable_timezones', 1) && variable_get('empty_timezone_message', 0)) {
     drupal_set_message(t('Configure your <a href="@user-edit">account time zone setting</a>.', array('@user-edit' => url("user/$account->uid/edit", array('query' => drupal_get_destination(), 'fragment' => 'edit-timezone')))));
   }
 }
@@ -2418,7 +2513,7 @@ function system_user_timezone(&$form, &$form_state) {
   $form['timezone']['timezone'] = array(
     '#type' => 'select',
     '#title' => t('Time zone'),
-    '#default_value' => isset($account->timezone) ? $account->timezone : ($account->uid == $user->uid ? config('system.date')->get('timezone.default') : ''),
+    '#default_value' => isset($account->timezone) ? $account->timezone : ($account->uid == $user->uid ? variable_get('date_default_timezone', '') : ''),
     '#options' => system_time_zones($account->uid != $user->uid),
     '#description' => t('Select the desired local time and time zone. Dates and times throughout this site will be displayed using this time zone.'),
   );
@@ -2694,10 +2789,10 @@ function system_get_module_info($property) {
  */
 function _system_rebuild_module_data() {
   // Find modules
-  $modules = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules', 'name', 0);
+  $modules = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.module$/', 'modules');
 
   // Find installation profiles.
-  $profiles = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.profile$/', 'profiles', 'name', 0);
+  $profiles = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.profile$/', 'profiles');
 
   // Include the installation profile in modules that are loaded.
   $profile = drupal_get_profile();
@@ -3073,7 +3168,7 @@ function system_system_info_alter(&$info, $file, $type) {
 }
 
 /**
- * Gets the name of the default region for a given theme.
+ * Get the name of the default region for a given theme.
  *
  * @param $theme
  *   The name of a theme.
@@ -3447,6 +3542,14 @@ function system_cache_flush() {
 }
 
 /**
+ * Implements hook_rebuild().
+ */
+function system_rebuild() {
+  // Rebuild list of date formats.
+  system_date_formats_rebuild();
+}
+
+/**
  * Implements hook_mail().
  */
 function system_mail($key, &$message, $params) {
@@ -3473,7 +3576,7 @@ function system_time_zones($blank = NULL) {
     // reasons and should not be used, the list is filtered by a regular
     // expression.
     if (preg_match('!^((Africa|America|Antarctica|Arctic|Asia|Atlantic|Australia|Europe|Indian|Pacific)/|UTC$)!', $zone)) {
-      $zones[$zone] = t('@zone: @date', array('@zone' => t(str_replace('_', ' ', $zone)), '@date' => format_date(REQUEST_TIME, 'custom', config('system.date')->get('formats.system_long.pattern.php') . ' O', $zone)));
+      $zones[$zone] = t('@zone: @date', array('@zone' => t(str_replace('_', ' ', $zone)), '@date' => format_date(REQUEST_TIME, 'custom', variable_get('date_format_long', 'l, F j, Y - H:i') . ' O', $zone)));
     }
   }
   // Sort the translated time zones alphabetically.
@@ -3618,72 +3721,159 @@ function system_run_automated_cron() {
 }
 
 /**
- * Gets the list of defined date formats and attributes.
+ * Gets the list of available date types and attributes.
  *
- * @param $date_format_id
+ * @param $type
  *   (optional) The date type name.
  *
  * @return
- *   An associative array of date formats. The top-level keys are the
- *   machine-readable names of the date formats. The values are associative
- *   arrays with the following keys:
- *   - name: The string human readable name of the date format.
- *   - pattern: An associative array of patterns that will modify the format
- *     of the date, keyed with 'php' for normal PHP date pattern and 'intl'
- *     for the alternate pattern used by the IntlDateFormatter.
+ *   An associative array of date type information keyed by the date type name.
+ *   Each date type information array has the following elements:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this date type in its
+ *     hook_date_format_types(). An empty string if the date type was
+ *     user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ *   If $type was defined, only a single associative array with the above
+ *   elements is returned.
+ */
+function system_get_date_types($type = NULL) {
+  $types = &drupal_static(__FUNCTION__);
+
+  if (!isset($types)) {
+    $types = _system_date_format_types_build();
+  }
+
+  return $type ? (isset($types[$type]) ? $types[$type] : FALSE) : $types;
+}
+
+/**
+ * Implements hook_date_format_types().
+ */
+function system_date_format_types() {
+  return array(
+    'long' => t('Long'),
+    'medium' => t('Medium'),
+    'short' => t('Short'),
+  );
+}
+
+/**
+ * Implements hook_date_formats().
+ */
+function system_date_formats() {
+  include_once DRUPAL_ROOT . '/core/includes/date.inc';
+  return system_default_date_formats();
+}
+
+/**
+ * Gets the list of defined date formats and attributes.
+ *
+ * @param $type
+ *   (optional) The date type name.
  *
- *   If $date_format_id was defined, only the date formats associated with the
- *   given machine name are returned, in an associative array keyed by format
- *   string.
+ * @return
+ *   An associative array of date formats. The top-level keys are the names of
+ *   the date types that the date formats belong to. The values are in turn
+ *   associative arrays keyed by the format string, with the following keys:
+ *   - dfid: The date format ID.
+ *   - format: The format string.
+ *   - type: The machine-readable name of the date type.
+ *   - locales: An array of language codes. This can include both 2 character
+ *     language codes like 'en and 'fr' and 5 character language codes like
+ *     'en-gb' and 'en-us'.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this date format in its
+ *     hook_date_formats(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ *   If $type was defined, only the date formats associated with the given date
+ *   type are returned, in a single associative array keyed by format string.
  */
-function system_get_date_formats($date_format_id = NULL) {
-  $date_formats = config('system.date')->get('formats');
+function system_get_date_formats($type = NULL) {
+  $date_formats = &drupal_static(__FUNCTION__);
 
-  // Return either the specific format or all formats.
-  return empty($date_format_id) ? $date_formats : $date_formats[$date_format_id];
+  if (!isset($date_formats)) {
+    $date_formats = _system_date_formats_build();
+  }
+
+  return $type ? (isset($date_formats[$type]) ? $date_formats[$type] : FALSE) : $date_formats;
 }
 
 /**
- * Menu loader function for a date format.
+ * Gets the format details for a particular format ID.
  *
- * @param $date_format_id
- *   The date type name.
+ * @param $dfid
+ *   A date format ID.
  *
  * @return
- *   The date format id if it exists and is not locked, FALSE otherwise.
+ *   A date format object with the following properties:
+ *   - dfid: The date format ID.
+ *   - format: The date format string.
+ *   - type: The name of the date type.
+ *   - locked: Whether the date format can be changed or not.
+ */
+function system_get_date_format($dfid) {
+  return db_query('SELECT df.dfid, df.format, df.type, df.locked FROM {date_formats} df WHERE df.dfid = :dfid', array(':dfid' => $dfid))->fetch();
+}
+
+/**
+ * Resets the database cache of date formats and saves all new date formats.
  */
-function system_date_format_load($date_format_id) {
-  if (($format = system_get_date_formats($date_format_id)) && empty($format['locked'])) {
-    return $date_format_id;
+function system_date_formats_rebuild() {
+  drupal_static_reset('system_get_date_formats');
+  $date_formats = system_get_date_formats(NULL);
+
+  foreach ($date_formats as $type => $formats) {
+    foreach ($formats as $format => $info) {
+      system_date_format_save($info);
+    }
   }
-  return FALSE;
+
+  // Rebuild configured date formats locale list.
+  drupal_static_reset('system_date_format_locale');
+  system_date_format_locale();
+
+  _system_date_formats_build();
 }
 
 /**
  * Gets the appropriate date format string for a date type and locale.
  *
  * @param $langcode
- *   (optional) String language code for the current locale. This can be a 2 character
+ *   (optional) Language code for the current locale. This can be a 2 character
  *   language code like 'en' and 'fr' or a 5 character language code like
  *   'en-gb' and 'en-us'.
- * @param $date_format_id
- *   (optional) String machine name for the date format.
+ * @param $type
+ *   (optional) The date type name.
  *
  * @return
- *   If $date_format_id and $langcode are specified, returns the corresponding
- *   date format string. If only $langcode is specified, returns an array of
- *   all date format strings for that locale, keyed by the date type. If
- *   neither is specified returns FALSE.
+ *   If $type and $langcode are specified, returns the corresponding date format
+ *   string. If only $langcode is specified, returns an array of all date
+ *   format strings for that locale, keyed by the date type. If neither is
+ *   specified, or if no matching formats are found, returns FALSE.
  */
-function system_date_format_locale($langcode = NULL, $date_format_id = NULL) {
+function system_date_format_locale($langcode = NULL, $type = NULL) {
   $formats = &drupal_static(__FUNCTION__);
 
-  if (!isset($formats[$langcode])) {
-    $formats[$langcode] = config('locale.config.' . $langcode . '.system.date')->get('formats');
+  if (empty($formats)) {
+    $formats = array();
+    $result = db_query("SELECT format, type, language FROM {date_format_locale}");
+    foreach ($result as $record) {
+      if (!isset($formats[$record->language])) {
+        $formats[$record->language] = array();
+      }
+      $formats[$record->language][$record->type] = $record->format;
+    }
   }
 
-  if ($date_format_id && $langcode && !empty($formats[$langcode][$date_format_id])) {
-    return $formats[$langcode][$date_format_id];
+  if ($type && $langcode && !empty($formats[$langcode][$type])) {
+    return $formats[$langcode][$type];
   }
   elseif ($langcode && !empty($formats[$langcode])) {
     return $formats[$langcode];
@@ -3693,40 +3883,244 @@ function system_date_format_locale($langcode = NULL, $date_format_id = NULL) {
 }
 
 /**
+ * Builds and returns information about available date types.
+ *
+ * @return
+ *   An associative array of date type information keyed by name. Each date type
+ *   information array has the following elements:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this format in its
+ *     hook_date_format_types(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function _system_date_format_types_build() {
+  $types = array();
+
+  // Get list of modules that implement hook_date_format_types().
+  $modules = module_implements('date_format_types');
+
+  foreach ($modules as $module) {
+    $module_types = module_invoke($module, 'date_format_types');
+    foreach ($module_types as $module_type => $type_title) {
+      $type = array();
+      $type['module'] = $module;
+      $type['type'] = $module_type;
+      $type['title'] = $type_title;
+      $type['locked'] = 1;
+      // Will be over-ridden later if in the db.
+      $type['is_new'] = TRUE;
+      $types[$module_type] = $type;
+    }
+  }
+
+  // Get custom formats added to the database by the end user.
+  $result = db_query('SELECT dft.type, dft.title, dft.locked FROM {date_format_type} dft ORDER BY dft.title');
+  foreach ($result as $record) {
+    if (!isset($types[$record->type])) {
+      $type = array();
+      $type['is_new'] = FALSE;
+      $type['module'] = '';
+      $type['type'] = $record->type;
+      $type['title'] = $record->title;
+      $type['locked'] = $record->locked;
+      $types[$record->type] = $type;
+    }
+    else {
+      $type = array();
+      $type['is_new'] = FALSE;  // Over-riding previous setting.
+      $types[$record->type] = array_merge($types[$record->type], $type);
+    }
+  }
+
+  // Allow other modules to modify these date types.
+  drupal_alter('date_format_types', $types);
+
+  return $types;
+}
+
+/**
+ * Builds and returns information about available date formats.
+ *
+ * @return
+ *   An associative array of date formats. The top-level keys are the names of
+ *   the date types that the date formats belong to. The values are in turn
+ *   associative arrays keyed by format with the following keys:
+ *   - dfid: The date format ID.
+ *   - format: The PHP date format string.
+ *   - type: The machine-readable name of the date type the format belongs to.
+ *   - locales: An array of language codes. This can include both 2 character
+ *     language codes like 'en and 'fr' and 5 character language codes like
+ *     'en-gb' and 'en-us'.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - module: The name of the module that defined this format in its
+ *     hook_date_formats(). An empty string if the format was user-defined.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function _system_date_formats_build() {
+  $date_formats = array();
+
+  // First handle hook_date_format_types().
+  $types = _system_date_format_types_build();
+  foreach ($types as $type => $info) {
+    system_date_format_type_save($info);
+  }
+
+  // Get formats supplied by various contrib modules.
+  $module_formats = module_invoke_all('date_formats');
+
+  foreach ($module_formats as $module_format) {
+    // System types are locked.
+    $module_format['locked'] = 1;
+    // If no date type is specified, assign 'custom'.
+    if (!isset($module_format['type'])) {
+      $module_format['type'] = 'custom';
+    }
+    if (!in_array($module_format['type'], array_keys($types))) {
+      continue;
+    }
+    if (!isset($date_formats[$module_format['type']])) {
+      $date_formats[$module_format['type']] = array();
+    }
+
+    // If another module already set this format, merge in the new settings.
+    if (isset($date_formats[$module_format['type']][$module_format['format']])) {
+      $date_formats[$module_format['type']][$module_format['format']] = array_merge_recursive($date_formats[$module_format['type']][$module_format['format']], $module_format);
+    }
+    else {
+      // This setting will be overridden later if it already exists in the db.
+      $module_format['is_new'] = TRUE;
+      $date_formats[$module_format['type']][$module_format['format']] = $module_format;
+    }
+  }
+
+  // Get custom formats added to the database by the end user.
+  $result = db_query('SELECT df.dfid, df.format, df.type, df.locked, dfl.language FROM {date_formats} df LEFT JOIN {date_format_locale} dfl ON df.format = dfl.format AND df.type = dfl.type ORDER BY df.type, df.format');
+  foreach ($result as $record) {
+    // If this date type isn't set, initialise the array.
+    if (!isset($date_formats[$record->type])) {
+      $date_formats[$record->type] = array();
+    }
+    $format = (array) $record;
+    $format['is_new'] = FALSE; // It's in the db, so override this setting.
+    // If this format not already present, add it to the array.
+    if (!isset($date_formats[$record->type][$record->format])) {
+      $format['module'] = '';
+      $format['locales'] = array($record->language);
+      $date_formats[$record->type][$record->format] = $format;
+    }
+    // Format already present, so merge in settings.
+    else {
+      if (!empty($record->language)) {
+        $format['locales'] = array_merge($date_formats[$record->type][$record->format]['locales'], array($record->language));
+      }
+      $date_formats[$record->type][$record->format] = array_merge($date_formats[$record->type][$record->format], $format);
+    }
+  }
+
+  // Allow other modules to modify these formats.
+  drupal_alter('date_formats', $date_formats);
+
+  return $date_formats;
+}
+
+/**
+ * Saves a date type to the database.
+ *
+ * @param $type
+ *   A date type array containing the following keys:
+ *   - type: The machine-readable name of the date type.
+ *   - title: The human-readable name of the date type.
+ *   - locked: A boolean indicating whether or not this date type should be
+ *     configurable from the user interface.
+ *   - is_new: A boolean indicating whether or not this date type is as of yet
+ *     unsaved in the database.
+ */
+function system_date_format_type_save($type) {
+  $info = array();
+  $info['type'] = $type['type'];
+  $info['title'] = $type['title'];
+  $info['locked'] = $type['locked'];
+
+  // Update date_format table.
+  if (!empty($type['is_new'])) {
+    drupal_write_record('date_format_type', $info);
+  }
+  else {
+    drupal_write_record('date_format_type', $info, 'type');
+  }
+}
+
+/**
+ * Deletes a date type from the database.
+ *
+ * @param $type
+ *   The machine-readable name of the date type.
+ */
+function system_date_format_type_delete($type) {
+  db_delete('date_formats')
+    ->condition('type', $type)
+    ->execute();
+  db_delete('date_format_type')
+    ->condition('type', $type)
+    ->execute();
+  db_delete('date_format_locale')
+    ->condition('type', $type)
+    ->execute();
+}
+
+/**
  * Saves a date format to the database.
  *
- * @param string $date_format_id
- *   If set, replace the existing date format having this ID with the
- *   information specified in $format_info.
- * @param array $format_info
+ * @param $date_format
  *   A date format array containing the following keys:
- *   - name: The string name of the date type this format is associated with.
- *   - pattern: An associative array keyed by 'php' and 'intl' with the PHP
- *     and/or IntlDateFormatter date format strings for each.
+ *   - type: The name of the date type this format is associated with.
+ *   - format: The PHP date format string.
  *   - locked: A boolean indicating whether or not this format should be
  *     configurable from the user interface.
+ * @param $dfid
+ *   If set, replace the existing date format having this ID with the
+ *   information specified in $date_format.
  *
+ * @see system_get_date_types()
  * @see http://php.net/date
  */
-function system_date_format_save($date_format_id, $format_info) {
-  config('system.date')
-    ->set('formats.' . $date_format_id, $format_info)
-    ->save();
+function system_date_format_save($date_format, $dfid = 0) {
+  $info = array();
+  $info['dfid'] = $dfid;
+  $info['type'] = $date_format['type'];
+  $info['format'] = $date_format['format'];
+  $info['locked'] = $date_format['locked'];
+
+  // Update date_format table.
+  if (!empty($date_format['is_new'])) {
+    drupal_write_record('date_formats', $info);
+  }
+  else {
+    $keys = ($dfid ? array('dfid') : array('format', 'type'));
+    drupal_write_record('date_formats', $info, $keys);
+  }
 
   $languages = language_list();
 
-  $locale_format = array(
-    'name' => $format_info['name'],
-    'pattern' => $format_info['pattern'],
-  );
+  $locale_format = array();
+  $locale_format['type'] = $date_format['type'];
+  $locale_format['format'] = $date_format['format'];
 
   // Check if the suggested language codes are configured.
-  if (!empty($format_info['locales'])) {
-    foreach ($format_info['locales'] as $langcode) {
+  if (!empty($date_format['locales'])) {
+    foreach ($date_format['locales'] as $langcode) {
       if (isset($languages[$langcode])) {
-        config('locale.config.' . $langcode . '.system.date')
-          ->set('formats.' . $date_format_id, $locale_format)
-          ->save();
+        $is_existing = (bool) db_query_range('SELECT 1 FROM {date_format_locale} WHERE type = :type AND language = :language', 0, 1, array(':type' => $date_format['type'], ':language' => $langcode))->fetchField();
+        if (!$is_existing) {
+          $locale_format['language'] = $langcode;
+          drupal_write_record('date_format_locale', $locale_format);
+        }
       }
     }
   }
@@ -3735,20 +4129,13 @@ function system_date_format_save($date_format_id, $format_info) {
 /**
  * Deletes a date format from the database.
  *
- * @param $date_format_id
+ * @param $dfid
  *   The date format ID.
  */
-function system_date_format_delete($date_format_id) {
-  $format_id = 'formats.' . $date_format_id;
-  config('system.date')->clear($format_id)->save();
-
-  // Clean up the localized entry if required.
-  foreach (language_list() as $langcode => $data) {
-    $config = config('locale.config.' . $langcode . '.system.date');
-    if ($config->get($format_id)) {
-      $config->clear($format_id)->save();
-    }
-  }
+function system_date_format_delete($dfid) {
+  db_delete('date_formats')
+    ->condition('dfid', $dfid)
+    ->execute();
 }
 
 /**
diff --git a/core/modules/system/system.tokens.inc b/core/modules/system/system.tokens.inc
index 12876a8..a5e7ad2 100644
--- a/core/modules/system/system.tokens.inc
+++ b/core/modules/system/system.tokens.inc
@@ -55,15 +55,15 @@ function system_token_info() {
   // Date related tokens.
   $date['short'] = array(
     'name' => t("Short format"),
-    'description' => t("A date in 'short' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'system_short'))),
+    'description' => t("A date in 'short' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'short'))),
   );
   $date['medium'] = array(
     'name' => t("Medium format"),
-    'description' => t("A date in 'medium' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'system_medium'))),
+    'description' => t("A date in 'medium' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'medium'))),
   );
   $date['long'] = array(
     'name' => t("Long format"),
-    'description' => t("A date in 'long' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'system_long'))),
+    'description' => t("A date in 'long' format. (%date)", array('%date' => format_date(REQUEST_TIME, 'long'))),
   );
   $date['custom'] = array(
     'name' => t("Custom format"),
@@ -184,15 +184,15 @@ function system_tokens($type, $tokens, array $data = array(), array $options = a
     foreach ($tokens as $name => $original) {
       switch ($name) {
         case 'short':
-          $replacements[$original] = format_date($date, 'system_short', '', NULL, $langcode);
+          $replacements[$original] = format_date($date, 'short', '', NULL, $langcode);
           break;
 
         case 'medium':
-          $replacements[$original] = format_date($date, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($date, 'medium', '', NULL, $langcode);
           break;
 
         case 'long':
-          $replacements[$original] = format_date($date, 'system_long', '', NULL, $langcode);
+          $replacements[$original] = format_date($date, 'long', '', NULL, $langcode);
           break;
 
         case 'since':
@@ -245,7 +245,7 @@ function system_tokens($type, $tokens, array $data = array(), array $options = a
 
         // These tokens are default variations on the chained tokens handled below.
         case 'timestamp':
-          $replacements[$original] = format_date($file->timestamp, 'system_medium', '', NULL, $langcode);
+          $replacements[$original] = format_date($file->timestamp, 'medium', '', NULL, $langcode);
           break;
 
         case 'owner':
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
index 0b96373..943d185 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserRegistrationTest.php
@@ -149,18 +149,17 @@ function testRegistrationEmailDuplicates() {
   }
 
   function testRegistrationDefaultValues() {
+    $config = config('user.settings');
     // Don't require e-mail verification and allow registration by site visitors
     // without administrator approval.
-    $config_user_settings = config('user.settings')
+    $config
       ->set('verify_mail', FALSE)
       ->set('register', USER_REGISTER_VISITORS)
       ->save();
 
     // Set the default timezone to Brussels.
-    $config_system_date = config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('timezone.default', 'Europe/Brussels')
-      ->save();
+    variable_set('configurable_timezones', 1);
+    variable_set('date_default_timezone', 'Europe/Brussels');
 
     // Check that the account information options are not displayed
     // as a details element if there is not more than one details in the form.
@@ -182,8 +181,8 @@ function testRegistrationDefaultValues() {
     $this->assertEqual($new_user->theme, '', 'Correct theme field.');
     $this->assertEqual($new_user->signature, '', 'Correct signature field.');
     $this->assertTrue(($new_user->created > REQUEST_TIME - 20 ), 'Correct creation time.');
-    $this->assertEqual($new_user->status, $config_user_settings->get('register') == USER_REGISTER_VISITORS ? 1 : 0, 'Correct status field.');
-    $this->assertEqual($new_user->timezone, $config_system_date->get('timezone.default'), 'Correct time zone field.');
+    $this->assertEqual($new_user->status, $config->get('register') == USER_REGISTER_VISITORS ? 1 : 0, 'Correct status field.');
+    $this->assertEqual($new_user->timezone, variable_get('date_default_timezone'), 'Correct time zone field.');
     $this->assertEqual($new_user->langcode, language_default()->langcode, 'Correct language field.');
     $this->assertEqual($new_user->preferred_langcode, language_default()->langcode, 'Correct preferred language field.');
     $this->assertEqual($new_user->init, $mail, 'Correct init field.');
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserTimeZoneTest.php b/core/modules/user/lib/Drupal/user/Tests/UserTimeZoneTest.php
index ba170b8..f692706 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserTimeZoneTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserTimeZoneTest.php
@@ -26,11 +26,9 @@ public static function getInfo() {
    */
   function testUserTimeZone() {
     // Setup date/time settings for Los Angeles time.
-    $config = config('system.date')
-      ->set('timezone.user.configurable', 1)
-      ->set('timezone.default', 'America/Los_Angeles')
-      ->set('formats.system_medium.pattern.php', 'Y-m-d H:i T')
-      ->save();
+    variable_set('date_default_timezone', 'America/Los_Angeles');
+    variable_set('configurable_timezones', 1);
+    variable_set('date_format_medium', 'Y-m-d H:i T');
 
     // Create a user account and login.
     $web_user = $this->drupalCreateUser();
diff --git a/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php b/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
index 87f9959..d14e826 100644
--- a/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
+++ b/core/modules/user/lib/Drupal/user/Tests/UserTokenReplaceTest.php
@@ -65,10 +65,10 @@ function testUserTokenReplacement() {
     $tests['[user:mail]'] = check_plain($account->mail);
     $tests['[user:url]'] = url("user/$account->uid", $url_options);
     $tests['[user:edit-url]'] = url("user/$account->uid/edit", $url_options);
-    $tests['[user:last-login]'] = format_date($account->login, 'system_medium', '', NULL, $language_interface->langcode);
-    $tests['[user:last-login:short]'] = format_date($account->login, 'system_short', '', NULL, $language_interface->langcode);
-    $tests['[user:created]'] = format_date($account->created, 'system_medium', '', NULL, $language_interface->langcode);
-    $tests['[user:created:short]'] = format_date($account->created, 'system_short', '', NULL, $language_interface->langcode);
+    $tests['[user:last-login]'] = format_date($account->login, 'medium', '', NULL, $language_interface->langcode);
+    $tests['[user:last-login:short]'] = format_date($account->login, 'short', '', NULL, $language_interface->langcode);
+    $tests['[user:created]'] = format_date($account->created, 'medium', '', NULL, $language_interface->langcode);
+    $tests['[user:created:short]'] = format_date($account->created, 'short', '', NULL, $language_interface->langcode);
     $tests['[current-user:name]'] = check_plain(user_format_name($global_account));
 
     // Test to make sure that we generated something for each token.
diff --git a/core/modules/user/user.api.php b/core/modules/user/user.api.php
index 553f51d..cb7b4e5 100644
--- a/core/modules/user/user.api.php
+++ b/core/modules/user/user.api.php
@@ -310,10 +310,9 @@ function hook_user_update($account) {
  * @param $account
  *   The user object on which the operation was just performed.
  */
-function hook_user_login(&$edit, $account) {
-  $config = config('system.date');
+function hook_user_login($edit, $account) {
   // If the user has a NULL time zone, notify them to set a time zone.
-  if (!$account->timezone && $config->get('timezone.user.configurable') && $config->get('timezone.user.warn')) {
+  if (!$account->timezone && variable_get('configurable_timezones', 1) && variable_get('empty_timezone_message', 0)) {
     drupal_set_message(t('Configure your <a href="@user-edit">account time zone setting</a>.', array('@user-edit' => url("user/$account->uid/edit", array('query' => drupal_get_destination(), 'fragment' => 'edit-timezone')))));
   }
 }
diff --git a/core/modules/user/user.tokens.inc b/core/modules/user/user.tokens.inc
index 30d984b..bc37434 100644
--- a/core/modules/user/user.tokens.inc
+++ b/core/modules/user/user.tokens.inc
@@ -103,12 +103,12 @@ function user_tokens($type, $tokens, array $data = array(), array $options = arr
 
         // These tokens are default variations on the chained tokens handled below.
         case 'last-login':
-          $replacements[$original] = !empty($account->login) ? format_date($account->login, 'system_medium', '', NULL, $langcode) : t('never');
+          $replacements[$original] = !empty($account->login) ? format_date($account->login, 'medium', '', NULL, $langcode) : t('never');
           break;
 
         case 'created':
           // In the case of user_presave the created date may not yet be set.
-          $replacements[$original] = !empty($account->created) ? format_date($account->created, 'system_medium', '', NULL, $langcode) : t('not yet created');
+          $replacements[$original] = !empty($account->created) ? format_date($account->created, 'medium', '', NULL, $langcode) : t('not yet created');
           break;
       }
     }
diff --git a/core/modules/views/config/views.view.glossary.yml b/core/modules/views/config/views.view.glossary.yml
index 4d0d274..966da7c 100644
--- a/core/modules/views/config/views.view.glossary.yml
+++ b/core/modules/views/config/views.view.glossary.yml
@@ -47,7 +47,7 @@ display:
           table: node
           field: changed
           label: 'Last update'
-          date_format: system_long
+          date_format: large
       arguments:
         title:
           id: title
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
index ef039c8..66869d3 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/HandlerBase.php
@@ -742,7 +742,13 @@ public function getSQLDateField() {
    * Figure out what timezone we're in; needed for some date manipulations.
    */
   public static function getTimezone() {
-    $timezone = drupal_get_user_timezone();
+    global $user;
+    if (variable_get('configurable_timezones', 1) && $user->uid && strlen($user->timezone)) {
+      $timezone = $user->timezone;
+    }
+    else {
+      $timezone = variable_get('date_default_timezone', 0);
+    }
 
     // set up the database timezone
     $db_type = Database::getConnection()->databaseType();
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/field/Date.php b/core/modules/views/lib/Drupal/views/Plugin/views/field/Date.php
index e898593..dd5f2fa 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/field/Date.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/field/Date.php
@@ -33,9 +33,9 @@ protected function defineOptions() {
   public function buildOptionsForm(&$form, &$form_state) {
 
     $date_formats = array();
-    $date_types = system_get_date_formats();
-    foreach ($date_types as $machine_name => $value) {
-      $date_formats[$machine_name] = check_plain(t('@name format', array('@name' => $value['name'])) . ': ' . format_date(REQUEST_TIME, $machine_name));
+    $date_types = system_get_date_types();
+    foreach ($date_types as $key => $value) {
+      $date_formats[$value['type']] = check_plain(t($value['title'] . ' format')) . ': ' . format_date(REQUEST_TIME, $value['type']);
     }
 
     $form['date_format'] = array(
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
index f7f1a10..6040d40 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/FieldDateTest.php
@@ -56,9 +56,9 @@ public function testFieldDate() {
     );
     foreach ($timezones as $timezone) {
       $dates = array(
-        'small' => format_date($time, 'system_small', '', $timezone),
-        'medium' => format_date($time, 'system_medium', '', $timezone),
-        'large' => format_date($time, 'system_large', '', $timezone),
+        'small' => format_date($time, 'small', '', $timezone),
+        'medium' => format_date($time, 'medium', '', $timezone),
+        'large' => format_date($time, 'large', '', $timezone),
         'custom' => format_date($time, 'custom', 'c', $timezone),
       );
       $this->assertRenderedDatesEqual($view, $dates, $timezone);
