diff --git a/dynamic_entity_reference.views.inc b/dynamic_entity_reference.views.inc
new file mode 100644
index 0000000..3e004b1
--- /dev/null
+++ b/dynamic_entity_reference.views.inc
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Provides views data for the dynamic_entity_reference module.
+ */
+
+use Drupal\Core\Entity\ContentEntityDatabaseStorage;
+use Drupal\field\FieldStorageConfigInterface;
+
+/**
+ * Implements hook_field_views_data().
+ */
+function dynamic_entity_reference_field_views_data(FieldStorageConfigInterface $field_storage) {
+  $data = field_views_field_default_views_data($field_storage);
+  $entity_manager = \Drupal::entityManager();
+  $labels = $entity_manager->getEntityTypeLabels(TRUE);
+  $options = $labels['Content'];
+  foreach ($data as $table_name => $table_data) {
+    // Add a relationship to the entity types.
+    if ($field_storage->getSetting('exclude_entity_types')) {
+      $entity_type_ids = array_diff(array_keys($options), $field_storage->getSetting('entity_type_ids') ?: array());
+    }
+    else {
+      $entity_type_ids = array_intersect(array_keys($options), $field_storage->getSetting('entity_type_ids') ?: array());
+    }
+    foreach ($entity_type_ids as $entity_type_id) {
+      $entity_type = $entity_manager->getDefinition($entity_type_id);
+      $base_table = $entity_type->getBaseTable();
+
+      // Provide a relationship for the entity type with the entity reference
+      // field.
+      $args = array(
+        '@label' => $entity_type->getLabel(),
+        '@field_name' => $field_storage->getName(),
+      );
+      $data[$table_name][$field_storage->getName()]['relationship'] = array(
+        'id' => 'standard',
+        'base' => $base_table,
+        'entity type' => $entity_type_id,
+        'base field' => $entity_type->getKey('id'),
+        'relationship field' => $field_storage->getName() . '_target_id',
+        'title' => t('@label referenced from @field_name', $args),
+        'label' => t('@field_name: @label', $args),
+      );
+      // Provide a reverse relationship for the entity type that is referenced
+      // by the field.
+      $pseudo_field_name = 'reverse__' . $field_storage->getTargetEntityTypeId() . '__' . $field_storage->getName();
+      $data[$base_table][$pseudo_field_name]['relationship'] = array(
+        'title' => t('@label using @field_name', $args),
+        'help' => t('Relate each @label with a @field_name.', $args),
+        'id' => 'entity_reverse',
+        'field_name' => $field_storage->getName(),
+        'field table' => ContentEntityDatabaseStorage::_fieldTableName($field_storage),
+        'field field' => $field_storage->getName() . '_target_id',
+        'base' => $entity_type->getBaseTable(),
+        'base field' => $entity_type->getKey('id'),
+        'label' => t('@field_name', array('@field_name' => $field_storage->getName())),
+      );
+    }
+  }
+
+  return $data;
+}
diff --git a/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php b/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php
new file mode 100644
index 0000000..bac48d8
--- /dev/null
+++ b/src/Tests/Views/DynamicEntityReferenceRelationshipTest.php
@@ -0,0 +1,155 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\dynamic_entity_reference\Tests\Views\DynamicEntityReferenceRelationshipTest.
+ */
+
+namespace Drupal\dynamic_entity_reference\Tests\Views;
+
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\field\Entity\FieldInstanceConfig;
+use Drupal\views\Tests\ViewTestData;
+use Drupal\views\Tests\ViewUnitTestBase;
+use Drupal\views\Views;
+
+/**
+ * Tests dynamic entity reference relationship data.
+ *
+ * @group dynamic_entity_reference
+ * @see dynamic_entity_reference_field_views_data()
+ */
+class DynamicEntityReferenceRelationshipTest extends ViewUnitTestBase {
+
+  /**
+   * Views used by this test.
+   *
+   * @var array
+   */
+  public static $testViews = array('test_dynamic_entity_reference_view');
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('user', 'field', 'entity_test', 'options', 'entity_reference', 'dynamic_entity_reference', 'views', 'dynamic_entity_reference_test_views');
+
+  /**
+   * The entity_test entities used by the test.
+   *
+   * @var array
+   */
+  protected $entities = array();
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installEntitySchema('entity_test');
+
+    ViewTestData::createTestViews(get_class($this), array('dynamic_entity_reference_test_views'));
+
+    $field_storage = FieldStorageConfig::create(array(
+      'settings' => array(
+        'exclude_entity_types' => FALSE,
+        'entity_type_ids' => array('entity_test'),
+      ),
+      'entity_type' => 'entity_test',
+      'name' => 'field_test',
+      'type' => 'dynamic_entity_reference',
+      'cardinality' => FieldStorageDefinitionInterface::CARDINALITY_UNLIMITED,
+    ));
+    $field_storage->save();
+
+    $instance = FieldInstanceConfig::create(array(
+      'entity_type' => 'entity_test',
+      'field_name' => 'field_test',
+      'bundle' => 'entity_test',
+      'settings' => array(),
+    ));
+    $instance->save();
+
+    // Create some test entities which link each other.
+    $entity_storage= \Drupal::entityManager()->getStorage('entity_test');
+    $referenced_entity = $entity_storage->create(array(
+      'name' => 'item1',
+    ));
+    $referenced_entity->save();
+    $this->entities[$referenced_entity->id()] = $referenced_entity;
+
+    $entity = $entity_storage->create(array(
+      'name' => 'item2',
+    ));
+    $entity->field_test->entity = $referenced_entity;
+    $entity->save();
+    $this->assertEqual($entity->field_test[0]->entity->label(), $referenced_entity->label());
+    $this->entities[$entity->id()] = $entity;
+
+    $entity2 = $entity_storage->create(array(
+      'name' => 'item3',
+      'field_test' => array(
+        'target_type' => $entity->bundle(),
+        'target_id' => $entity->id(),
+      ),
+    ));
+    $entity2->field_test->entity = $referenced_entity;
+    $entity2->save();
+    $this->assertEqual($entity2->field_test[0]->entity->label(), $entity->label());
+    $this->assertEqual($entity2->field_test[1]->entity->label(), $referenced_entity->label());
+    $this->entities[$entity2->id()] = $entity2;
+  }
+
+  /**
+   * Tests using the views relationship.
+   */
+  public function testRelationship() {
+    // Check just the generated views data.
+    $views_data_field_test = Views::viewsData()->get('entity_test__field_test');
+    $this->assertEqual($views_data_field_test['field_test']['relationship']['id'], 'standard');
+    $this->assertEqual($views_data_field_test['field_test']['relationship']['base'], 'entity_test');
+    $this->assertEqual($views_data_field_test['field_test']['relationship']['base field'], 'id');
+    $this->assertEqual($views_data_field_test['field_test']['relationship']['relationship field'], 'field_test_target_id');
+
+    // Check the backwards reference.
+    $views_data_entity_test = Views::viewsData()->get('entity_test');
+    $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['id'], 'entity_reverse');
+    $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['base'], 'entity_test');
+    $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['base field'], 'id');
+    $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['field table'], 'entity_test__field_test');
+    $this->assertEqual($views_data_entity_test['reverse__entity_test__field_test']['relationship']['field field'], 'field_test_target_id');
+
+
+    // Check an actual test view.
+    $view = Views::getView('dynamic_entity_reference_test_views');
+    $this->executeView($view);
+
+    foreach (array_keys($view->result) as $index) {
+      // Just check that the actual ID of the entity is the expected one.
+      $this->assertEqual($view->result[$index]->id, $this->entities[$index + 1]->id());
+      // Test the forward relationship.
+      // The second and third entity refer to the first one.
+      // The value key on the result will be in the format
+      // BASE_TABLE_FIELD_NAME.
+      $this->assertEqual($view->result[$index]->entity_test_entity_test__field_test_id, $index == 0 ? NULL : 1);
+
+      if ($index > 0) {
+        // Test that the correct relationship entity is on the row.
+        $this->assertEqual($view->result[$index]->_relationship_entities['test_relationship']->id(), 1);
+      }
+    }
+
+    $view->destroy();
+    $this->executeView($view, 'embed_1');
+
+    foreach (array_keys($view->result) as $index) {
+      $this->assertEqual($view->result[$index]->id, $this->entities[$index + 1]->id());
+      // The second and third entity refer to the first one.
+      $this->assertEqual($view->result[$index]->entity_test_entity_test__field_test_id, $index == 0 ? NULL : 1);
+    }
+  }
+
+}
diff --git a/tests/modules/dynamic_entity_reference_test_views/dynamic_entity_reference_test_views.info.yml b/tests/modules/dynamic_entity_reference_test_views/dynamic_entity_reference_test_views.info.yml
new file mode 100644
index 0000000..04fb33b
--- /dev/null
+++ b/tests/modules/dynamic_entity_reference_test_views/dynamic_entity_reference_test_views.info.yml
@@ -0,0 +1,9 @@
+name: 'Entity reference test views'
+type: module
+description: 'Provides default views for views entity reference tests.'
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+ - entity_reference
+ - views
diff --git a/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml b/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml
new file mode 100644
index 0000000..ab67472
--- /dev/null
+++ b/tests/modules/dynamic_entity_reference_test_views/test_views/views.view.test_dynamic_entity_reference_view.yml
@@ -0,0 +1,68 @@
+base_table: entity_test
+core: '8'
+description: ''
+status: '1'
+display:
+  default:
+    display_options:
+      defaults:
+        fields: '0'
+        relationships: '0'
+        pager: '0'
+        pager_options: '0'
+        sorts: '0'
+      fields:
+        id:
+          field: id
+          id: id
+          relationship: none
+          table: entity_test
+          plugin_id: numeric
+        id_1:
+          field: id
+          id: id_1
+          order: ASC
+          relationship: test_relationship
+          table: entity_test
+          plugin_id: numeric
+      pager:
+        options:
+          offset: '0'
+        type: none
+      pager_options: {  }
+      sorts:
+        id:
+          field: id
+          id: id
+          order: ASC
+          relationship: none
+          table: entity_test
+          plugin_id: standard
+      relationships:
+        test_relationship:
+          id: field_test
+          table: entity_test__field_test
+          field: field_test
+          relationship: none
+          plugin_id: standard
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+  embed_1:
+    display_options:
+      defaults:
+        relationships: '0'
+      relationships:
+        test_relationship:
+          id: reverse_field_test
+          table: entity_test
+          field: reverse_field_test
+          relationship: none
+          plugin_id: standard
+    display_plugin: embed
+    display_title: Embed
+    id: embed_1
+human_name: ''
+id: test_dynamic_entity_reference_view
+tag: ''
