diff --git a/verf.module b/verf.module
index 2ee90b0..8884241 100644
--- a/verf.module
+++ b/verf.module
@@ -5,11 +5,15 @@
  * Contains hook implementations.
  */
 
+use Drupal\Core\Entity\FieldableEntityInterface;
+use Drupal\Core\Entity\Sql\SqlEntityStorageInterface;
+
 /**
  * Implements hook_views_data_alter().
  */
 function verf_views_data_alter(array &$data) {
-  $field_config_storage = \Drupal::entityTypeManager()->getStorage('field_config');
+  $manager = \Drupal::entityTypeManager();
+  $field_config_storage = $manager->getStorage('field_config');
   /** @var \Drupal\field\FieldConfigInterface[] $field_configs */
   $field_configs = $field_config_storage->loadByProperties([
     'field_type' => 'entity_reference',
@@ -37,4 +41,70 @@ function verf_views_data_alter(array &$data) {
       ];
     }
   }
-}
\ No newline at end of file
+
+  foreach ($manager->getDefinitions() as $entity_type) {
+    if (!$entity_type->isSubclassOf(FieldableEntityInterface::class)) {
+      continue;
+    }
+
+    // We cannot alter Views data if we cannot map fields to tables.
+    $entity_storage = $manager->getStorage($entity_type->id());
+    if (!($entity_storage instanceof SqlEntityStorageInterface)) {
+      continue;
+    }
+
+    /** @var \Drupal\Core\Field\FieldDefinitionInterface[] $base_field_definitions */
+    $base_field_definitions = \Drupal::service('entity_field.manager')
+      ->getBaseFieldDefinitions($entity_type->id());
+    $table_mapping = $entity_storage->getTableMapping();
+
+    // Loop through all of this entity type's stored fields.
+    foreach ($table_mapping->getTableNames() as $table_name) {
+      foreach ($table_mapping->getFieldNames($table_name) as $field_name) {
+        // Skip fields that are not base fields.
+        if (!isset($base_field_definitions[$field_name])) {
+          continue;
+        }
+
+        // Only add to entity_reference fields.
+        $base_field_storage_definition = $base_field_definitions[$field_name]->getFieldStorageDefinition();
+        if ($base_field_storage_definition->getType() !== 'entity_reference') {
+          continue;
+        }
+
+        $settings = $base_field_storage_definition->getSettings();
+        $column_name = $table_mapping->getFieldColumnName($base_field_storage_definition, $field_name);
+
+        $data[$table_name][$column_name . '_verf'] = verf_get_filter(
+          $base_field_storage_definition->getLabel(),
+          $column_name,
+          $table_name,
+          $field_name,
+          $entity_type->id(),
+          $settings['target_type']
+        );
+      }
+    }
+  }
+}
+
+/**
+ * Gets an array for views.
+ */
+function verf_get_filter($label, $column_name, $table_name, $field_name, $entity_type_id, $target_entity_type_id, $group = 'verf', $help = '') {
+  return [
+    'title' => t('@label (VERF selector)', ['@label' => $label]),
+    'group' => $group,
+    'help' => $help,
+    'filter' => [
+      'field' => $column_name,
+      'table' => $table_name,
+      'id' => 'verf',
+      'additional fields' => [],
+      'field_name' => $field_name,
+      'entity_type' => $entity_type_id,
+      'verf_target_entity_type_id' => $target_entity_type_id,
+      'allow empty' => TRUE,
+    ],
+  ];
+}
