diff --git a/core/modules/comment/src/Plugin/views/wizard/Comment.php b/core/modules/comment/src/Plugin/views/wizard/Comment.php
index 2d3b2b5..377eb29 100644
--- a/core/modules/comment/src/Plugin/views/wizard/Comment.php
+++ b/core/modules/comment/src/Plugin/views/wizard/Comment.php
@@ -156,6 +156,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['subject']['id'] = 'subject';
     $display_options['fields']['subject']['table'] = 'comment_field_data';
     $display_options['fields']['subject']['field'] = 'subject';
+    $display_options['fields']['subject']['entity_type'] = 'comment';
+    $display_options['fields']['subject']['entity_field'] = 'subject';
     $display_options['fields']['subject']['label'] = '';
     $display_options['fields']['subject']['alter']['alter_text'] = 0;
     $display_options['fields']['subject']['alter']['make_link'] = 0;
diff --git a/core/modules/file/src/Plugin/views/wizard/File.php b/core/modules/file/src/Plugin/views/wizard/File.php
index 0539ccf..81c1718 100644
--- a/core/modules/file/src/Plugin/views/wizard/File.php
+++ b/core/modules/file/src/Plugin/views/wizard/File.php
@@ -52,6 +52,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['filename']['id'] = 'filename';
     $display_options['fields']['filename']['table'] = 'file_managed';
     $display_options['fields']['filename']['field'] = 'filename';
+    $display_options['fields']['filename']['entity_type'] = 'file';
+    $display_options['fields']['filename']['entity_field'] = 'filename';
     $display_options['fields']['filename']['label'] = '';
     $display_options['fields']['filename']['alter']['alter_text'] = 0;
     $display_options['fields']['filename']['alter']['make_link'] = 0;
diff --git a/core/modules/node/src/Plugin/views/wizard/Node.php b/core/modules/node/src/Plugin/views/wizard/Node.php
index 2ce97ca..f25c8d3 100644
--- a/core/modules/node/src/Plugin/views/wizard/Node.php
+++ b/core/modules/node/src/Plugin/views/wizard/Node.php
@@ -136,6 +136,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['title']['id'] = 'title';
     $display_options['fields']['title']['table'] = 'node_field_data';
     $display_options['fields']['title']['field'] = 'title';
+    $display_options['fields']['title']['entity_type'] = 'node';
+    $display_options['fields']['title']['entity_field'] = 'title';
     $display_options['fields']['title']['label'] = '';
     $display_options['fields']['title']['alter']['alter_text'] = 0;
     $display_options['fields']['title']['alter']['make_link'] = 0;
diff --git a/core/modules/node/src/Plugin/views/wizard/NodeRevision.php b/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
index 3297b1c..efdcbe3 100644
--- a/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
+++ b/core/modules/node/src/Plugin/views/wizard/NodeRevision.php
@@ -97,6 +97,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['changed']['id'] = 'changed';
     $display_options['fields']['changed']['table'] = 'node_field_revision';
     $display_options['fields']['changed']['field'] = 'changed';
+    $display_options['fields']['changed']['entity_type'] = 'node';
+    $display_options['fields']['changed']['entity_field'] = 'changed';
     $display_options['fields']['changed']['alter']['alter_text'] = FALSE;
     $display_options['fields']['changed']['alter']['make_link'] = FALSE;
     $display_options['fields']['changed']['alter']['absolute'] = FALSE;
@@ -112,6 +114,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['title']['id'] = 'title';
     $display_options['fields']['title']['table'] = 'node_field_revision';
     $display_options['fields']['title']['field'] = 'title';
+    $display_options['fields']['title']['entity_type'] = 'node';
+    $display_options['fields']['title']['entity_field'] = 'title';
     $display_options['fields']['title']['label'] = '';
     $display_options['fields']['title']['alter']['alter_text'] = 0;
     $display_options['fields']['title']['alter']['make_link'] = 0;
diff --git a/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php b/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
index 10a42ac..9decc75 100644
--- a/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
+++ b/core/modules/taxonomy/src/Plugin/views/wizard/TaxonomyTerm.php
@@ -50,6 +50,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['name']['id'] = 'name';
     $display_options['fields']['name']['table'] = 'taxonomy_term_field_data';
     $display_options['fields']['name']['field'] = 'name';
+    $display_options['fields']['name']['entity_type'] = 'taxonomy_term';
+    $display_options['fields']['name']['entity_field'] = 'name';
     $display_options['fields']['name']['label'] = '';
     $display_options['fields']['name']['alter']['alter_text'] = 0;
     $display_options['fields']['name']['alter']['make_link'] = 0;
diff --git a/core/modules/user/src/Plugin/views/wizard/Users.php b/core/modules/user/src/Plugin/views/wizard/Users.php
index 92b29a9..9b3609e 100644
--- a/core/modules/user/src/Plugin/views/wizard/Users.php
+++ b/core/modules/user/src/Plugin/views/wizard/Users.php
@@ -73,6 +73,8 @@ protected function defaultDisplayOptions() {
     $display_options['fields']['name']['id'] = 'name';
     $display_options['fields']['name']['table'] = 'users_field_data';
     $display_options['fields']['name']['field'] = 'name';
+    $display_options['fields']['name']['entity_type'] = 'user';
+    $display_options['fields']['name']['entity_field'] = 'name';
     $display_options['fields']['name']['label'] = '';
     $display_options['fields']['name']['alter']['alter_text'] = 0;
     $display_options['fields']['name']['alter']['make_link'] = 0;
diff --git a/core/modules/views/config/schema/views.data_types.schema.yml b/core/modules/views/config/schema/views.data_types.schema.yml
index 0c684ca..3a9ccba 100644
--- a/core/modules/views/config/schema/views.data_types.schema.yml
+++ b/core/modules/views/config/schema/views.data_types.schema.yml
@@ -319,6 +319,12 @@ views_handler:
     admin_label:
       type: label
       label: 'A string to identify the handler instance in the admin UI.'
+    entity_type:
+      type: string
+      label: 'The entity type'
+    entity_field:
+      type: string
+      label: 'The corresponding entity field'
 
 views_argument:
   type: views_handler
diff --git a/core/modules/views/src/EntityViewsData.php b/core/modules/views/src/EntityViewsData.php
index 4bb38fe..9f361c7 100644
--- a/core/modules/views/src/EntityViewsData.php
+++ b/core/modules/views/src/EntityViewsData.php
@@ -127,7 +127,6 @@ public function getViewsData() {
     $revision_field = $this->entityType->getKey('revision');
 
     // Setup base information of the views data.
-    $data[$base_table]['table']['entity type'] = $this->entityType->id();
     $data[$base_table]['table']['group'] = $this->entityType->getLabel();
     $data[$base_table]['table']['provider'] = $this->entityType->getProvider();
     $data[$base_table]['table']['base'] = [
@@ -156,12 +155,10 @@ public function getViewsData() {
         'field' => $base_field,
         'type' => 'INNER'
       ];
-      $data[$data_table]['table']['entity type'] = $this->entityType->id();
       $data[$data_table]['table']['group'] = $this->entityType->getLabel();
       $data[$data_table]['table']['provider'] = $this->entityType->getProvider();
     }
     if ($revision_table) {
-      $data[$revision_table]['table']['entity type'] = $this->entityType->id();
       $data[$revision_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
       $data[$revision_table]['table']['provider'] = $this->entityType->getProvider();
       $data[$revision_table]['table']['base'] = array(
@@ -176,7 +173,6 @@ public function getViewsData() {
       );
 
       if ($revision_data_table) {
-        $data[$revision_data_table]['table']['entity type'] = $this->entityType->id();
         $data[$revision_data_table]['table']['group'] = $this->t('@entity_type revision', ['@entity_type' => $this->entityType->getLabel()]);
 
         $data[$revision_data_table]['table']['join'][$revision_table] = array(
@@ -204,6 +200,12 @@ public function getViewsData() {
       }
     }
 
+    // Add the entity type key to each table generated.
+    $entity_type_id = $this->entityType->id();
+    array_walk($data, function(&$table_data) use ($entity_type_id){
+      $table_data['table']['entity type'] = $entity_type_id;
+    });
+
     return $data;
   }
 
@@ -238,6 +240,8 @@ protected function mapFieldDefinition($table, $field_name, FieldDefinitionInterf
     foreach ($field_column_mapping as $field_column_name => $schema_field_name) {
       $views_field_name = ($multiple) ? $field_name . '__' . $field_column_name : $field_name;
       $table_data[$views_field_name] = $this->mapSingleFieldViewsData($table, $field_name, $field_definition_type, $field_column_name, $field_schema['columns'][$field_column_name]['type'], $first, $field_definition);
+
+      $table_data[$views_field_name]['entity field'] = $field_name;
       $first = FALSE;
     }
   }
diff --git a/core/modules/views/src/Plugin/ViewsHandlerManager.php b/core/modules/views/src/Plugin/ViewsHandlerManager.php
index 146c6a8..ac7abda 100644
--- a/core/modules/views/src/Plugin/ViewsHandlerManager.php
+++ b/core/modules/views/src/Plugin/ViewsHandlerManager.php
@@ -91,7 +91,7 @@ public function getHandler($item, $override = NULL) {
 
     if (isset($data[$field][$this->handlerType])) {
       $definition = $data[$field][$this->handlerType];
-      foreach (array('group', 'title', 'title short', 'help', 'real field', 'real table') as $key) {
+      foreach (array('group', 'title', 'title short', 'help', 'real field', 'real table', 'entity field') as $key) {
         if (!isset($definition[$key])) {
           // First check the field level.
           if (!empty($data[$field][$key])) {
diff --git a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
index 28e7afa..6a81a52 100644
--- a/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
+++ b/core/modules/views/src/Plugin/views/wizard/WizardPluginBase.php
@@ -859,10 +859,13 @@ protected function defaultDisplayOptions() {
         }
       }
     }
+    // @todo refactor the code to use ViewExecutable::addHandler
     $display_options['fields'][$default_field] = array(
       'table' => $this->base_table,
       'field' => $default_field,
       'id' => $default_field,
+      'entity_type' => isset($data[$default_field]['entity type']) ? $data[$default_field]['entity type'] : NULL,
+      'entity_field' => isset($data[$default_field]['entity field']) ? $data[$default_field]['entity field'] : NULL,
     );
 
     // Load the plugin ID and module.
diff --git a/core/modules/views/src/Tests/ViewExecutableTest.php b/core/modules/views/src/Tests/ViewExecutableTest.php
index 5b0fe2b..4b0e73f 100644
--- a/core/modules/views/src/Tests/ViewExecutableTest.php
+++ b/core/modules/views/src/Tests/ViewExecutableTest.php
@@ -309,11 +309,6 @@ public function testPropertyMethods() {
     $view->setResponse($new_response);
     $this->assertIdentical(spl_object_hash($view->getResponse()), spl_object_hash($new_response), 'New response object correctly set.');
 
-    // Test the generateHandlerId() method.
-    $test_ids = array('test' => 'test', 'test_1' => 'test_1');
-    $this->assertEqual($view->generateHandlerId('new', $test_ids), 'new');
-    $this->assertEqual($view->generateHandlerId('test', $test_ids), 'test_2');
-
     // Test the getPath() method.
     $path = $this->randomMachineName();
     $view->displayHandlers->get('page_1')->overrideOption('path', $path);
diff --git a/core/modules/views/src/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index 9214808..da8ef32 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -418,18 +418,28 @@ class ViewExecutable {
   protected $showAdminLinks;
 
   /**
+   * The views data.
+   *
+   * @var \Drupal\views\ViewsData
+   */
+  protected $viewsData;
+
+  /**
    * Constructs a new ViewExecutable object.
    *
    * @param \Drupal\views\ViewStorageInterface $storage
    *   The view config entity the actual information is stored on.
    * @param \Drupal\Core\Session\AccountInterface $user
    *   The current user.
+   * @param \Drupal\views\ViewsData $views_data
+   *   The views data.
    */
-  public function __construct(ViewStorageInterface $storage, AccountInterface $user) {
+  public function __construct(ViewStorageInterface $storage, AccountInterface $user, ViewsData $views_data) {
     // Reference the storage and the executable to each other.
     $this->storage = $storage;
     $this->storage->set('executable', $this);
     $this->user = $user;
+    $this->viewsData = $views_data;
 
     // Add the default css for a view.
     $this->element['#attached']['library'][] = 'views/views.module';
@@ -1526,9 +1536,7 @@ public function attachDisplays() {
     $this->is_attachment = TRUE;
     // Find out which other displays attach to the current one.
     foreach ($this->display_handler->getAttachedDisplays() as $id) {
-      // Create a clone for the attachments to manipulate. 'static' refers to the current class name.
-      $cloned_view = new static($this->storage, $this->user);
-      $cloned_view->setRequest($this->getRequest());
+      $cloned_view = Views::executableFactory()->get($this->storage);
       $this->displayHandlers->get($id)->attachTo($cloned_view, $this->current_display, $this->element);
     }
     $this->is_attachment = FALSE;
@@ -1900,6 +1908,7 @@ public function addHandler($display_id, $type, $table, $field, $options = array(
     $types = $this::getHandlerTypes();
     $this->setDisplay($display_id);
 
+    $data = $this->viewsData->get($table);
     $fields = $this->displayHandlers->get($display_id)->getOption($types[$type]['plural']);
 
     if (empty($id)) {
@@ -1915,8 +1924,14 @@ public function addHandler($display_id, $type, $table, $field, $options = array(
       'field' => $field,
     ) + $options;
 
+    if (isset($data['table']['entity type'])) {
+      $fields[$id]['entity_type'] = $data['table']['entity type'];
+    }
+    if (isset($data[$field]['entity field'])) {
+      $fields[$id]['entity_field'] = $data[$field]['entity field'];
+    }
+
     // Load the plugin ID if available.
-    $data = Views::viewsData()->get($table);
     if (isset($data[$field][$handler_type]['id'])) {
       $fields[$id]['plugin_id'] = $data[$field][$handler_type]['id'];
     }
diff --git a/core/modules/views/src/ViewExecutableFactory.php b/core/modules/views/src/ViewExecutableFactory.php
index 9ee217c..ed6bdd0 100644
--- a/core/modules/views/src/ViewExecutableFactory.php
+++ b/core/modules/views/src/ViewExecutableFactory.php
@@ -31,16 +31,26 @@ class ViewExecutableFactory {
   protected $requestStack;
 
   /**
+   * The views data.
+   *
+   * @var \Drupal\views\ViewsData
+   */
+  protected $viewsData;
+
+  /**
    * Constructs a new ViewExecutableFactory
    *
    * @param \Drupal\Core\Session\AccountInterface $user
    *   The current user.
    * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
    *   The request stack.
+   * @param \Drupal\views\ViewsData $views_data
+   *   The views data.
    */
-  public function __construct(AccountInterface $user, RequestStack $request_stack) {
+  public function __construct(AccountInterface $user, RequestStack $request_stack, ViewsData $views_data) {
     $this->user = $user;
     $this->requestStack = $request_stack;
+    $this->viewsData = $views_data;
   }
 
   /**
@@ -53,7 +63,7 @@ public function __construct(AccountInterface $user, RequestStack $request_stack)
    *   A ViewExecutable instance.
    */
   public function get(ViewStorageInterface $view) {
-    $view = new ViewExecutable($view, $this->user);
+    $view = new ViewExecutable($view, $this->user, $this->viewsData);
     $view->setRequest($this->requestStack->getCurrentRequest());
     return $view;
   }
diff --git a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
index 476a199..494745f 100644
--- a/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
+++ b/core/modules/views/tests/src/Unit/EntityViewsDataTest.php
@@ -342,19 +342,29 @@ public function testBaseTableFields() {
     $data = $this->viewsData->getViewsData();
 
     $this->assertNumericField($data['entity_test']['id']);
+    $this->assertField($data['entity_test']['id'], 'id');
     $this->assertUuidField($data['entity_test']['uuid']);
+    $this->assertField($data['entity_test']['uuid'], 'uuid');
     $this->assertStringField($data['entity_test']['type']);
+    $this->assertEquals('type', $data['entity_test']['type']['entity field']);
 
     $this->assertLanguageField($data['entity_test']['langcode']);
+    $this->assertField($data['entity_test']['langcode'], 'langcode');
     $this->assertEquals('Original language', $data['entity_test']['langcode']['title']);
 
     $this->assertStringField($data['entity_test']['name']);
+    $this->assertField($data['entity_test']['name'], 'name');
 
     $this->assertLongTextField($data['entity_test'], 'description');
+    $this->assertField($data['entity_test']['description__value'], 'description');
+    $this->assertField($data['entity_test']['description__format'], 'description');
 
     $this->assertUriField($data['entity_test']['homepage']);
+    $this->assertField($data['entity_test']['homepage'], 'homepage');
 
     $this->assertEntityReferenceField($data['entity_test']['user_id']);
+    $this->assertField($data['entity_test']['user_id'], 'user_id');
+
     $relationship = $data['entity_test']['user_id']['relationship'];
     $this->assertEquals('users', $relationship['base']);
     $this->assertEquals('uid', $relationship['base field']);
@@ -426,12 +436,16 @@ public function testDataTableFields() {
 
     // Check the base fields.
     $this->assertNumericField($data['entity_test_mul']['id']);
+    $this->assertField($data['entity_test_mul']['id'], 'id');
     $this->assertUuidField($data['entity_test_mul']['uuid']);
+    $this->assertField($data['entity_test_mul']['uuid'], 'uuid');
 
     $this->assertBundleField($data['entity_test_mul']['type']);
+    $this->assertField($data['entity_test_mul']['type'], 'type');
     $this->assertFalse(isset($data['entity_test_mul']['type']['relationship']));
 
     $this->assertLanguageField($data['entity_test_mul']['langcode']);
+    $this->assertField($data['entity_test_mul']['langcode'], 'langcode');
     // Also ensure that field_data only fields don't appear on the base table.
     $this->assertFalse(isset($data['entity_test_mul']['name']));
     $this->assertFalse(isset($data['entity_test_mul']['description']));
@@ -442,17 +456,24 @@ public function testDataTableFields() {
 
     // Check the data fields.
     $this->assertNumericField($data['entity_test_mul_property_data']['id']);
+    $this->assertField($data['entity_test_mul_property_data']['id'], 'id');
 
     $this->assertLanguageField($data['entity_test_mul_property_data']['langcode']);
+    $this->assertField($data['entity_test_mul_property_data']['langcode'], 'langcode');
     $this->assertEquals('Translation language', $data['entity_test_mul_property_data']['langcode']['title']);
 
     $this->assertStringField($data['entity_test_mul_property_data']['name']);
+    $this->assertField($data['entity_test_mul_property_data']['name'], 'name');
 
     $this->assertLongTextField($data['entity_test_mul_property_data'], 'description');
+    $this->assertField($data['entity_test_mul_property_data']['description__value'], 'description');
+    $this->assertField($data['entity_test_mul_property_data']['description__format'], 'description');
 
     $this->assertUriField($data['entity_test_mul_property_data']['homepage']);
+    $this->assertField($data['entity_test_mul_property_data']['homepage'], 'homepage');
 
     $this->assertEntityReferenceField($data['entity_test_mul_property_data']['user_id']);
+    $this->assertField($data['entity_test_mul_property_data']['user_id'], 'user_id');
     $relationship = $data['entity_test_mul_property_data']['user_id']['relationship'];
     $this->assertEquals('users', $relationship['base']);
     $this->assertEquals('uid', $relationship['base field']);
@@ -513,9 +534,13 @@ public function testRevisionTableFields() {
 
     // Check the base fields.
     $this->assertNumericField($data['entity_test_mulrev']['id']);
+    $this->assertField($data['entity_test_mulrev']['id'], 'id');
     $this->assertNumericField($data['entity_test_mulrev']['revision_id']);
+    $this->assertField($data['entity_test_mulrev']['revision_id'], 'revision_id');
     $this->assertUuidField($data['entity_test_mulrev']['uuid']);
+    $this->assertField($data['entity_test_mulrev']['uuid'], 'uuid');
     $this->assertStringField($data['entity_test_mulrev']['type']);
+    $this->assertField($data['entity_test_mulrev']['type'], 'type');
 
     // Also ensure that field_data only fields don't appear on the base table.
     $this->assertFalse(isset($data['entity_test_mulrev']['name']));
@@ -528,9 +553,12 @@ public function testRevisionTableFields() {
 
     // Check the revision fields.
     $this->assertNumericField($data['entity_test_mulrev_revision']['id']);
+    $this->assertField($data['entity_test_mulrev_revision']['id'], 'id');
     $this->assertNumericField($data['entity_test_mulrev_revision']['revision_id']);
+    $this->assertField($data['entity_test_mulrev_revision']['revision_id'], 'revision_id');
 
     $this->assertLanguageField($data['entity_test_mulrev_revision']['langcode']);
+    $this->assertField($data['entity_test_mulrev_revision']['langcode'], 'langcode');
     $this->assertEquals('Original language', $data['entity_test_mulrev_revision']['langcode']['title']);
 
     // Also ensure that field_data only fields don't appear on the revision table.
@@ -543,36 +571,62 @@ public function testRevisionTableFields() {
 
     // Check the data fields.
     $this->assertNumericField($data['entity_test_mulrev_property_data']['id']);
+    $this->assertField($data['entity_test_mulrev_property_data']['id'], 'id');
     $this->assertLanguageField($data['entity_test_mulrev_property_data']['langcode']);
+    $this->assertField($data['entity_test_mulrev_property_data']['langcode'], 'langcode');
     $this->assertStringField($data['entity_test_mulrev_property_data']['name']);
+    $this->assertField($data['entity_test_mulrev_property_data']['name'], 'name');
 
     $this->assertLongTextField($data['entity_test_mulrev_property_data'], 'description');
+    $this->assertField($data['entity_test_mulrev_property_data']['description__value'], 'description');
+    $this->assertField($data['entity_test_mulrev_property_data']['description__format'], 'description');
     $this->assertUriField($data['entity_test_mulrev_property_data']['homepage']);
+    $this->assertField($data['entity_test_mulrev_property_data']['homepage'], 'homepage');
 
     $this->assertEntityReferenceField($data['entity_test_mulrev_property_data']['user_id']);
+    $this->assertField($data['entity_test_mulrev_property_data']['user_id'], 'user_id');
     $relationship = $data['entity_test_mulrev_property_data']['user_id']['relationship'];
     $this->assertEquals('users', $relationship['base']);
     $this->assertEquals('uid', $relationship['base field']);
 
     // Check the property data fields.
     $this->assertNumericField($data['entity_test_mulrev_property_revision']['id']);
+    $this->assertField($data['entity_test_mulrev_property_revision']['id'], 'id');
 
     $this->assertLanguageField($data['entity_test_mulrev_property_revision']['langcode']);
+    $this->assertField($data['entity_test_mulrev_property_revision']['langcode'], 'langcode');
     $this->assertEquals('Translation language', $data['entity_test_mulrev_property_revision']['langcode']['title']);
 
     $this->assertStringField($data['entity_test_mulrev_property_revision']['name']);
+    $this->assertField($data['entity_test_mulrev_property_revision']['name'], 'name');
 
     $this->assertLongTextField($data['entity_test_mulrev_property_revision'], 'description');
+    $this->assertField($data['entity_test_mulrev_property_revision']['description__value'], 'description');
+    $this->assertField($data['entity_test_mulrev_property_revision']['description__format'], 'description');
 
     $this->assertUriField($data['entity_test_mulrev_property_revision']['homepage']);
+    $this->assertField($data['entity_test_mulrev_property_revision']['homepage'], 'homepage');
 
     $this->assertEntityReferenceField($data['entity_test_mulrev_property_revision']['user_id']);
+    $this->assertField($data['entity_test_mulrev_property_revision']['user_id'], 'user_id');
     $relationship = $data['entity_test_mulrev_property_revision']['user_id']['relationship'];
     $this->assertEquals('users', $relationship['base']);
     $this->assertEquals('uid', $relationship['base field']);
   }
 
   /**
+   * Tests generic stuff per field.
+   *
+   * @param array $data
+   *   The views data to check.
+   * @param string $field_name
+   *   The entity field name.
+   */
+  protected function assertField($data, $field_name) {
+    $this->assertEquals($field_name, $data['entity field']);
+  }
+
+  /**
    * Tests views data for a string field.
    *
    * @param $data
diff --git a/core/modules/views/tests/src/Unit/Plugin/area/ResultTest.php b/core/modules/views/tests/src/Unit/Plugin/area/ResultTest.php
index 651ef08..a289d8e 100644
--- a/core/modules/views/tests/src/Unit/Plugin/area/ResultTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/area/ResultTest.php
@@ -43,7 +43,10 @@ protected function setUp() {
       ->will($this->returnValue('ResultTest'));
 
     $user = $this->getMock('Drupal\Core\Session\AccountInterface');
-    $this->view = new ViewExecutable($storage, $user);
+    $views_data = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->view = new ViewExecutable($storage, $user, $views_data);
 
     $this->resultHandler = new Result(array(), 'result', array());
     $this->resultHandler->view = $this->view;
diff --git a/core/modules/views/tests/src/Unit/Plugin/field/CounterTest.php b/core/modules/views/tests/src/Unit/Plugin/field/CounterTest.php
index 72516cf..959ce3d 100644
--- a/core/modules/views/tests/src/Unit/Plugin/field/CounterTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/field/CounterTest.php
@@ -72,7 +72,10 @@ protected function setUp() {
 
     $storage = new View($config, 'view');
     $user = $this->getMock('Drupal\Core\Session\AccountInterface');
-    $this->view = $this->getMock('Drupal\views\ViewExecutable', NULL, array($storage, $user));
+    $views_data = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->view = $this->getMock('Drupal\views\ViewExecutable', NULL, array($storage, $user, $views_data));
 
     $this->display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
       ->disableOriginalConstructor()
diff --git a/core/modules/views/tests/src/Unit/ViewExecutableFactoryTest.php b/core/modules/views/tests/src/Unit/ViewExecutableFactoryTest.php
index d9130d5..730dd37 100644
--- a/core/modules/views/tests/src/Unit/ViewExecutableFactoryTest.php
+++ b/core/modules/views/tests/src/Unit/ViewExecutableFactoryTest.php
@@ -47,6 +47,13 @@ class ViewExecutableFactoryTest extends UnitTestCase {
   protected $viewExecutableFactory;
 
   /**
+   * The mocked views data.
+   *
+   * @var \Drupal\views\ViewsData|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $viewsData;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
@@ -55,7 +62,10 @@ protected function setUp() {
     $this->user = $this->getMock('Drupal\Core\Session\AccountInterface');
     $this->requestStack = new RequestStack();
     $this->view = $this->getMock('Drupal\views\ViewStorageInterface');
-    $this->viewExecutableFactory = new ViewExecutableFactory($this->user, $this->requestStack);
+    $this->viewsData = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->viewExecutableFactory = new ViewExecutableFactory($this->user, $this->requestStack, $this->viewsData);
   }
 
   /**
diff --git a/core/modules/views/tests/src/Unit/ViewExecutableUnitTest.php b/core/modules/views/tests/src/Unit/ViewExecutableUnitTest.php
index 13042df..89b7d0a 100644
--- a/core/modules/views/tests/src/Unit/ViewExecutableUnitTest.php
+++ b/core/modules/views/tests/src/Unit/ViewExecutableUnitTest.php
@@ -10,6 +10,7 @@
 use Drupal\Tests\UnitTestCase;
 use Drupal\views\Entity\View;
 use Drupal\views\ViewExecutable;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
 
 /**
  * @coversDefaultClass \Drupal\views\ViewExecutable
@@ -18,38 +19,75 @@
 class ViewExecutableUnitTest extends UnitTestCase {
 
   /**
+   * The mocked views data.
+   *
+   * @var \Drupal\views\ViewsData|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $viewsData;
+
+  /**
+   * The mocked user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $user;
+
+  /**
+   * A mocked display collection.
+   *
+   * @var \Drupal\views\DisplayPluginCollection|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $displayCollection;
+
+  /**
+   * The mocked view executable.
+   *
+   * @var \Drupal\views\ViewExecutableFactory|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $viewExecutableFactory;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->viewsData = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->user = $this->getMock('Drupal\Core\Session\AccountInterface');
+
+    $this->displayCollection = $this->getMockBuilder('Drupal\views\DisplayPluginCollection')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $this->viewExecutableFactory = $this->getMockBuilder('Drupal\views\ViewExecutableFactory')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $translation = $this->getStringTranslationStub();
+    $container = new ContainerBuilder();
+    $container->set('string_translation', $translation);
+    $container->set('views.executable', $this->viewExecutableFactory);
+    \Drupal::setContainer($container);
+  }
+
+  /**
    * Tests the buildThemeFunctions() method.
    */
   public function testBuildThemeFunctions() {
-    $config = array(
-      'id' => 'test_view',
-      'tag' => 'OnE, TWO, and three',
-      'display' => array(
-        'default' => array(
-          'id' => 'default',
-          'display_plugin' => 'default',
-          'display_title' => 'Default',
-        ),
-      ),
-    );
-
-    $storage = new View($config, 'view');
-    $user = $this->getMock('Drupal\Core\Session\AccountInterface');
-    $view = new ViewExecutable($storage, $user);
+    /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */
+    /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */
+    list($view, $display) = $this->setupBaseViewAndDisplay();
 
+    unset($view->display_handler);
     $expected = array(
       'test_hook__test_view',
       'test_hook'
     );
     $this->assertEquals($expected, $view->buildThemeFunctions('test_hook'));
 
-    // Add a mock display.
-    $display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
-      ->disableOriginalConstructor()
-      ->getMock();
-    $display->display = $config['display']['default'];
     $view->display_handler = $display;
-
     $expected = array(
       'test_hook__test_view__default',
       'test_hook__default',
@@ -78,4 +116,192 @@ public function testBuildThemeFunctions() {
     $this->assertEquals($expected, $view->buildThemeFunctions('test_hook'));
   }
 
+  /**
+   * Tests the generateHandlerId method().
+   *
+   * @covers ::generateHandlerId()
+   */
+  public function testGenerateHandlerId() {
+    // Test the generateHandlerId() method.
+    $test_ids = ['test' => 'test', 'test_1' => 'test_1'];
+    $this->assertEquals(ViewExecutable::generateHandlerId('new', $test_ids), 'new');
+    $this->assertEquals(ViewExecutable::generateHandlerId('test', $test_ids), 'test_2');
+  }
+
+  /**
+   * Tests the addHandler method().
+   *
+   * @covers ::addHandler()
+   */
+  public function testAddHandler() {
+    /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */
+    /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */
+    list($view, $display) = $this->setupBaseViewAndDisplay();
+
+    $views_data = [];
+    $views_data['test_field'] = [
+      'field' => ['id' => 'standard'],
+      'filter' => ['id' => 'standard'],
+      'argument' => ['id' => 'standard'],
+      'sort' => ['id' => 'standard'],
+    ];
+
+    $this->viewsData->expects($this->atLeastOnce())
+      ->method('get')
+      ->with('test_entity')
+      ->willReturn($views_data);
+
+    foreach (['field', 'filter', 'argument', 'sort'] as $handler_type) {
+      $display->expects($this->atLeastOnce())
+        ->method('setOption')
+        ->with($this->callback(function($argument) {
+          return $argument;
+        }), ['test_field' => [
+          'id' => 'test_field',
+          'table' => 'test_entity',
+          'field' => 'test_field',
+          'plugin_id' => 'standard',
+        ]]);
+    }
+
+    foreach (['field', 'filter', 'argument', 'sort'] as $handler_type) {
+      $view->addHandler('default', $handler_type, 'test_entity', 'test_field');
+    }
+  }
+
+  /**
+   * Tests the addHandler method() with an entity field.
+   *
+   * @covers ::addHandler()
+   */
+  public function testAddHandlerWithEntityField() {
+    /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */
+    /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */
+    list($view, $display) = $this->setupBaseViewAndDisplay();
+
+    $views_data = [];
+    $views_data['table']['entity type'] = 'test_entity_type';
+    $views_data['test_field'] = [
+      'entity field' => 'test_field',
+      'field' => ['id' => 'standard'],
+      'filter' => ['id' => 'standard'],
+      'argument' => ['id' => 'standard'],
+      'sort' => ['id' => 'standard'],
+    ];
+
+    $this->viewsData->expects($this->atLeastOnce())
+      ->method('get')
+      ->with('test_entity')
+      ->willReturn($views_data);
+
+    foreach (['field', 'filter', 'argument', 'sort'] as $handler_type) {
+      $display->expects($this->atLeastOnce())
+        ->method('setOption')
+        ->with($this->callback(function($argument) {
+          return $argument;
+        }), ['test_field' => [
+          'id' => 'test_field',
+          'table' => 'test_entity',
+          'field' => 'test_field',
+          'entity_type' => 'test_entity_type',
+          'entity_field' => 'test_field',
+          'plugin_id' => 'standard',
+        ]]);
+    }
+
+    foreach (['field', 'filter', 'argument', 'sort'] as $handler_type) {
+      $view->addHandler('default', $handler_type, 'test_entity', 'test_field');
+    }
+  }
+
+  /**
+   * Tests attachDisplays().
+   *
+   * @covers ::attachDisplays()
+   */
+  public function testAttachDisplays() {
+    /** @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject $view */
+    /** @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject $display */
+    list($view, $display) = $this->setupBaseViewAndDisplay();
+
+    $display->expects($this->atLeastOnce())
+      ->method('acceptAttachments')
+      ->willReturn(TRUE);
+    $display->expects($this->atLeastOnce())
+      ->method('getAttachedDisplays')
+      ->willReturn(['page_1']);
+
+    $cloned_view = $this->getMockBuilder('Drupal\views\ViewExecutable')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->viewExecutableFactory->expects($this->atLeastOnce())
+      ->method('get')
+      ->willReturn($cloned_view);
+
+    $page_display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $display_collection = $this->getMockBuilder('Drupal\views\DisplayPluginCollection')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    $display_collection->expects($this->atLeastOnce())
+      ->method('get')
+      ->with('page_1')
+      ->willReturn($page_display);
+    $view->displayHandlers = $display_collection;
+
+    // Setup the expectations.
+
+    $page_display->expects($this->once())
+      ->method('attachTo')
+      ->with($cloned_view, 'default', $view->element);
+
+    $view->attachDisplays();
+
+
+  }
+
+  /**
+   * Setups a view executable and default display.
+   *
+   * @return array
+   *   Returns the view executable and default display.
+   */
+  protected function setupBaseViewAndDisplay() {
+    $config = array(
+      'id' => 'test_view',
+      'tag' => 'OnE, TWO, and three',
+      'display' => [
+        'default' => [
+          'id' => 'default',
+          'display_plugin' => 'default',
+          'display_title' => 'Default',
+        ],
+      ],
+    );
+
+    $storage = new View($config, 'view');
+    $view = new ViewExecutable($storage, $this->user, $this->viewsData);
+    $display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $display->display = $config['display']['default'];
+
+    $view->current_display = 'default';
+    $view->display_handler = $display;
+    $view->displayHandlers = $this->displayCollection;
+    $view->displayHandlers->expects($this->any())
+      ->method('get')
+      ->with('default')
+      ->willReturn($display);
+    $view->displayHandlers->expects($this->any())
+      ->method('has')
+      ->with('default')
+      ->willReturn(TRUE);
+
+    return array($view, $display);
+  }
+
 }
diff --git a/core/modules/views/tests/src/Unit/ViewsHandlerManagerTest.php b/core/modules/views/tests/src/Unit/ViewsHandlerManagerTest.php
index eba45da..6ed91d7 100644
--- a/core/modules/views/tests/src/Unit/ViewsHandlerManagerTest.php
+++ b/core/modules/views/tests/src/Unit/ViewsHandlerManagerTest.php
@@ -30,15 +30,38 @@ class ViewsHandlerManagerTest extends UnitTestCase {
   protected $moduleHandler;
 
   /**
+   * The mocked views data.
+   *
+   * @var \Drupal\views\ViewsData|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $viewsData;
+
+  /**
+   * The mocked factory.
+   *
+   * @var \Drupal\Component\Plugin\Factory\FactoryInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $factory;
+
+  /**
    * {@inheritdoc}
    */
   public function setUp() {
-    $views_data = $this->getMockBuilder('Drupal\views\ViewsData')
+    $this->viewsData = $this->getMockBuilder('Drupal\views\ViewsData')
       ->disableOriginalConstructor()
       ->getMock();
     $cache_backend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
     $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
-    $this->handlerManager = new ViewsHandlerManager('test', new \ArrayObject(array()), $views_data, $cache_backend, $this->moduleHandler);
+    $this->handlerManager = new ViewsHandlerManager('test', new \ArrayObject(array()), $this->viewsData, $cache_backend, $this->moduleHandler);
+  }
+
+  protected function setupMockedFactory() {
+    $this->factory = $this->getMock('Drupal\Component\Plugin\Factory\FactoryInterface');
+
+    $reflection = new \ReflectionClass($this->handlerManager);
+    $property = $reflection->getProperty('factory');
+    $property->setAccessible(TRUE);
+    $property->setValue($this->handlerManager, $this->factory);
   }
 
   /**
@@ -55,4 +78,103 @@ public function testAlterHookInvocation() {
     $this->handlerManager->getDefinitions();
   }
 
+  /**
+   * Tests getHandler() and its base information propagation.
+   */
+  public function testGetHandlerBaseInformationPropagation() {
+    $this->setupMockedFactory();
+
+    $item = [];
+    $item['table'] = 'test_table';
+    $item['field'] = 'test_field';
+
+    $views_data = [];
+    $views_data['test_field']['test']['id'] = 'test_id';
+    $views_data['test_field']['test']['more_information'] = 'test_id';
+    $views_data['test_field']['group'] = 'test_group';
+    $views_data['test_field']['title'] = 'test title';
+    $views_data['test_field']['real field'] = 'test real field';
+    $views_data['test_field']['real table'] = 'test real table';
+    $views_data['test_field']['entity field'] = 'test entity field';
+
+    $this->viewsData->expects($this->once())
+      ->method('get')
+      ->with('test_table')
+      ->willReturn($views_data);
+
+    $expected_definition = [
+      'id' => 'test_id',
+      'more_information' => 'test_id',
+      'group' => 'test_group',
+      'title' => 'test title',
+      'real field' => 'test real field',
+      'real table' => 'test real table',
+      'entity field' => 'test entity field',
+    ];
+    $plugin = $this->getMock('Drupal\views\Plugin\views\ViewsHandlerInterface');
+    $this->factory->expects($this->once())
+      ->method('createInstance')
+      ->with('test_id', $expected_definition)
+      ->willReturn($plugin);
+
+    $result = $this->handlerManager->getHandler($item);
+    $this->assertSame($plugin, $result);
+  }
+
+  /**
+   * Tests getHandler() with an override.
+   */
+  public function testGetHandlerOverride() {
+    $this->setupMockedFactory();
+
+    $item = [];
+    $item['table'] = 'test_table';
+    $item['field'] = 'test_field';
+
+    $views_data = [];
+    $views_data['test_field']['test']['id'] = 'test_id';
+
+    $this->viewsData->expects($this->once())
+      ->method('get')
+      ->with('test_table')
+      ->willReturn($views_data);
+
+    $plugin = $this->getMock('Drupal\views\Plugin\views\ViewsHandlerInterface');
+    $this->factory->expects($this->once())
+      ->method('createInstance')
+      ->with('test_override')
+      ->willReturn($plugin);
+
+    $result = $this->handlerManager->getHandler($item, 'test_override');
+    $this->assertSame($plugin, $result);
+  }
+
+  /**
+   * Tests getHandler() without an override.
+   */
+  public function testGetHandlerNoOverride() {
+    $this->setupMockedFactory();
+
+    $item = [];
+    $item['table'] = 'test_table';
+    $item['field'] = 'test_field';
+
+    $views_data = [];
+    $views_data['test_field']['test']['id'] = 'test_id';
+
+    $this->viewsData->expects($this->once())
+      ->method('get')
+      ->with('test_table')
+      ->willReturn($views_data);
+
+    $plugin = $this->getMock('Drupal\views\Plugin\views\ViewsHandlerInterface');
+    $this->factory->expects($this->once())
+      ->method('createInstance')
+      ->with('test_id')
+      ->willReturn($plugin);
+
+    $result = $this->handlerManager->getHandler($item);
+    $this->assertSame($plugin, $result);
+  }
+
 }
diff --git a/core/modules/views/tests/src/Unit/ViewsTest.php b/core/modules/views/tests/src/Unit/ViewsTest.php
index 20db207..ab9bdf8 100644
--- a/core/modules/views/tests/src/Unit/ViewsTest.php
+++ b/core/modules/views/tests/src/Unit/ViewsTest.php
@@ -31,7 +31,10 @@ protected function setUp() {
     $user = $this->getMock('Drupal\Core\Session\AccountInterface');
     $request_stack = new RequestStack();
     $request_stack->push(new Request());
-    $container->set('views.executable', new ViewExecutableFactory($user, $request_stack));
+    $views_data = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $container->set('views.executable', new ViewExecutableFactory($user, $request_stack, $views_data));
 
     $this->view = new View(array('id' => 'test_view'), 'view');
 
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index 343e0b3..9654432 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -64,7 +64,7 @@ services:
     arguments: ['@views.views_data']
   views.executable:
     class: Drupal\views\ViewExecutableFactory
-    arguments: ['@current_user', '@request_stack']
+    arguments: ['@current_user', '@request_stack', '@views.views_data']
   views.analyzer:
     class: Drupal\views\Analyzer
     arguments: ['@module_handler']
diff --git a/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php b/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
index bcc03ff..c04c32e 100644
--- a/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
+++ b/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
@@ -121,7 +121,10 @@ public function testBuildRowEntityList() {
     $user = $this->getMock('Drupal\Core\Session\AccountInterface');
     $request_stack = new RequestStack();
     $request_stack->push(new Request());
-    $executable_factory = new ViewExecutableFactory($user, $request_stack);
+    $views_data = $this->getMockBuilder('Drupal\views\ViewsData')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $executable_factory = new ViewExecutableFactory($user, $request_stack, $views_data);
     $container->set('views.executable', $executable_factory);
     $container->set('plugin.manager.views.display', $display_manager);
     \Drupal::setContainer($container);
