diff --git a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
index 4c56bff..d078cd3 100644
--- a/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
+++ b/core/modules/field/lib/Drupal/field/Plugin/views/field/Field.php
@@ -10,6 +10,8 @@
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\field\FieldPluginBase;
 use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Entity\EntityStorageControllerInterface;
+use Drupal\Core\Entity\EntityInterface;
 
 /**
  * A field that displays fieldapi fields.
@@ -66,6 +68,13 @@ class Field extends FieldPluginBase {
    */
   public $instance;
 
+  /**
+   * Stores the output of all rendered fields.
+   *
+   * @var array
+   */
+  protected $fieldOutput = array();
+
   public function init(ViewExecutable $view, &$options) {
     parent::init($view, $options);
 
@@ -635,39 +644,104 @@ function render_items($items) {
   }
 
   /**
+   * Implements \Drupal\views\Plugin\views\field\FieldPluginBase::pre_render().
+   */
+  public function pre_render(&$values) {
+    parent::pre_render($values);
+
+    $this->prepareAllRows($values);
+  }
+
+
+  /**
+   * Renders all fields of all rows using entity display objects.
+   */
+  protected function prepareAllRows($values) {
+    $entity_type = $this->getEntityType();
+
+    $entities = array();
+    $bundles = array();
+    foreach ($values as $row) {
+      // @todo Check out this part.
+      $entity = $this->get_entity($row);
+      if (!$entity) {
+        continue;
+      }
+      // @todo One problem with using process_entity before rendering is that this might interfere with other instances
+      //   of this field on the view.
+      $entity = $this->process_entity($entity);
+      if (!$entity) {
+        continue;
+      }
+
+      $entities[$entity->id()] = $entity;
+      $bundle = $entity->bundle();
+      $bundles[$bundle] = $bundle;
+    }
+
+    // Create on entity display object per bundle, so you can render entities in different bundles at the same time.
+    $displays = array();
+    foreach ($bundles as $bundle) {
+      // create a $display object:
+      $displays[$bundle] = entity_create('entity_display', array(
+        'targetEntityType' => $entity_type,
+        'bundle' => $bundle,
+        'viewMode' => $this->view->storage->get('name') . ':' . $this->view->current_display,
+      ));
+      // Configure display options for the fields in the view.
+
+      // @todo: Here you would sort of iterate over all of the fields.
+      $displays[$bundle]->setComponent($this->definition['field_name'], $this->options['settings']);
+    }
+    // Run prepare_view on all result entities.
+    field_attach_prepare_view($entity_type, $entities, $displays);
+
+    // Build render arrays for each row.
+    foreach ($values as $row) {
+      $entity = $this->get_entity($row);
+      $this->fieldOutput[$entity->id()] = field_attach_view($entity->entityType(), $entity, $displays[$entity->bundle()]);
+    }
+  }
+
+  /**
+   * Returns the fieldapi field which takes over the rendering of all of them.
+   *
+   * @return \Drupal\field\Plugin\views\field\Field
+   *   The render field.
+   */
+  public function getRenderField() {
+    foreach ($this->view->field as $field) {
+      // We use self here, so theoretically you could inherit this class for a particular field.
+      if ($field instanceof self) {
+        return $field;
+      }
+    }
+  }
+
+  /**
+   * Returns the rendered field output.
+   *
+   * @return array
+   */
+  public function getFieldOutput() {
+    return $this->fieldOutput;
+  }
+
+  /**
    * Return an array of items for the field.
    */
   function get_items($values) {
-    $original_entity = $this->get_entity($values);
-    if (!$original_entity) {
-      return array();
-    }
-    $entity = $this->process_entity($original_entity);
-    if (!$entity) {
-      return array();
-    }
-
-    $display = array(
-      'type' => $this->options['type'],
-      'settings' => $this->options['settings'],
-      'label' => 'hidden',
-      // Pass the View object in the display so that fields can act on it.
-      'views_view' => $this->view,
-      'views_field' => $this,
-      'views_row_id' => $this->view->row_index,
-    );
-
-    $entity_type = $entity->entityType();
-    $langcode = $this->field_langcode($entity_type, $entity);
-    $render_array = field_view_field($entity_type, $entity, $this->definition['field_name'], $display, $langcode);
+    $entity = $this->get_entity($values);
 
-    $items = array();
+    $output = $this->getRenderField()->getFieldOutput();
+    $render_array = $output[$entity->id()][$this->definition['field_name']];
+    // Render using the fieldapi templates.
     if ($this->options['field_api_classes']) {
-      // Make a copy.
-      $array = $render_array;
       return array(array('rendered' => drupal_render($render_array)));
     }
 
+    // Render using the formatted data itself.
+    $items = array();
     foreach (element_children($render_array) as $count) {
       $items[$count]['rendered'] = $render_array[$count];
       // field_view_field() adds an #access property to the render array that
@@ -693,13 +767,13 @@ function get_items($values) {
    * Replaces values with aggregated values if aggregation is enabled.
    * Takes delta settings into account (@todo remove in #1758616).
    *
-   * @param $entity
+   * @param \Drupal\Core\Entity\EntityInterface $entity
    *   The entity to be processed.
    *
-   * @return
-   *   TRUE if the processing completed successfully, otherwise FALSE.
+   * @return bool|\Drupal\Core\Entity\EntityInterface
+   *   Returns the processed entity if successful, else returns FALSE.
    */
-  function process_entity($entity) {
+  function process_entity(EntityInterface $entity) {
     $processed_entity = clone $entity;
 
     $entity_type = $entity->entityType();
