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/ViewExecutable.php b/core/modules/views/src/ViewExecutable.php
index 9214808..e236447 100644
--- a/core/modules/views/src/ViewExecutable.php
+++ b/core/modules/views/src/ViewExecutable.php
@@ -1900,6 +1900,7 @@ public function addHandler($display_id, $type, $table, $field, $options = array(
     $types = $this::getHandlerTypes();
     $this->setDisplay($display_id);
 
+    $data = Views::viewsData()->get($table);
     $fields = $this->displayHandlers->get($display_id)->getOption($types[$type]['plural']);
 
     if (empty($id)) {
@@ -1915,8 +1916,11 @@ 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'];
+    }
+
     // 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/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/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);
+  }
+
 }
