diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 2278112..aa84529 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -1537,8 +1537,6 @@ function install_configure_form($form, &$form_state, &$install_state) {
   // We add these strings as settings because JavaScript translation does not
   // work on install time.
   drupal_add_js(array('copyFieldValue' => array('edit-site-mail' => array('edit-account-mail'))), 'setting');
-  // Add JS to show / hide the 'Email administrator about site updates' elements
-  drupal_add_js('jQuery(function () { Drupal.hideEmailAdministratorCheckbox() });', 'inline');
 
   // Cache a fully-built schema. This is necessary for any invocation of
   // index.php because: (1) setting cache table entries requires schema
@@ -1855,6 +1853,13 @@ function _install_configure_form($form, &$form_state, &$install_state) {
     '#description' => st('The system will notify you when updates and important security releases are available for installed components. Anonymous information about your site is sent to <a href="@drupal">Drupal.org</a>.', array('@drupal' => 'http://drupal.org')),
     '#weight' => 15,
   );
+  $form['update_notifications']['update_status_module'][2] = array(
+    '#states' => array(
+      'visible' => array(
+        'input[name="update_status_module[1]"]' => array('checked' => TRUE),
+      ),
+    ),
+  );
 
   $form['actions'] = array('#type' => 'actions');
   $form['actions']['submit'] = array(
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 2bf4343..95ce125 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -1755,8 +1755,11 @@ function system_performance_settings($form, &$form_state) {
     '#type' => 'checkbox',
     '#title' => t('Compress cached pages.'),
     '#default_value' => $config->get('response.gzip'),
-    '#prefix' => '<div id="page-compression-wrapper"' . $js_hide . '>',
-    '#suffix' => '</div>',
+    '#states' => array(
+      'visible' => array(
+        'input[name="cache"]' => array('checked' => TRUE),
+      ),
+    ),
   );
   $form['bandwidth_optimization']['preprocess_css'] = array(
     '#type' => 'checkbox',
@@ -2239,14 +2242,6 @@ function system_add_date_format_type_form_submit($form, &$form_state) {
 }
 
 /**
- * Return the date for a given format string via Ajax.
- */
-function system_date_time_lookup() {
-  $result = format_date(REQUEST_TIME, 'custom', $_GET['format']);
-  return new JsonResponse($result);
-}
-
-/**
  * Form builder; Configure the site's maintenance status.
  *
  * @ingroup forms
@@ -2860,18 +2855,6 @@ function system_date_time_formats() {
  * Allow users to add additional date formats.
  */
 function system_configure_date_formats_form($form, &$form_state, $dfid = 0) {
-  $js_settings = array(
-    'type' => 'setting',
-    'data' => array(
-      'dateTime' => array(
-        'date-format' => array(
-          'text' => t('Displayed as'),
-          'lookup' => url('admin/config/regional/date-time/formats/lookup'),
-        ),
-      ),
-    ),
-  );
-
   if ($dfid) {
     $form['dfid'] = array(
       '#type' => 'value',
@@ -2889,9 +2872,11 @@ function system_configure_date_formats_form($form, &$form_state, $dfid = 0) {
     '#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>',
-    '#attached' => array(
+    '#ajax' => array(
+      'callback' => 'system_date_time_lookup',
+      'event' => 'keyup',
       'library' => array(array('system', 'drupal.system')),
-      'js' => array($js_settings),
+      'progress' => array('type' => 'throbber', 'message' => NULL),
     ),
     '#required' => TRUE,
   );
@@ -2909,6 +2894,21 @@ function system_configure_date_formats_form($form, &$form_state, $dfid = 0) {
 }
 
 /**
+ * Ajax callback; Returns the date for a given format string.
+ */
+function system_date_time_lookup($form, &$form_state) {
+  $format = '';
+  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
+  // breaks the layout.
+  $commands[] = ajax_command_replace('#edit-date-format-suffix', '<small id="edit-date-format-suffix">' . $format . '</small>');
+  return array('#type' => 'ajax', '#commands' => $commands);
+}
+
+/**
  * Validate new date format string submission.
  */
 function system_add_date_formats_form_validate($form, &$form_state) {
diff --git a/core/modules/system/system.js b/core/modules/system/system.js
index 66fd4f5..e26541d 100644
--- a/core/modules/system/system.js
+++ b/core/modules/system/system.js
@@ -2,24 +2,34 @@
 
 "use strict";
 
+// Cache IDs in an array for ease of use.
+var ids = [];
+
 /**
- * Show/hide the 'Email site administrator when updates are available' checkbox
- * on the install page.
+ * Event handler that fill the target element with the specified value.
+ *
+ * @param e
+ *   Event object.
+ * @param value
+ *   Custom value from jQuery trigger.
  */
-Drupal.hideEmailAdministratorCheckbox = function () {
-  // Make sure the secondary box is shown / hidden as necessary on page load.
-  if ($('#edit-update-status-module-1').is(':checked')) {
-    $('.form-item-update-status-module-2').show();
-  }
-  else {
-    $('.form-item-update-status-module-2').hide();
+function valueTargetCopyHandler(e, value) {
+  var $target = $(e.target);
+  if ($target.val() === '') {
+    $target.val(value);
   }
+}
 
-  // Toggle the display as necessary when the checkbox is clicked.
-  $('#edit-update-status-module-1').change( function () {
-    $('.form-item-update-status-module-2').toggle();
-  });
-};
+/**
+ * Handler for a Blur event on a source field.
+ *
+ * This event handler will trigger a 'value:copy' event on all dependant fields.
+ */
+function valueSourceBlurHandler(e) {
+  var value = $(e.target).val();
+  var targetIds = Drupal.settings.copyFieldValue[e.target.id];
+  $('#' + targetIds.join(', #')).trigger('value:copy', value);
+}
 
 /**
  * When a field is filled out, apply its value to other fields that will likely
@@ -28,66 +38,27 @@ Drupal.hideEmailAdministratorCheckbox = function () {
  */
 Drupal.behaviors.copyFieldValue = {
   attach: function (context, settings) {
+    // List of fields IDs on which to bind the event listener.
+    // Create an array of IDs to use with jQuery.
     for (var sourceId in settings.copyFieldValue) {
-      $('#' + sourceId, context).once('copy-field-values').bind('blur', function () {
-        // Get the list of target fields.
-        var targetIds = settings.copyFieldValue[sourceId];
-        // Add the behavior to update target fields on blur of the primary field.
-        for (var delta in targetIds) {
-          var targetField = $('#' + targetIds[delta]);
-          if (targetField.val() === '') {
-            targetField.val(this.value);
-          }
-        }
-      });
-    }
-  }
-};
-
-/**
- * Show/hide custom format sections on the regional settings page.
- */
-Drupal.behaviors.dateTime = {
-  attach: function (context, settings) {
-    for (var fieldName in settings.dateTime) {
-      if (settings.dateTime.hasOwnProperty(fieldName)) {
-        (function (fieldSettings, fieldName) {
-          var source = '#edit-' + fieldName;
-          var suffix = source + '-suffix';
-
-          // Attach keyup handler to custom format inputs.
-          $(context).find('input' + source).once('date-time').keyup(function () {
-            var input = $(this);
-            var url = fieldSettings.lookup + (/\?q=/.test(fieldSettings.lookup) ? '&format=' : '?format=') + encodeURIComponent(input.val());
-            $.getJSON(url, function (data) {
-              $(suffix).empty().append(' ' + fieldSettings.text + ': <em>' + data + '</em>');
-            });
-          });
-        })(settings.dateTime[fieldName], fieldName);
+      if (settings.copyFieldValue.hasOwnProperty(sourceId)) {
+        ids.push(sourceId);
       }
     }
-  }
-};
-
- /**
- * Show/hide settings for page caching depending on whether page caching is
- * enabled or not.
- */
-Drupal.behaviors.pageCache = {
-  attach: function (context, settings) {
-    var $context = $(context);
-    $context.find('#edit-cache-0').change(function () {
-      $('#page-compression-wrapper').hide();
-      $('#cache-error').hide();
-    });
-    $context.find('#edit-cache-1').change(function () {
-      $('#page-compression-wrapper').show();
-      $('#cache-error').hide();
-    });
-    $context.find('#edit-cache-2').change(function () {
-      $('#page-compression-wrapper').show();
-      $('#cache-error').show();
-    });
+    if (ids.length) {
+      // Listen to value:copy events on all dependant fields.
+      // We have to use body and not document because of the way jQuery events
+      // bubble up the DOM tree.
+      $('body').once('copy-field-values').on('value:copy', valueTargetCopyHandler);
+      // Listen on all source elements.
+      $('#' + ids.join(', #')).once('copy-field-values').on('blur', valueSourceBlurHandler);
+    }
+  },
+  detach: function (context, settings, trigger) {
+    if (trigger === 'unload' && ids.length) {
+      $('body').removeOnce('copy-field-values').off('value:copy');
+      $('#' + ids.join(', #')).removeOnce('copy-field-values').off('blur');
+    }
   }
 };
 
