diff --git a/core/modules/field/src/Tests/Views/FieldUITest.php b/core/modules/field/src/Tests/Views/FieldUITest.php
index 884f82d..82727a3 100644
--- a/core/modules/field/src/Tests/Views/FieldUITest.php
+++ b/core/modules/field/src/Tests/Views/FieldUITest.php
@@ -112,4 +112,57 @@ public function testHandlerUIAggregation() {
     $this->assertEqual($options, array('format', 'value'), 'The expected sort field options were found.');
   }
 
+  /**
+   * Test that the correct filter plugin is used for specific fields.
+   */
+  public function testFilterHandlers() {
+    $this->_testTextFilterHandler();
+    $this->_testBooleanFilterHandler();
+  }
+
+  /**
+   * Tests adding a text field filter handler.
+   */
+  public function _testTextFilterHandler() {
+    $field_name = 'field_name_0';
+    $url = "admin/structure/views/nojs/add-handler/test_view_fieldapi/default/filter";
+    $this->drupalPostForm($url, ['name[node__' . $field_name . '.' . $field_name . '_value]' => TRUE], t('Add and configure @handler', array('@handler' => t('filter criteria'))));
+    $this->assertResponse(200);
+
+    $this->xpath('//input[@type=:type and @id=:id]', array(':type' => 'text', ':id' => 'edit-options-value'));
+
+    $this->drupalPostForm(NULL, [], t('Apply'));
+
+  }
+
+  /**
+   * Tests adding a boolean field filter handler.
+   */
+  public function _testBooleanFilterHandler() {
+    // Create a boolean field.
+    $field_name = 'field_boolean';
+    $field_storage = entity_create('field_storage_config', array(
+      'field_name' => $field_name,
+      'entity_type' => 'node',
+      'type' => 'boolean',
+    ));
+    $field_storage->save();
+    $field = entity_create('field_config', array(
+      'field_storage' => $field_storage,
+      'bundle' => 'page',
+    ));
+    $field->save();
+
+    $url = "admin/structure/views/nojs/add-handler/test_view_fieldapi/default/filter";
+    $this->drupalPostForm($url, ['name[node__' . $field_name . '.' . $field_name . '_value]' => TRUE], t('Add and configure @handler', array('@handler' => t('filter criteria'))));
+    $this->assertResponse(200);
+    // Verify that using a boolean field as a filter also results in using the
+    // boolean plugin.
+    $option = $this->xpath('//label[@for="edit-options-value-1"]');
+    $this->assertEqual(t('True'), (string) $option[0]);
+    $option = $this->xpath('//label[@for="edit-options-value-0"]');
+    $this->assertEqual(t('False'), (string) $option[0]);
+
+    $this->drupalPostForm(NULL, [], t('Apply'));
+  }
 }
diff --git a/core/modules/views/views.views.inc b/core/modules/views/views.views.inc
index 2efc08c..90bf149 100644
--- a/core/modules/views/views.views.inc
+++ b/core/modules/views/views.views.inc
@@ -302,6 +302,7 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
   }
 
   $field_name = $field_storage->getName();
+  $field_type = $field_storage->getType();
   $field_columns = $field_storage->getColumns();
 
   // Grab information about the entity type tables.
@@ -489,28 +490,58 @@ function views_field_default_views_data(FieldStorageConfigInterface $field_stora
   foreach ($field_columns as $column => $attributes) {
     $allow_sort = TRUE;
 
-    // Identify likely filters and arguments for each column based on field type.
-    switch ($attributes['type']) {
-      case 'int':
-      case 'mediumint':
-      case 'tinyint':
-      case 'bigint':
-      case 'serial':
-      case 'numeric':
-      case 'float':
-        $filter = 'numeric';
+    // Set up the sort, argument, and filters, based on the column and/or field
+    // data type.
+    switch ($field_type) {
+      case 'boolean':
         $argument = 'numeric';
+        $filter = 'boolean';
         $sort = 'standard';
         break;
-      case 'text':
+
       case 'blob':
+      case 'text':
+      case 'text_with_summary':
         // It does not make sense to sort by blob or text.
         $allow_sort = FALSE;
+        // Intentional fall-through here to the default processing!
+
       default:
-        $filter = 'string';
-        $argument = 'string';
-        $sort = 'standard';
-        break;
+        // For most fields, the field type is generic enough to just use the
+        // column type to determine the filters etc.
+        switch ($attributes['type']) {
+
+          case 'int':
+          case 'integer':
+          case 'smallint':
+          case 'tinyint':
+          case 'mediumint':
+          case 'float':
+          case 'double':
+          case 'decimal':
+            $argument = 'numeric';
+            $filter = 'numeric';
+            $sort = 'standard';
+            break;
+
+          case 'char':
+          case 'string':
+          case 'varchar':
+          case 'varchar_ascii':
+          case 'tinytext':
+          case 'text':
+          case 'mediumtext':
+          case 'longtext':
+            $argument = 'string';
+            $filter = 'string';
+            $sort = 'standard';
+            break;
+
+          default:
+            $argument = 'standard';
+            $filter = 'standard';
+            $sort = 'standard';
+        }
     }
 
     if (count($field_columns) == 1 || $column == 'value') {
