diff --git a/config/schema/views_fields_on_off.schema.yml b/config/schema/views_fields_on_off.schema.yml
new file mode 100644
index 0000000..89d99e0
--- /dev/null
+++ b/config/schema/views_fields_on_off.schema.yml
@@ -0,0 +1,3 @@
+views.filter.views_fields_on_off_form:
+  type: views.filter.in_operator
+  label: 'Views Fields On/Off'
diff --git a/src/Plugin/views/filter/ViewsFieldsOnOffForm.php b/src/Plugin/views/filter/ViewsFieldsOnOffForm.php
new file mode 100644
index 0000000..2658760
--- /dev/null
+++ b/src/Plugin/views/filter/ViewsFieldsOnOffForm.php
@@ -0,0 +1,69 @@
+<?php
+
+namespace Drupal\views_fields_on_off\Plugin\views\filter;
+
+use Drupal\views\Plugin\views\filter\InOperator;
+
+/**
+ * Provides a handler that adds the form for Fields On/Off.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @ViewsFilter("views_fields_on_off_form")
+ */
+class ViewsFieldsOnOffForm extends InOperator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function canExpose() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isExposed() {
+    return TRUE;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValueOptions() {
+    if (isset($this->valueOptions)) {
+      return $this->valueOptions;
+    }
+    $this->valueOptions = $this->displayHandler->getFieldLabels();
+    return $this->valueOptions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    // This is not a real field and it only affects the query by excluding
+    // fields from the display. But Views won't render if the query()
+    // method is not present. This doesn't do anything, but it has to be here.
+    // This function is a void so it doesn't return anything.
+  }
+
+  /**
+   * Theme preprocess function.
+   *
+   * @see views_fields_on_off_preprocess_views_view()
+   *
+   * @param $variables
+   *   Theme variables to be rendered.
+   */
+  public function preprocess(&$variables) {
+    $field_options = $this->view->display_handler->getOption('fields');
+    foreach ($field_options as $key => &$field) {
+      if (isset($this->value[$key])) {
+        continue;
+      }
+
+      unset($this->view->field[$key]);
+    }
+  }
+}
diff --git a/views_fields_on_off.module b/views_fields_on_off.module
index 7ab42a1..73b5606 100644
--- a/views_fields_on_off.module
+++ b/views_fields_on_off.module
@@ -111,4 +111,15 @@ function views_fields_on_off_views_pre_view(ViewExecutable $view, $display_id, a
       }
     }
   }
+
+/**
+ * Implements hook_preprocess_HOOK().
+ */
+function views_fields_on_off_preprocess_views_view(&$variables) {
+  $plugin_id = 'views_fields_on_off_form';
+  $view = $variables['view'];
+
+  if ($view->getHandler($view->current_display, 'filter', $plugin_id)) {
+    $view->filter[$plugin_id]->preprocess($variables);
+  }
 }
diff --git a/views_fields_on_off.views.inc b/views_fields_on_off.views.inc
index f12e2a7..175a90a 100644
--- a/views_fields_on_off.views.inc
+++ b/views_fields_on_off.views.inc
@@ -15,6 +15,9 @@ function views_fields_on_off_views_data() {
     'field' => [
       'id' => 'views_fields_on_off_form',
     ],
+    'filter' => [
+      'id' => 'views_fields_on_off_form',
+    ],
   ];
 
   return $data;
