diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/filter/Type.php b/core/modules/node/lib/Drupal/node/Plugin/views/filter/Type.php
deleted file mode 100644
index 87f7005..0000000
--- a/core/modules/node/lib/Drupal/node/Plugin/views/filter/Type.php
+++ /dev/null
@@ -1,38 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\node\Plugin\views\filter\Type.
- */
-
-namespace Drupal\node\Plugin\views\filter;
-
-use Drupal\views\Plugin\views\filter\InOperator;
-use Drupal\Core\Annotation\Plugin;
-
-/**
- * Filter by node type.
- *
- * @ingroup views_filter_handlers
- *
- * @Plugin(
- *   id = "node_type",
- *   module = "node"
- * )
- */
-class Type extends InOperator {
-
-  function get_value_options() {
-    if (!isset($this->value_options)) {
-      $this->value_title = t('Content types');
-      $types = node_type_get_types();
-      $options = array();
-      foreach ($types as $type => $info) {
-        $options[$type] = t($info->name);
-      }
-      asort($options);
-      $this->value_options = $options;
-    }
-  }
-
-}
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index 2e8ab14..4f2d7e9 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -125,7 +125,7 @@ function node_views_data() {
       'id' => 'standard',
     ),
     'filter' => array(
-      'id' => 'node_type',
+      'id' => 'entity_type',
     ),
     'argument' => array(
       'id' => 'node_type',
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.install b/core/modules/system/tests/modules/entity_test/entity_test.install
index dacd1f5..120e32d 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.install
+++ b/core/modules/system/tests/modules/entity_test/entity_test.install
@@ -58,6 +58,13 @@ function entity_test_schema() {
         'length' => 128,
         'not null' => FALSE,
       ),
+      'type' => array(
+        'description' => 'The bundle type for this entity.',
+        'type' => 'varchar',
+        'length' => 32,
+        'not null' => TRUE,
+        'default' => '',
+      ),
       'langcode' => array(
         'description' => 'The {language}.langcode of the original variant of this test entity.',
         'type' => 'varchar',
diff --git a/core/modules/system/tests/modules/entity_test/entity_test.views.inc b/core/modules/system/tests/modules/entity_test/entity_test.views.inc
index 4e348b0..f2242fc 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.views.inc
+++ b/core/modules/system/tests/modules/entity_test/entity_test.views.inc
@@ -55,6 +55,23 @@ function entity_test_views_data() {
     ),
   );
 
+  $data['entity_test']['type'] = array(
+    'title' => t('Type'),
+    'help' => t('The bundle type'),
+    'field' => array(
+      'id' => 'standard',
+    ),
+    'sort' => array(
+      'id' => 'standard',
+    ),
+    'filter' => array(
+      'id' => 'entity_type',
+    ),
+    'argument' => array(
+      'id' => 'string',
+    ),
+  );
+
   if (module_exists('langcode')) {
     $data['entity_test']['langcode'] = array(
       'title' => t('Language'),
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
index 0908700..b1add76 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
@@ -32,6 +32,12 @@ public function baseFieldDefinitions() {
       'description' => t('The UUID of the test entity.'),
       'type' => 'string_field',
     );
+    $fields['type'] = array(
+      'label' => t('Type'),
+      'description' => t('The bundle type of the test entity.'),
+      'type' => 'string_field',
+      'translatable' => FALSE,
+    );
     $fields['langcode'] = array(
       'label' => t('Language code'),
       'description' => t('The language code of the test entity.'),
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
index 1c8979e..5a313bc 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
@@ -29,6 +29,15 @@
  *   entity_keys = {
  *     "id" = "id",
  *     "uuid" = "uuid",
+ *     "bundle" = "type"
+ *   },
+ *   bundles = {
+ *     "test_1" = {
+ *       "label" = "Test 1",
+ *     },
+ *     "test_2" = {
+ *       "label" = "Test 2",
+ *     }
  *   },
  *   menu_base_path = "entity-test/manage/%entity_test"
  * )
@@ -64,6 +73,13 @@ class EntityTest extends EntityNG {
   public $user_id;
 
   /**
+   * The bundle type.
+   *
+   * @var \Drupal\Core\Entity\Field\FieldInterface
+   */
+  public $type;
+
+  /**
    * Initialize the object. Invoked upon construction and wake up.
    */
   protected function init() {
@@ -73,6 +89,7 @@ protected function init() {
     unset($this->uuid);
     unset($this->name);
     unset($this->user_id);
+    unset($this->type);
   }
 
   /**
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/filter/VocabularyVid.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/filter/VocabularyVid.php
deleted file mode 100644
index bfa55a2..0000000
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/views/filter/VocabularyVid.php
+++ /dev/null
@@ -1,37 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\taxonomy\Plugin\views\filter\VocabularyVid.
- */
-
-namespace Drupal\taxonomy\Plugin\views\filter;
-
-use Drupal\Core\Annotation\Plugin;
-use Drupal\views\Plugin\views\filter\InOperator;
-
-/**
- * Filter by vocabulary id.
- *
- * @ingroup views_filter_handlers
- *
- * @Plugin(
- *   id = "vocabulary_vid",
- *   module = "taxonomy"
- * )
- */
-class VocabularyVid extends InOperator {
-
-  function get_value_options() {
-    if (isset($this->value_options)) {
-      return;
-    }
-
-    $this->value_options = array();
-    $vocabularies = entity_load_multiple('taxonomy_vocabulary');
-    foreach ($vocabularies as $voc) {
-      $this->value_options[$voc->id()] = $voc->label();
-    }
-  }
-
-}
diff --git a/core/modules/taxonomy/taxonomy.views.inc b/core/modules/taxonomy/taxonomy.views.inc
index c82873e..21da986 100644
--- a/core/modules/taxonomy/taxonomy.views.inc
+++ b/core/modules/taxonomy/taxonomy.views.inc
@@ -145,7 +145,7 @@ function taxonomy_views_data() {
     'title' => t('Vocabulary'),
     'help' => t('Filter the results of "Taxonomy: Term" to a particular vocabulary.'),
     'filter' => array(
-      'id' => 'vocabulary_vid',
+      'id' => 'entity_type',
     ),
   );
 
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/filter/EntityType.php b/core/modules/views/lib/Drupal/views/Plugin/views/filter/EntityType.php
new file mode 100644
index 0000000..f5ac9e4
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/filter/EntityType.php
@@ -0,0 +1,81 @@
+<?php
+
+/**
+ * @file
+ * Definition of \Drupal\views\Plugin\views\filter\EntityType.
+ */
+
+namespace Drupal\views\Plugin\views\filter;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\views\ViewExecutable;
+use Drupal\views\Plugin\views\display\DisplayPluginBase;
+
+/**
+ * Filter class which allows filtering by entity bundle types.
+ *
+ * This class provides a workaround for comment.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @Plugin(
+ *   id = "entity_type"
+ * )
+ */
+class EntityType extends InOperator {
+
+  /**
+   * The entity type for the filter.
+   *
+   * @var string
+   */
+  protected $entityType;
+
+  /**
+   * The entity info for the entity type.
+   *
+   * @var array
+   */
+  protected $entityInfo;
+
+  /**
+   * Overrides \Drupal\views\Plugin\views\filter\InOperator::init().
+   */
+  public function init(ViewExecutable $view, DisplayPluginBase $display, array &$options = NULL) {
+    parent::init($view, $display, $options);
+
+    $this->entityType = $this->getEntityType();
+    $this->entityInfo = entity_get_info($this->entityType);
+    $this->real_field = $this->entityInfo['entity_keys']['bundle'];
+  }
+
+  /**
+   * Overrides \Drupal\views\Plugin\views\filter\InOperator::get_value_options().
+   */
+  public function get_value_options() {
+    if (!isset($this->value_options)) {
+      $types = $this->entityInfo['bundles'];
+      $this->value_title = t('@entity types', array('@entity' => $this->entityInfo['label']));
+
+      $options = array();
+      foreach ($types as $type => $info) {
+        $options[$type] = $info['label'];
+      }
+
+      asort($options);
+      $this->value_options = $options;
+    }
+
+    return $this->value_options;
+  }
+
+  /**
+   * Overrides \Drupal\views\Plugin\views\filter\InOperator::query().
+   */
+  public function query() {
+    // Make sure that the entity base table is in the query.
+    $this->ensureMyTable();
+    parent::query();
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityTest.php b/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityTest.php
new file mode 100644
index 0000000..ffd0784
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Entity/FilterEntityTest.php
@@ -0,0 +1,99 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\views\Tests\Entity\FilterEntityTest.
+ */
+
+namespace Drupal\views\Tests\Entity;
+
+use Drupal\views\Tests\ViewTestBase;
+
+/**
+ * Tests the EntityType generic filter handler.
+ */
+class FilterEntityTest extends ViewTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_entity_type_filter');
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('entity_test');
+
+  /**
+   * @todo.
+   */
+  protected $entityInfo;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Filter: Entity type',
+      'description' => 'Tests the generic entity type bundle filter.',
+      'group' => 'Views Handlers',
+    );
+  }
+
+  public function setUp() {
+    parent::setUp();
+
+    $this->entityInfo = entity_get_info('entity_test');
+
+    foreach ($this->entityInfo['bundles'] as $key => $info) {
+      for ($i = 0; $i < 5; $i++) {
+        $entity = entity_create('entity_test', array('name' => $this->randomName(), 'user_id' => 1, 'type' => $key));
+        $entity->save();
+      }
+    }
+  }
+
+  /**
+   * Tests the get_entity method.
+   */
+  public function testFilterEntity() {
+    $view = views_get_view('test_entity_type_filter');
+    $this->executeView($view);
+
+    // Test we have all the results, with all types selected.
+    $this->assertEqual(count($view->result), 10);
+
+    // Test the value_options of the filter handler.
+    $expected = array();
+    foreach ($this->entityInfo['bundles'] as $key => $info) {
+      $expected[$key] = $info['label'];
+    }
+    $this->assertIdentical($view->filter['type']->get_value_options(), $expected);
+
+    $view->destroy();
+
+    foreach ($this->entityInfo['bundles'] as $key => $info) {
+      // Test each bundle type.
+      $view->initDisplay();
+      $filters = $view->display_handler->getOption('filters');
+      $filters['type']['value'] = drupal_map_assoc(array($key));
+      $view->display_handler->setOption('filters', $filters);
+      $this->executeView($view);
+
+      $this->assertEqual(count($view->result), 5);
+
+      $view->destroy();
+    }
+
+    // Test an invalid bundle type.
+    $view->initDisplay();
+    $filters = $view->display_handler->getOption('filters');
+    $filters['type']['value'] = drupal_map_assoc(array('type_3'));
+    $view->display_handler->setOption('filters', $filters);
+    $this->executeView($view);
+
+    $this->assertEqual(count($view->result), 0);
+  }
+
+}
diff --git a/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml
new file mode 100644
index 0000000..b1b4d9a
--- /dev/null
+++ b/core/modules/views/tests/views_test_config/test_views/views.view.test_entity_type_filter.yml
@@ -0,0 +1,82 @@
+base_table: entity_test
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: '0'
+    display_options:
+      fields:
+        id:
+          id: id
+          table: entity_test
+          field: id
+          relationship: none
+        type:
+          id: type
+          table: entity_test
+          field: type
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Type
+          exclude: '0'
+          alter:
+            alter_text: '0'
+            text: ''
+            make_link: '0'
+            path: ''
+            absolute: '0'
+            external: '0'
+            replace_spaces: '0'
+            path_case: none
+            trim_whitespace: '0'
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: '0'
+            max_length: ''
+            word_boundary: '1'
+            ellipsis: '1'
+            more_link: '0'
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: '0'
+            trim: '0'
+            preserve_tags: ''
+            html: '0'
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: '1'
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: '1'
+          empty: ''
+          hide_empty: '0'
+          empty_zero: '0'
+          hide_alter_empty: '1'
+      defaults:
+        fields: '0'
+        filters: '0'
+      filters:
+        type:
+          id: type
+          table: entity_test
+          field: type
+          relationship: none
+          value:
+            all: all
+            test_1: test_1
+            test_2: test_2
+human_name: ''
+id: test_entity_type_filter
+tag: ''
+base_field: id
