diff --git a/core/modules/views/config/schema/views.data_types.schema.yml b/core/modules/views/config/schema/views.data_types.schema.yml
index e69060d..60a099b 100644
--- a/core/modules/views/config/schema/views.data_types.schema.yml
+++ b/core/modules/views/config/schema/views.data_types.schema.yml
@@ -779,8 +779,12 @@ views_filter:
             - type: integer
               label: 'Default'
         group_items:
-          type: views.filter.group_items.[plugin_id]
+          type: sequence
           label: 'Group items'
+          sequence:
+            - type: views.filter.group_item.[%parent.%parent.%parent.plugin_id]
+              label: 'Group item'
+
     plugin_id:
       type: string
       label: 'Plugin ID'
@@ -788,21 +792,19 @@ views_filter:
       type: string
       label: 'Provider'
 
-views_filter_group_items:
-  type: sequence
-  sequence:
-    - type: mapping
-      label: 'Group item'
-      mapping:
-        title:
-          type: label
-          label: 'Label'
-        operator:
-          type: string
-          label: 'Operator'
-        value:
-          type: label
-          label: 'Value'
+views_filter_group_item:
+  type: mapping
+  label: 'Group item'
+  mapping:
+    title:
+      type: label
+      label: 'Label'
+    operator:
+      type: string
+      label: 'Operator'
+    value:
+      type: label
+      label: 'Value'
 
 views_relationship:
   type: mapping
diff --git a/core/modules/views/config/schema/views.filter.schema.yml b/core/modules/views/config/schema/views.filter.schema.yml
index 537ba81..3a97c25 100644
--- a/core/modules/views/config/schema/views.filter.schema.yml
+++ b/core/modules/views/config/schema/views.filter.schema.yml
@@ -31,12 +31,16 @@ views.filter.combine:
         - type: string
           label: 'Field'
 
-views.filter.date:
-  type: views.filter.numeric
+views.filter_value.date:
+  type: views.filter_value.numeric
   label: 'Date'
+  mapping:
+    type:
+      type: string
+      label: 'Type'
 
-views.filter.groupby_numeric:
-  type: views.filter.numeric
+views.filter_value.groupby_numeric:
+  type: views.filter_value.numeric
   label: 'Group by numeric'
 
 views.filter.in_operator:
@@ -75,29 +79,22 @@ views.filter.string:
       type: string
       label: 'Value'
 
-views.filter.numeric:
-  type: views_filter
+views.filter_value.numeric:
+  type: mapping
   label: 'Numeric'
   mapping:
+    min:
+      type: string
+      label: 'Min'
+    max:
+      type: string
+      label: 'And max'
     value:
-      type: mapping
-      label: 'Operator'
-      mapping:
-        min:
-          type: string
-          label: 'Min'
-        max:
-          type: string
-          label: 'And max'
-        value:
-          type: string
-          label: 'Value'
-        type:
-          type: string
-          label: 'Value type'
+      type: string
+      label: 'Value'
 
-views.filter.equality:
-  type: views.filter.numeric
+views.filter_value.equality:
+  type: views.filter_value.numeric
   label: 'Equality'
 
 views.filter.many_to_one:
@@ -121,17 +118,16 @@ views.filter.standard:
   type: views_filter
   label: 'Standard'
 
-views.filter.group_items.*:
-  type: views_filter_group_items
+views.filter.group_item.*:
+  type: views_filter_group_item
   label: 'Default'
 
-views.filter.group_items.string:
-  type: views_filter_group_items
-  label: 'String group items'
-
-views.filter.group_items.boolean:
-  type: views_filter_group_items
+views.filter.group_item.numeric:
+  type: views_filter_group_item
   label: 'Group items'
+  mapping:
+    value:
+      type: views.filter_value.numeric
 
 # Schema for the views filter value.
 
diff --git a/core/modules/views/src/Plugin/views/filter/Date.php b/core/modules/views/src/Plugin/views/filter/Date.php
index 7e5417f..6e7f1f2 100644
--- a/core/modules/views/src/Plugin/views/filter/Date.php
+++ b/core/modules/views/src/Plugin/views/filter/Date.php
@@ -42,6 +42,13 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
         '#default_value' => !empty($this->value['type']) ? $this->value['type'] : 'date',
       );
     }
+    else {
+      // Ensure there is something in the 'type'.
+      $form['value']['type'] = array(
+        '#type' => 'value',
+        '#value' => NULL
+      );
+    }
     parent::valueForm($form, $form_state);
   }
 
diff --git a/core/modules/views/src/Plugin/views/filter/Numeric.php b/core/modules/views/src/Plugin/views/filter/Numeric.php
index 38c0fca..ef4fb1d 100644
--- a/core/modules/views/src/Plugin/views/filter/Numeric.php
+++ b/core/modules/views/src/Plugin/views/filter/Numeric.php
@@ -184,9 +184,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'] = array(
+      $form['value']['value'] = array(
         '#type' => 'textfield',
         '#title' => !$exposed ? $this->t('Value') : '',
         '#size' => 30,
@@ -231,7 +229,7 @@ protected function valueForm(&$form, FormStateInterface $form_state) {
 
       if (!isset($form['value'])) {
         // Ensure there is something in the 'value'.
-        $form['value'] = array(
+        $form['value']['value'] = array(
           '#type' => 'value',
           '#value' => NULL
         );
diff --git a/core/modules/views_ui/src/Tests/FilterNumericWebTest.php b/core/modules/views_ui/src/Tests/FilterNumericWebTest.php
new file mode 100644
index 0000000..09eff65
--- /dev/null
+++ b/core/modules/views_ui/src/Tests/FilterNumericWebTest.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views_ui\Tests\FilterBooleanWebTest.
+ */
+
+namespace Drupal\views_ui\Tests;
+
+/**
+ * Tests the numeric filter UI.
+ *
+ * @group views_ui
+ * @see \Drupal\views\Plugin\views\filter\Numeric
+ */
+class FilterNumericWebTest extends UITestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_view');
+
+  /**
+   * Tests the filter numeric UI.
+   */
+  public function testFilterNumericUI() {
+    $this->drupalPostForm('admin/structure/views/nojs/add-handler/test_view/default/filter', array('name[views_test_data.age]' => TRUE), t('Add and configure @handler', array('@handler' => t('filter criteria'))));
+
+    $this->drupalPostForm(NULL, array(), t('Expose filter'));
+    $this->drupalPostForm(NULL, array(), t('Grouped filters'));
+
+    $edit = array();
+    $edit['options[group_info][group_items][1][title]'] = 'Published';
+    $edit['options[group_info][group_items][1][operator]'] = '=';
+    $edit['options[group_info][group_items][1][value][value]'] = 1;
+    $edit['options[group_info][group_items][2][title]'] = 'Not published';
+    $edit['options[group_info][group_items][2][operator]'] = '=';
+    $edit['options[group_info][group_items][2][value][value]'] = 0;
+    $edit['options[group_info][group_items][3][title]'] = 'Not published2';
+    $edit['options[group_info][group_items][3][operator]'] = '!=';
+    $edit['options[group_info][group_items][3][value][value]'] = 1;
+
+    $this->drupalPostForm(NULL, $edit, t('Apply'));
+
+    $this->drupalPostForm('admin/structure/views/view/test_view', array(), t('Save'));
+
+  }
+
+}
diff --git a/core/modules/views_ui/src/Tests/PreviewTest.php b/core/modules/views_ui/src/Tests/PreviewTest.php
index 191e4b4..22ca5b2 100644
--- a/core/modules/views_ui/src/Tests/PreviewTest.php
+++ b/core/modules/views_ui/src/Tests/PreviewTest.php
@@ -40,7 +40,7 @@ protected function testPreviewContextual() {
     $this->drupalPostForm(NULL, $edit = array('view_args' => '100'), t('Update preview'));
 
     // Test that area text and exposed filters are present and rendered.
-    $this->assertFieldByName('id', NULL, 'ID exposed filter field found.');
+    $this->assertFieldByName('id[value]', NULL, 'ID exposed filter field found.');
     $this->assertText('Test header text', 'Rendered header text found');
     $this->assertText('Test footer text', 'Rendered footer text found.');
     $this->assertText('Test empty text', 'Rendered empty text found.');
@@ -71,7 +71,7 @@ function testPreviewUI() {
     $this->assertEqual(count($elements), 0);
 
     // Test that area text and exposed filters are present and rendered.
-    $this->assertFieldByName('id', NULL, 'ID exposed filter field found.');
+    $this->assertFieldByName('id[value]', NULL, 'ID exposed filter field found.');
     $this->assertText('Test header text', 'Rendered header text found');
     $this->assertText('Test footer text', 'Rendered footer text found.');
     $this->assertText('Test empty text', 'Rendered empty text found.');
