diff --git a/domain_source/config/schema/domain_source.views.schema.yml b/domain_source/config/schema/domain_source.views.schema.yml
new file mode 100644
index 0000000..5ce71d5
--- /dev/null
+++ b/domain_source/config/schema/domain_source.views.schema.yml
@@ -0,0 +1,9 @@
+views.field.domain_source:
+  type: views_field
+  label: 'Domain source'
+views.filter.domain_source:
+  type: views.filter.in_operator
+  label: 'Domain source'
+views.filter_value.domain_source:
+  type: views.filter_value.in_operator
+  label: 'Domain source'
diff --git a/domain_source/domain_source.module b/domain_source/domain_source.module
index 78b04f2..395794b 100644
--- a/domain_source/domain_source.module
+++ b/domain_source/domain_source.module
@@ -142,3 +142,12 @@ function domain_source_form_node_form_alter(&$form, FormStateInterface $form_sta
   $hide = TRUE;
   $form = $manager->setFormOptions($form, $form_state, DOMAIN_SOURCE_FIELD, $hide);
 }
+
+/**
+ * Implements hook_views_data_alter.
+ */
+function domain_source_views_data_alter(array &$data) {
+  $table = 'node__' . DOMAIN_SOURCE_FIELD;
+  $data[$table][DOMAIN_ACCESS_FIELD]['field']['id'] = 'domain_source';
+  $data[$table][DOMAIN_SOURCE_FIELD . '_target_id']['filter']['id'] = 'domain_source';
+}
diff --git a/domain_source/src/Plugin/views/field/DomainSource.php b/domain_source/src/Plugin/views/field/DomainSource.php
new file mode 100644
index 0000000..756acbe
--- /dev/null
+++ b/domain_source/src/Plugin/views/field/DomainSource.php
@@ -0,0 +1,50 @@
+<?php
+
+namespace Drupal\domain_source\Plugin\views\field;
+
+use Drupal\views\Plugin\views\field\EntityField;
+use Drupal\views\ResultRow;
+
+/**
+ * Field handler to present the link an entity on a domain.
+ *
+ * @ViewsField("domain_source")
+ */
+class DomainSource extends EntityField {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getItems(ResultRow $values) {
+    $items = parent::getItems($values);
+    // Override the default link generator, which wants to send us to the entity
+    // page, not the entity we are looking at.
+    if (!empty($this->options['settings']['link'])) {
+      foreach ($items as &$item) {
+        $object = $item['raw'];
+        $entity = $object->getEntity();
+        $url = $entity->toUrl()->toString();
+        $domain = $item['rendered']['#options']['entity'];
+        $item['rendered']['#type'] = 'markup';
+        $item['rendered']['#markup'] = '<a href="' . $domain->buildUrl($url) . '">' . $domain->label() . '</a>';
+      }
+      uasort($items, array($this, 'sort'));
+    }
+
+    return $items;
+  }
+
+  /**
+   * Sort the domain list, if possible.
+   */
+  private function sort($a, $b) {
+    $domainA = isset($a['rendered']['#options']['entity']) ? $a['rendered']['#options']['entity'] : 0;
+    $domainB = isset($b['rendered']['#options']['entity']) ? $b['rendered']['#options']['entity'] : 0;
+    if ($domainA !== 0) {
+      return $domainA->getWeight() > $domainB->getWeight();
+    }
+    // We don't have a domain object so sort as best we can.
+    return $a['rendered']['#plain_text'] > $b['rendered']['#plain_text'];
+  }
+
+}
diff --git a/domain_source/src/Plugin/views/filter/DomainSource.php b/domain_source/src/Plugin/views/filter/DomainSource.php
new file mode 100644
index 0000000..f5fb882
--- /dev/null
+++ b/domain_source/src/Plugin/views/filter/DomainSource.php
@@ -0,0 +1,41 @@
+<?php
+
+namespace Drupal\domain_source\Plugin\views\filter;
+
+use Drupal\views\Plugin\views\filter\InOperator;
+
+/**
+ * Filter by published status.
+ *
+ * @ingroup views_filter_handlers
+ *
+ * @ViewsFilter("domain_source")
+ */
+class DomainSource extends InOperator {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValueOptions() {
+    if (!isset($this->valueOptions)) {
+      $this->valueTitle = $this->t('Domains');
+      $this->valueOptions = [
+        '_active' => $this->t('Active domain'),
+      ] + \Drupal::service('domain.loader')->loadOptionsList();
+    }
+    return $this->valueOptions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function query() {
+    if (!empty($this->value['_active'])) {
+      $active_id = \Drupal::service('domain.negotiator')->getActiveId();
+      $this->value[$active_id] = $active_id;
+    }
+    unset($this->value['_active']);
+
+    parent::query();
+  }
+}
