diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index fb19c4e..4fa3278 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -12,6 +12,7 @@
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageManagerInterface;
+use Drupal\Core\Render\Element;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -133,11 +134,19 @@ public function buildContent(array $entities, array $displays, $view_mode, $lang
    * @return array
    */
   protected function getBuildDefaults(EntityInterface $entity, $view_mode, $langcode) {
+    $that = $this;
+    // Create a closure that uses the current execution context object as its
+    // invocation object.
+    $callback = function ($elements) use ($that) {
+      return $that->entityViewBuilderPreRender($elements);
+    };
+
     $return = array(
       '#theme' => $this->entityType,
       "#{$this->entityType}" => $entity,
       '#view_mode' => $view_mode,
       '#langcode' => $langcode,
+      '#pre_render' => array($callback),
     );
 
     // Cache the rendered output if permitted by the view mode and global entity
@@ -158,6 +167,61 @@ protected function getBuildDefaults(EntityInterface $entity, $view_mode, $langco
   }
 
   /**
+   * Performs pre-render tasks on an entity view.
+   *
+   * This function is assigned as a #pre_render callback in
+   * \Drupal\Core\Entity\EntityViewBuilder::getBuildDefaults().
+   *
+   * @param array $elements
+   *   A structured array containing build information and context for an
+   *   entity view.
+   *
+   * @see drupal_render()
+   */
+  public function entityViewBuilderPreRender(array $elements) {
+    $build = array();
+    $entity = $elements['#entity'];
+    $view_hook = $elements['#view_hook'];
+    $display = $elements['#display'];
+    $entity_view_mode = $elements['#entity_view_mode'];
+    $view_modes = $elements['#view_modes'];
+    $displays = $elements['#displays'];
+    $langcode = $elements['#langcode'];
+
+    \Drupal::moduleHandler()->invokeAll($view_hook, array($entity, $display, $entity_view_mode, $langcode));
+    \Drupal::moduleHandler()->invokeAll('entity_view', array($entity, $display, $entity_view_mode, $langcode));
+
+    foreach ($view_modes as $mode => $view_mode_entities) {
+      // expensive stuff here!!!
+      // go through field by field and invoke formatters.
+      // entity->content becomes the renderable
+      $this->buildContent($view_mode_entities, $displays[$mode], $mode, $langcode);
+    }
+    unset($elements['#view_modes']);
+    unset($elements['#displays']);
+    unset($elements['#langcode']);
+
+    $build = $entity->content;
+
+    // Apply defaults on top of the content.
+    $build += $elements;
+    // We don't need duplicate rendering info in $entity->content.
+    unset($entity->content);
+    $this->alterBuild($build, $entity, $display, $entity_view_mode, $langcode);
+
+    // Assign the weights configured in the display.
+    foreach ($display->getComponents() as $name => $options) {
+      if (isset($build[$name])) {
+        $build[$name]['#weight'] = $options['weight'];
+      }
+    }
+
+    // Allow modules to modify the render array.
+    \Drupal::moduleHandler()->alter(array($view_hook, 'entity_view'), $build, $entity, $display);
+    return $build;
+  }
+
+  /**
    * Specific per-entity building.
    *
    * @param array $build
@@ -180,7 +244,7 @@ protected function alterBuild(array &$build, EntityInterface $entity, EntityView
    */
   public function view(EntityInterface $entity, $view_mode = 'full', $langcode = NULL) {
     $buildList = $this->viewMultiple(array($entity), $view_mode, $langcode);
-    return $buildList[0];
+    return $buildList;
   }
 
   /**
@@ -215,37 +279,29 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
       }
     }
 
-    foreach ($view_modes as $mode => $view_mode_entities) {
-      $this->buildContent($view_mode_entities, $displays[$mode], $mode, $langcode);
-    }
-
-    $view_hook = "{$this->entityType}_view";
     $build = array('#sorted' => TRUE);
+    // Process individual entities.
+    $view_hook = "{$this->entityType}_view";
     $weight = 0;
     foreach ($entities as $key => $entity) {
       $entity_view_mode = isset($entity->content['#view_mode']) ? $entity->content['#view_mode'] : $view_mode;
       $display = $displays[$entity_view_mode][$entity->bundle()];
-      module_invoke_all($view_hook, $entity, $display, $entity_view_mode, $langcode);
-      module_invoke_all('entity_view', $entity, $display, $entity_view_mode, $langcode);
 
-      $build[$key] = $entity->content;
-      // We don't need duplicate rendering info in $entity->content.
-      unset($entity->content);
+      //$build[$key] = $entity->content;
+      $build[$key] = array(
+        '#entity' => $entity,
+        '#view_modes' => $view_modes,
+        '#displays' => $displays,
+        '#langcode' => $langcode,
+        '#display' => $display,
+        '#view_hook' => $view_hook,
+        '#entity_view_mode' => $entity_view_mode,
+      );
 
+      // Set defaults for #pre_render.
       $build[$key] += $this->getBuildDefaults($entity, $entity_view_mode, $langcode);
-      $this->alterBuild($build[$key], $entity, $display, $entity_view_mode, $langcode);
-
-      // Assign the weights configured in the display.
-      foreach ($display->getComponents() as $name => $options) {
-        if (isset($build[$key][$name])) {
-          $build[$key][$name]['#weight'] = $options['weight'];
-        }
-      }
 
       $build[$key]['#weight'] = $weight++;
-
-      // Allow modules to modify the render array.
-      drupal_alter(array($view_hook, 'entity_view'), $build[$key], $entity, $display);
     }
 
     return $build;
