diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index 1c7d9fd..2ca1ff3 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -263,7 +263,7 @@ public function loadRevision($revision_id) {
     // which attaches fields (if supported by the entity type) and calls the
     // entity type specific load callback, for example hook_node_load().
     if (!empty($queried_entities)) {
-      $this->attachLoad($queried_entities, TRUE);
+      $this->attachLoad($queried_entities, $revision_id);
     }
     return reset($queried_entities);
   }
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index 7cc7a08..67c3ce2 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -148,6 +148,56 @@ protected function buildPropertyQuery(QueryInterface $entity_query, array $value
   }
 
   /**
+   * Overrides \Drupal\Core\Entity\DatabaseStorageController::buildQuery().
+   */
+  protected function buildQuery($ids, $revision_id = FALSE) {
+    $query = db_select($this->entityInfo['base_table'], 'base');
+
+    $query->addTag($this->entityType . '_load_multiple');
+
+    if (!$this->dataTable) {
+      if ($revision_id) {
+        $query->join($this->revisionTable, 'revision', "revision.{$this->idKey} = base.{$this->idKey} AND revision.{$this->revisionKey} = :revisionId", array(':revisionId' => $revision_id));
+      }
+      elseif ($this->revisionKey) {
+        $query->join($this->revisionTable, 'revision', "revision.{$this->revisionKey} = base.{$this->revisionKey}");
+      }
+    }
+
+    // Add fields from the {entity} table.
+    $entity_fields = $this->entityInfo['schema_fields_sql']['base_table'];
+
+    if ($this->revisionKey && !$this->dataTable) {
+      // Add all fields from the {entity_revision} table.
+      $entity_revision_fields = drupal_map_assoc($this->entityInfo['schema_fields_sql']['revision_table']);
+      // The id field is provided by entity, so remove it.
+      unset($entity_revision_fields[$this->idKey]);
+
+      // Remove all fields from the base table that are also fields by the same
+      // name in the revision table.
+      $entity_field_keys = array_flip($entity_fields);
+      foreach ($entity_revision_fields as $key => $name) {
+        if (isset($entity_field_keys[$name])) {
+          unset($entity_fields[$entity_field_keys[$name]]);
+        }
+      }
+      $query->fields('revision', $entity_revision_fields);
+
+      // Compare revision id of the base and revision table, if equal then this
+      // is the default revision.
+      $query->addExpression('base.' . $this->revisionKey . ' = revision.' . $this->revisionKey, 'isDefaultRevision');
+    }
+
+    $query->fields('base', $entity_fields);
+
+    if ($ids) {
+      $query->condition("base.{$this->idKey}", $ids, 'IN');
+    }
+
+    return $query;
+  }
+
+  /**
    * Overrides DatabaseStorageController::attachLoad().
    *
    * Added mapping from storage records to entities.
@@ -220,39 +270,54 @@ protected function mapFromStorageRecords(array $records, $load_revision = FALSE)
    *
    * @param array &$entities
    *   Associative array of entities, keyed on the entity ID.
-   * @param boolean $load_revision
-   *   (optional) TRUE if the revision should be loaded, defaults to FALSE.
+   * @param int $revision_id
+   *   (optional) The revision to be loaded. Defaults to FALSE.
    */
-  protected function attachPropertyData(array &$entities, $load_revision = FALSE) {
+  protected function attachPropertyData(array &$entities, $revision_id = FALSE) {
     if ($this->dataTable) {
-      $query = db_select($this->dataTable, 'data', array('fetch' => PDO::FETCH_ASSOC))
+      // If a revision table is available, we need all the properties of the
+      // latest revision. Otherwise we fall back to the data table.
+      $table = $this->revisionTable ?: $this->dataTable;
+      $query = db_select($table, 'data', array('fetch' => PDO::FETCH_ASSOC))
         ->fields('data')
         ->condition($this->idKey, array_keys($entities))
         ->orderBy('data.' . $this->idKey);
-      if ($load_revision) {
-        // Get revision ID's.
-        $revision_ids = array();
-        foreach ($entities as $id => $entity) {
-          $revision_ids[] = $entity->get($this->revisionKey)->value;
+
+      if ($this->revisionTable) {
+        if ($revision_id) {
+          $query->condition($this->revisionKey, $revision_id);
+        }
+        else {
+          // Get revision ID's.
+          $revision_ids = array();
+          foreach ($entities as $id => $entity) {
+            $revision_ids[] = $entity->get($this->revisionKey)->value;
+          }
+          $query->condition($this->revisionKey, $revision_ids);
         }
-        $query->condition($this->revisionKey, $revision_ids);
       }
+
       $data = $query->execute();
 
-      // Fetch the field definitions to check which field is translatable.
       $field_definition = $this->getFieldDefinitions(array());
       $data_fields = array_flip($this->entityInfo['schema_fields_sql']['data_table']);
 
       foreach ($data as $values) {
         $id = $values[$this->idKey];
+
+        if ($this->revisionTable) {
+          // Unless a revision id was specified we are dealing with the default
+          // revision.
+          $entities[$id]->getBCEntity()->isDefaultRevision = intval(empty($revision_id));
+        }
+
         // Field values in default language are stored with LANGUAGE_DEFAULT as
         // key.
         $langcode = empty($values['default_langcode']) ? $values['langcode'] : LANGUAGE_DEFAULT;
         $translation = $entities[$id]->getTranslation($langcode);
 
         foreach ($field_definition as $name => $definition) {
-          // Set translatable properties only.
-          if (isset($data_fields[$name]) && !empty($definition['translatable'])) {
+          if (isset($data_fields[$name])) {
             // @todo Figure out how to determine which property has to be set.
             // Currently it's guessing, and guessing is evil!
             $property_definition = $translation->{$name}->getPropertyDefinitions();
