diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index 40c598f..27f8bf5 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -236,10 +236,13 @@ public function buildForm($form_id, FormStateInterface &$form_state) {
       //   not desired.
       // - temporary: Any assigned data is expected to survives within the same
       //   page request.
+      // - input: Any user submitted data is expected to survive within the same
+      //   page request.
       if ($check_cache) {
         $cache_form_state = $form_state->getCacheableArray();
         $cache_form_state['always_process'] = $form_state->getAlwaysProcess();
         $cache_form_state['temporary'] = $form_state->getTemporary();
+        $cache_form_state['input'] = $form_state->getUserInput();
         $form_state = $form_state_before_retrieval;
         $form_state->setFormState($cache_form_state);
       }
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index 292a2e3..e1af365 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -518,6 +518,11 @@ public static function getSelected(FormStateInterface $form_state, $parents, $de
       // use the value that was submitted anymore but rather fall back to the
       // default value.
       if ($key_exists && in_array($submitted, array_keys($element['#options']))) {
+        // If the user-submitted value has changed, remove all other options in
+        // that set of values.
+        array_pop($parents);
+        NestedArray::unsetValue($user_input, $parents);
+
         return $submitted;
       }
     }
diff --git a/core/modules/views_ui/admin.inc b/core/modules/views_ui/admin.inc
index 80ade9b..c6ab2b2 100644
--- a/core/modules/views_ui/admin.inc
+++ b/core/modules/views_ui/admin.inc
@@ -52,10 +52,6 @@ function views_ui_add_ajax_trigger(&$wrapping_element, $trigger_key, $refresh_pa
   $triggering_element = &$wrapping_element[$trigger_key];
   $triggering_element['#ajax']['callback'] = 'views_ui_ajax_update_form';
 
-  // Specify the #ajax URL in order to retain form caching.
-  // @todo Remove this in https://www.drupal.org/node/2500523.
-  $triggering_element['#ajax']['url'] = Url::fromRoute('system.ajax');
-
   // We do not use \Drupal\Component\Utility\Html::getUniqueId() to get an ID
   // for the AJAX wrapper, because it remembers IDs across AJAX requests (and
   // won't reuse them), but in our case we need to use the same ID from request
