diff --git a/plugin.module b/plugin.module
index a5bf34d..b12b44e 100644
--- a/plugin.module
+++ b/plugin.module
@@ -5,6 +5,7 @@
  * Contains hook implementations.
  */
 
+use Drupal\field\FieldStorageConfigInterface;
 use Drupal\plugin\Plugin\Field\FieldType\PluginCollectionItemInterface;
 
 function plugin_field_info_alter(array &$field_type_definitions) {
@@ -33,6 +34,41 @@ function plugin_field_widget_info_alter(array &$field_widget_definitions) {
 }
 
 /**
+ * Implements hook_field_views_data_alter().
+ */
+function plugin_field_views_data_alter(array &$data, FieldStorageConfigInterface $field_storage) {
+  // Add the "plugin_id" filter to all configurable "plugin" fields.
+  if (strpos($field_storage->getType(), 'plugin:') === 0) {
+    $table_name = $field_storage->getTargetEntityTypeId() . '__' . $field_storage->getName();
+    $original_field_name = $field_storage->getName() . '_plugin_id';
+
+    // Skip if there is no data for this field.
+    if (!isset($data[$table_name][$original_field_name])) {
+      return;
+    }
+
+    $filter_field_name = $original_field_name . '_filter';
+    $data[$table_name][$filter_field_name] = [
+      'title' => t('@label (plugin ID filter)', [
+        '@label' => $field_storage->label(),
+      ]),
+      'group' => $data[$table_name][$original_field_name]['group'],
+      'help' => $data[$table_name][$original_field_name]['help'],
+      'filter' => [
+        'field' => $original_field_name,
+        'table' => $table_name,
+        'id' => 'plugin_id',
+        'additional fields' => [],
+        'field_name' => $field_storage->getName(),
+        'entity_type' => $field_storage->getTargetEntityTypeId(),
+        'plugin_type_id' => substr($field_storage->getType(), 7),
+        'allow empty' => TRUE,
+      ],
+    ];
+  }
+}
+
+/**
  * Gets the IDs of plugin item collection field types.
  *
  * @return string[]
diff --git a/src/Plugin/views/filter/PluginId.php b/src/Plugin/views/filter/PluginId.php
new file mode 100644
index 0000000..7ad2f70
--- /dev/null
+++ b/src/Plugin/views/filter/PluginId.php
@@ -0,0 +1,75 @@
+<?php
+
+namespace Drupal\plugin\Plugin\views\filter;
+
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\plugin\PluginDefinition\PluginLabelDefinitionInterface;
+use Drupal\plugin\PluginType\PluginTypeInterface;
+use Drupal\views\Plugin\views\filter\InOperator;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a Views filter for plugin IDs.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @ViewsFilter("plugin_id")
+ */
+final class PluginId extends InOperator implements ContainerFactoryPluginInterface {
+
+  /**
+   * The plugin type.
+   *
+   * @var \Drupal\plugin\PluginType\PluginTypeInterface
+   */
+  protected $pluginType;
+
+  /**
+   * Constructs a new instance.
+   *
+   * @param mixed[] $configuration
+   *   The plugin configuration.
+   * @param string $plugin_id
+   *   The plugin ID.
+   * @param mixed[] $plugin_definition
+   *   The plugin definition.
+   * @param \Drupal\plugin\PluginType\PluginTypeInterface $plugin_type
+   *   The plugin type.
+   */
+  public function __construct(array $configuration, $plugin_id, array $plugin_definition, PluginTypeInterface $plugin_type) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->pluginType = $plugin_type;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    /** @var \Drupal\plugin\PluginType\PluginTypeManagerInterface $plugin_type_manager */
+    $plugin_type_manager = $container->get('plugin.plugin_type_manager');
+
+    return new static($configuration, $plugin_id, $plugin_definition, $plugin_type_manager->getPluginType($configuration['plugin_type_id']));
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValueOptions() {
+    if (!is_null($this->valueOptions)) {
+      return $this->valueOptions;
+    }
+
+    $this->valueOptions = [];
+    $this->valueOptions = array_map(function($plugin_definition) {
+      $plugin_definition = $this->pluginType->ensureTypedPluginDefinition($plugin_definition);
+      if ($plugin_definition instanceof PluginLabelDefinitionInterface) {
+        return $plugin_definition->getLabel();
+      }
+      return $plugin_definition->getId();
+    }, $this->pluginType->getPluginManager()->getDefinitions());
+    natcasesort($this->valueOptions);
+
+    return $this->valueOptions;
+  }
+
+}
