diff --git a/core/modules/system/tests/src/Functional/Entity/EntityReferenceSelection/EntityReferenceSelectionAccessTest.php b/core/modules/system/tests/src/Functional/Entity/EntityReferenceSelection/EntityReferenceSelectionAccessTest.php
index 3772f3a97b..9326c349ce 100644
--- a/core/modules/system/tests/src/Functional/Entity/EntityReferenceSelection/EntityReferenceSelectionAccessTest.php
+++ b/core/modules/system/tests/src/Functional/Entity/EntityReferenceSelection/EntityReferenceSelectionAccessTest.php
@@ -348,6 +348,53 @@ public function testUserHandler() {
       ],
     ];
     $this->assertReferenceable($selection_options, $referenceable_tests, 'User handler (does not include anonymous)');
+
+    // Log in with the user without 'administer users'.
+    \Drupal::currentUser()->setAccount($users['non_admin']);
+    $selection_options['handler_settings']['include_anonymous'] = TRUE;
+    $selection_options['handler_settings']['include_blocked'] = TRUE;
+    $referenceable_tests = [
+      [
+        'arguments' => [],
+        'result' => [
+          'user' => [
+            $users['admin']->id() => $user_labels['admin'],
+            $users['non_admin']->id() => $user_labels['non_admin'],
+            $users['anonymous']->id() => $user_labels['anonymous'],
+          ],
+        ],
+      ],
+    ];
+
+    // Non admin users cannot view blocked users even if the include_blocked
+    // option is set to true.
+    $this->assertReferenceable($selection_options, $referenceable_tests, 'User handler (does not include blocked as user without administer users)');
+
+    // Users with 'administer users' permission cannot view blocked users if
+    // the 'include_blocked' selection option is FALSE.
+    \Drupal::currentUser()->setAccount($users['admin']);
+    $selection_options['handler_settings']['include_blocked'] = FALSE;
+    $this->assertReferenceable($selection_options, $referenceable_tests, 'User handler (does not include blocked as admin if include blocked is false)');
+
+    // Users with 'administer users' permission can view blocked users if
+    // the 'include_blocked' selection option is TRUE.
+    $selection_options['handler_settings']['include_blocked'] = TRUE;
+    $referenceable_tests = [
+      [
+        'arguments' => [],
+        'result' => [
+          'user' => [
+            $users['admin']->id() => $user_labels['admin'],
+            $users['non_admin']->id() => $user_labels['non_admin'],
+            $users['anonymous']->id() => $user_labels['anonymous'],
+            $users['blocked']->id() => $user_labels['blocked'],
+          ],
+        ],
+      ],
+    ];
+    $this->assertReferenceable($selection_options, $referenceable_tests, 'User handler (includes blocked as admin if include blocked is true)');
+
+
   }
 
   /**
diff --git a/core/modules/user/config/schema/user.schema.yml b/core/modules/user/config/schema/user.schema.yml
index 2f9bda44f2..0354379030 100644
--- a/core/modules/user/config/schema/user.schema.yml
+++ b/core/modules/user/config/schema/user.schema.yml
@@ -187,6 +187,9 @@ entity_reference_selection.default:user:
     include_anonymous:
       type: boolean
       label: 'Include the anonymous user in the matched entities.'
+    include_blocked:
+      type: boolean
+      label: 'Include blocked users in the matched entities.'
 
 field.formatter.settings.user_name:
   type: mapping
diff --git a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
index d06a81c41e..d278a75ec5 100644
--- a/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
+++ b/core/modules/user/src/Plugin/EntityReferenceSelection/UserSelection.php
@@ -89,6 +89,7 @@ public function defaultConfiguration() {
         'type' => '_none',
         'role' => NULL,
       ],
+      'include_blocked' => FALSE,
       'include_anonymous' => TRUE,
     ] + parent::defaultConfiguration();
   }
@@ -105,6 +106,13 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       '#default_value' => $configuration['include_anonymous'],
     ];
 
+    $form['include_blocked'] = [
+      '#type' => 'checkbox',
+      '#title' => $this->t('Include blocked users'),
+      '#default_value' => !empty($selection_handler_settings['include_blocked']),
+      '#description' => $this->t('If this option is not set, only users with the <em>administer users</em> permission may reference blocked users.'),
+      ];
+
     // Add user specific filter options.
     $form['filter']['type'] = [
       '#type' => 'select',
@@ -165,7 +173,7 @@ protected function buildEntityQuery($match = NULL, $match_operator = 'CONTAINS')
 
     // Adding the permission check is sadly insufficient for users: core
     // requires us to also know about the concept of 'blocked' and 'active'.
-    if (!$this->currentUser->hasPermission('administer users')) {
+    if (!($this->currentUser->hasPermission('administer users')) || !empty($handler_settings['include_blocked'])) {
       $query->condition('status', 1);
     }
     return $query;
diff --git a/core/modules/views/src/Plugin/views/filter/Date.php b/core/modules/views/src/Plugin/views/filter/Date.php
index dbb573fcd4..e8afb8b086 100644
--- a/core/modules/views/src/Plugin/views/filter/Date.php
+++ b/core/modules/views/src/Plugin/views/filter/Date.php
@@ -141,7 +141,7 @@ public function acceptExposedInput($input) {
     // Don't filter if value(s) are empty.
     $operators = $this->operators();
     if (!empty($this->options['expose']['use_operator']) && !empty($this->options['expose']['operator_id'])) {
-      $operator = $input[$this->options['expose']['operator_id']];
+      $operator = $input[$this->options['expose']['identifier']]['operator'];
     }
     else {
       $operator = $this->operator;
diff --git a/core/modules/views/src/Plugin/views/filter/NumericFilter.php b/core/modules/views/src/Plugin/views/filter/NumericFilter.php
index 7f687a14f4..53699b4198 100644
--- a/core/modules/views/src/Plugin/views/filter/NumericFilter.php
+++ b/core/modules/views/src/Plugin/views/filter/NumericFilter.php
@@ -5,7 +5,7 @@
 use Drupal\Core\Form\FormStateInterface;
 
 /**
- * Simple filter to handle greater than/less than filters
+ * Simple filter to handle greater than/less than filters.
  *
  * @ingroup views_filter_handlers
  *
@@ -87,7 +87,7 @@ public function operators() {
       ],
     ];
 
-    // if the definition allows for the empty operator, add it.
+    // If the definition allows for the empty operator, add it.
     if (!empty($this->definition['allow empty'])) {
       $operators += [
         'empty' => [
@@ -109,7 +109,7 @@ public function operators() {
   }
 
   /**
-   * Provide a list of all the numeric operators
+   * Provide a list of all the numeric operators.
    */
   public function operatorOptions($which = 'title') {
     $options = [];
@@ -130,36 +130,52 @@ protected function operatorValues($values = 1) {
 
     return $options;
   }
+
   /**
-   * Provide a simple textfield for equality
+   * Provide a simple textfield for equality.
    */
   protected function valueForm(&$form, FormStateInterface $form_state) {
-    $form['value']['#tree'] = TRUE;
+    // Set a filter wrapper.
+    $exposed = !empty($this->options['expose']);
+    $wrapped = ($exposed && in_array($this->operator, $this->operatorValues(2))) || !empty($this->options['expose']['use_operator']);
+    if ($wrapped) {
+      $form['value']['#type'] = 'fieldset';
+      if (!empty($this->exposedInfo()['label'])) {
+        $form['value']['#title'] = $this->exposedInfo()['label'];
+      }
+      if (!empty($this->exposedInfo()['description'])) {
+        $form['value']['#description'] = $this->exposedInfo()['description'];
+      }
+      if ($exposed) {
+        $form['value']['operator'] = $form[$this->options['expose']['operator_id']];
+        unset($form[$this->options['expose']['operator_id']]);
+      }
+    }
 
     // We have to make some choices when creating this as an exposed
     // filter form. For example, if the operator is locked and thus
     // not rendered, we can't render dependencies; instead we only
     // render the form items we need.
     $which = 'all';
-    if (!empty($form['operator'])) {
-      $source = ':input[name="options[operator]"]';
-    }
-
-    if ($exposed = $form_state->get('exposed')) {
+    if ($form_state->get('exposed')) {
       $identifier = $this->options['expose']['identifier'];
 
       if (empty($this->options['expose']['use_operator']) || empty($this->options['expose']['operator_id'])) {
-        // exposed and locked.
+        // Exposed and locked.
         $which = in_array($this->operator, $this->operatorValues(2)) ? 'minmax' : 'value';
       }
       else {
-        $source = ':input[name="' . $this->options['expose']['operator_id'] . '"]';
+        $source = ':input[name="' . $this->options['expose']['identifier'] . '[operator]"]';
       }
     }
+    // Need to adjust the states source for the filter admin form.
+    if (!empty($form['operator'])) {
+      $source = ':input[name="options[operator]"]';
+    }
 
     $user_input = $form_state->getUserInput();
     if ($which == 'all') {
-      $form['value']['value'] = [
+      $value['value'] = [
         '#type' => 'textfield',
         '#title' => !$exposed ? $this->t('Value') : '',
         '#size' => 30,
@@ -167,7 +183,7 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
       ];
       // Setup #states for all operators with one value.
       foreach ($this->operatorValues(1) as $operator) {
-        $form['value']['value']['#states']['visible'][] = [
+        $value['value']['#states']['visible'][] = [
           $source => ['value' => $operator],
         ];
       }
@@ -179,7 +195,7 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
     elseif ($which == 'value') {
       // When exposed we drop the value-value and just do value if
       // the operator is locked.
-      $form['value'] = [
+      $value = [
         '#type' => 'textfield',
         '#title' => !$exposed ? $this->t('Value') : '',
         '#size' => 30,
@@ -192,16 +208,15 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
     }
 
     if ($which == 'all' || $which == 'minmax') {
-      $form['value']['min'] = [
+      $value['min'] = [
         '#type' => 'textfield',
-        '#title' => !$exposed ? $this->t('Min') : $this->exposedInfo()['label'],
+        '#title' => $exposed ? $this->t('Min') : '',
         '#size' => 30,
         '#default_value' => $this->value['min'],
-        '#description' => !$exposed ? '' : $this->exposedInfo()['description']
       ];
-      $form['value']['max'] = [
+      $value['max'] = [
         '#type' => 'textfield',
-        '#title' => !$exposed ? $this->t('And max') : $this->t('And'),
+        '#title' => $exposed ? $this->t('And max') : $this->t('And'),
         '#size' => 30,
         '#default_value' => $this->value['max'],
       ];
@@ -213,9 +228,10 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
             $source => ['value' => $operator],
           ];
         }
-        $form['value']['min'] += $states;
-        $form['value']['max'] += $states;
+        $value['min'] += $states;
+        $value['max'] += $states;
       }
+
       if ($exposed && !isset($user_input[$identifier]['min'])) {
         $user_input[$identifier]['min'] = $this->value['min'];
       }
@@ -223,14 +239,16 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
         $user_input[$identifier]['max'] = $this->value['max'];
       }
 
-      if (!isset($form['value'])) {
+      if (!isset($value)) {
         // Ensure there is something in the 'value'.
-        $form['value'] = [
+        $value = [
           '#type' => 'value',
           '#value' => NULL
         ];
       }
     }
+    $form['value'] += $value;
+    $form['value']['value']['#tree'] = TRUE;
   }
 
   public function query() {
@@ -297,14 +315,14 @@ public function adminSummary() {
   }
 
   /**
-   * Do some minor translation of the exposed input
+   * Do some minor translation of the exposed input.
    */
   public function acceptExposedInput($input) {
     if (empty($this->options['exposed'])) {
       return TRUE;
     }
 
-    // rewrite the input value so that it's in the correct format so that
+    // Rewrite the input value so that it's in the correct format so that
     // the parent gets the right data.
     if (!empty($this->options['expose']['identifier'])) {
       $value = &$input[$this->options['expose']['identifier']];
@@ -327,6 +345,7 @@ public function acceptExposedInput($input) {
               return FALSE;
             }
             break;
+
           case 2:
             if ($value['min'] === '' && $value['max'] === '') {
               return FALSE;
diff --git a/core/modules/views_ui/tests/src/Functional/FilterNumericWebTest.php b/core/modules/views_ui/tests/src/Functional/FilterNumericWebTest.php
index 8dc568de9b..dfe9003eea 100644
--- a/core/modules/views_ui/tests/src/Functional/FilterNumericWebTest.php
+++ b/core/modules/views_ui/tests/src/Functional/FilterNumericWebTest.php
@@ -113,6 +113,81 @@ public function testFilterNumericUI() {
     $this->assertRaw('<label for="edit-age-min">Age between</label>', 'Min field label found');
     // Check that the description is shown in the right place.
     $this->assertEqual(trim($this->cssSelect('.form-item-age-min .description')[0]->getText()), 'Description of the exposed filter');
+
+    // Test if label and description are still visible if you have more than one
+    // exposed filter form element (select and one input, select and two inputs,
+    // or two inputs.
+    $label = 'Age filter';
+    $label_not_found = 'Label not found on other form item.';
+    $description = 'Age filter description';
+    $description_not_found = 'Description not found on (other) form item';
+
+    // Prepare view with numeric filter.
+    $this->drupalGet('admin/structure/views/nojs/handler/test_view/default/filter/age');
+
+    // Test the selector and value, min and max fields have the correct label
+    // and no description when viewed in the settings UI.
+    $this->assertEqual(trim($this->cssSelect('#edit-options-operator--wrapper .fieldset-legend')[0]), 'Operator');
+    // When the isNull and notIsNull options are available the total number of
+    // options > 10, so they get rendered as a select.
+    //$this->assertEqual(trim($this->cssSelect('.form-item-options-operator label')[0]), 'Operator');
+    $this->assertEqual(count($this->cssSelect('.form-item-options-operator description')), 0, $description_not_found);
+    $this->assertEqual(trim($this->cssSelect('.form-item-options-value-value label')[0]), 'Value');
+    $this->assertEqual(count($this->cssSelect('.form-item-options-value-value description')), 0, $description_not_found);
+    $this->assertEqual(trim($this->cssSelect('.form-item-options-value-min label')[0]), 'Min');
+    $this->assertEqual(count($this->cssSelect('.form-item-options-value-min description')), 0, $description_not_found);
+    $this->assertEqual(trim($this->cssSelect('.form-item-options-value-max label')[0]), 'And max');
+    $this->assertEqual(count($this->cssSelect('.form-item-options-value-max description')), 0, $description_not_found);
+
+    // First try two inputs, no select.
+    $edit = array();
+    $edit['options[expose][label]'] = $label;
+    $edit['options[expose][description]'] = $description;
+    $edit['options[value][min]'] = 26;
+    $edit['options[value][max]'] = 28;
+    $edit['options[operator]'] = 'between';
+    $this->drupalPostForm(NULL, $edit, t('Apply'));
+    $this->drupalPostForm('admin/structure/views/view/test_view', array(), t('Save'));
+    $this->assertConfigSchemaByName('views.view.test_view');
+    $this->drupalPostForm(NULL, array(), t('Update preview'));
+    // The first form item should have the label and description: the min field.
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-min label')[0]), $label);
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-min .description')[0]), $description);
+    // The other form item should have no label or description: the max field.
+    $this->assertEqual(count($this->cssSelect('.form-item-age-max label')), 0, $label_not_found);
+    $this->assertEqual(count($this->cssSelect('.form-item-age-max .description')), 0, $description_not_found);
+
+    // Next try two inputs and one select.
+    $this->drupalGet('admin/structure/views/nojs/handler/test_view/default/filter/age');
+    $edit = array();
+    $edit['options[expose][use_operator]'] = 1;
+    $this->drupalPostForm(NULL, $edit, t('Apply'));
+    $this->drupalPostForm('admin/structure/views/view/test_view', array(), t('Save'));
+    $this->assertConfigSchemaByName('views.view.test_view');
+    $this->drupalPostForm(NULL, array(), t('Update preview'));
+    // The first form item should have the label and description: the select.
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-op label')[0]), $label);
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-op .description')[0]), $description);
+    // The other form items should have no label or description: the min and max field.
+    $this->assertEqual(count($this->cssSelect('.form-item-age-min label')), 0, $label_not_found);
+    $this->assertEqual(count($this->cssSelect('.form-item-age-min .description')), 0, $description_not_found);
+    $this->assertEqual(count($this->cssSelect('.form-item-age-max label')), 0, $label_not_found);
+    $this->assertEqual(count($this->cssSelect('.form-item-age-max .description')), 0, $description_not_found);
+
+    // Last try one inputs and one select.
+    $this->drupalGet('admin/structure/views/nojs/handler/test_view/default/filter/age');
+    $edit = array();
+    $edit['options[operator]'] = '<';
+    $this->drupalPostForm(NULL, $edit, t('Apply'));
+    $this->drupalPostForm('admin/structure/views/view/test_view', array(), t('Save'));
+    $this->assertConfigSchemaByName('views.view.test_view');
+    $this->drupalPostForm(NULL, array(), t('Update preview'));
+    // The first form item should have the label and description: the select.
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-op label')[0]), $label);
+    $this->assertEqual(trim($this->cssSelect('.form-item-age-op .description')[0]), $description);
+    // The other form item should have no label or description: the value field.
+    $this->assertEqual(count($this->cssSelect('.form-item-age-value label')), 0, $label_not_found);
+    $this->assertEqual(count($this->cssSelect('.form-item-age-value .description')), 0, $description_not_found);
   }
 
 }
