diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index afdce40..d9a60ec 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -312,6 +312,53 @@ protected function doPostSave(EntityInterface $entity, $update) {
   /**
    * {@inheritdoc}
    */
+  public function delete(array $entities) {
+    if (!$entities) {
+      // If no entities were passed, do nothing.
+      return;
+    }
+
+    if ($this->entityType->isRevisionable()) {
+      $ids = array_map(function(ContentEntityInterface $entity) {
+        return $entity->id();
+      }, $entities);
+      $query = $this->getQuery()->allRevisions();
+      $query->condition($this->entityType->getKey('id'), $ids, 'IN');
+
+      $revisions = $this->loadMultipleRevisions(array_keys($query->execute()));
+      foreach ($revisions as $revision_id => $revision) {
+        // The default revision will be deleted as part of the entity delete.
+        if (!$revision->isDefaultRevision()) {
+          $this->doDeleteRevision($revision);
+        }
+      }
+    }
+    return parent::delete($entities);
+  }
+
+  /**
+   * Loads multiple revisions.
+   *
+   * The default implementation loads revisions one by one. This is a low
+   * performance but reliable solution for all storages.
+   *
+   * @param array $revision_ids
+   *   An array of revision IDs to load.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface[]
+   *   The specified entity revisions or empty array if none found.
+   */
+  protected function loadMultipleRevisions(array $revision_ids) {
+    $revisions = [];
+    foreach ($revision_ids as $revision_id) {
+      $revisions[$revision_id] = $this->loadRevision($revision_id);
+    }
+    return $revisions;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function doDelete($entities) {
     /** @var \Drupal\Core\Entity\ContentEntityInterface[] $entities */
     foreach ($entities as $entity) {
@@ -334,14 +381,27 @@ protected function doDelete($entities) {
   public function deleteRevision($revision_id) {
     /** @var \Drupal\Core\Entity\ContentEntityInterface $revision */
     if ($revision = $this->loadRevision($revision_id)) {
-      // Prevent deletion if this is the default revision.
-      if ($revision->isDefaultRevision()) {
-        throw new EntityStorageException('Default revision can not be deleted');
-      }
-      $this->invokeFieldMethod('deleteRevision', $revision);
-      $this->doDeleteRevisionFieldItems($revision);
-      $this->invokeHook('revision_delete', $revision);
+      $this->doDeleteRevision($revision);
+    }
+  }
+
+  /**
+   * Deletes a revision.
+   *
+   * @param \Drupal\Core\Entity\ContentEntityInterface $revision
+   *   The revision to delete.
+   *
+   * @throws \Drupal\Core\Entity\EntityStorageException
+   *   Thrown if the revision is the default revision.
+   */
+  protected function doDeleteRevision(ContentEntityInterface $revision) {
+    // Prevent deletion if this is the default revision.
+    if ($revision->isDefaultRevision()) {
+      throw new EntityStorageException('Default revision can not be deleted');
     }
+    $this->invokeFieldMethod('deleteRevision', $revision);
+    $this->doDeleteRevisionFieldItems($revision);
+    $this->invokeHook('revision_delete', $revision);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
index bb826a6..0736513 100644
--- a/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
+++ b/core/lib/Drupal/Core/Entity/Sql/SqlContentEntityStorage.php
@@ -438,6 +438,53 @@ protected function getFromStorage(array $ids = NULL) {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  protected function loadMultipleRevisions(array $revision_ids) {
+    $revisions = $this->doLoadMutlipleRevisions($revision_ids);
+
+    if ($revisions) {
+      $this->invokeStorageLoadHook($revisions);
+      $this->postLoad($revisions);
+    }
+
+    return $revisions;
+  }
+
+  /**
+   * Gets multiple entity revisions from the storage.
+   *
+   * @param array|null $revision_ids
+   *   If not empty, return entities that match these IDs. Return all entities
+   *   when NULL.
+   *
+   * @return \Drupal\Core\Entity\ContentEntityInterface[]
+   *   Array of entity revisions from the storage.
+   */
+  protected function doLoadMutlipleRevisions(array $revision_ids) {
+    $revisions = array();
+
+    if (!empty($revision_ids)) {
+      // Sanitize IDs. Before feeding ID array into buildQuery, check whether
+      // it is empty as this would load all entities.
+      $revision_ids = $this->cleanIds($revision_ids);
+    }
+
+    if ($revision_ids === NULL || $revision_ids) {
+      // Build and execute the query.
+      $query_result = $this->buildQuery(NULL, FALSE, $revision_ids)->execute();
+      $records = $query_result->fetchAllAssoc($this->revisionKey);
+
+      // Map the loaded records into entity objects and according fields.
+      if ($records) {
+        $revisions = $this->mapFromStorageRecords($records, TRUE);
+      }
+    }
+
+    return $revisions;
+  }
+
+  /**
    * Maps from storage records to entity objects, and attaches fields.
    *
    * @param array $records
@@ -644,18 +691,20 @@ protected function buildPropertyQuery(QueryInterface $entity_query, array $value
    *   An array of entity IDs, or NULL to load all entities.
    * @param $revision_id
    *   The ID of the revision to load, or FALSE if this query is asking for the
-   *   most current revision(s).
+   *   most current revision(s) and $revision_ids is not provided instead.
+   * @param $revision_ids
+   *   Revision IDs to load.
    *
    * @return \Drupal\Core\Database\Query\Select
    *   A SelectQuery object for loading the entity.
    */
-  protected function buildQuery($ids, $revision_id = FALSE) {
+  protected function buildQuery($ids, $revision_id = FALSE, $revision_ids = []) {
     $query = $this->database->select($this->entityType->getBaseTable(), 'base');
 
     $query->addTag($this->entityTypeId . '_load_multiple');
 
-    if ($revision_id) {
-      $query->join($this->revisionTable, 'revision', "revision.{$this->idKey} = base.{$this->idKey} AND revision.{$this->revisionKey} = :revisionId", array(':revisionId' => $revision_id));
+    if ($revision_id || $revision_ids) {
+      $query->join($this->revisionTable, 'revision', "revision.{$this->idKey} = base.{$this->idKey}");
     }
     elseif ($this->revisionTable) {
       $query->join($this->revisionTable, 'revision', "revision.{$this->revisionKey} = base.{$this->revisionKey}");
@@ -692,6 +741,13 @@ protected function buildQuery($ids, $revision_id = FALSE) {
     if ($ids) {
       $query->condition("base.{$this->idKey}", $ids, 'IN');
     }
+    if ($revision_id) {
+      $query->condition("revision.{$this->revisionKey}", $revision_id);
+    }
+    if ($revision_ids) {
+      $query->condition("revision.{$this->revisionKey}", $revision_ids, 'IN');
+    }
+
 
     return $query;
   }
diff --git a/core/modules/file/src/Tests/FileFieldRevisionTest.php b/core/modules/file/src/Tests/FileFieldRevisionTest.php
index f5d00c7..5ab53f0 100644
--- a/core/modules/file/src/Tests/FileFieldRevisionTest.php
+++ b/core/modules/file/src/Tests/FileFieldRevisionTest.php
@@ -139,4 +139,62 @@ function testRevisions() {
     $this->assertFileEntryNotExists($node_file_r1, 'Original file entry is deleted after deleting the entire node with two revisions remaining.');
   }
 
+  /**
+   * Testing deletion of entity with multiple revisions.
+   *
+   * Every entity revision referencing different file.
+   */
+  public function testDeleteEntityWithMultipleRevisions() {
+    $node_storage = $this->container->get('entity.manager')->getStorage('node');
+    $type_name = 'article';
+    $field_name = strtolower($this->randomMachineName());
+
+    $this->createFileField($field_name, 'node', $type_name);
+
+    $test_file = $this->getTestFile('text');
+
+    // Create a new node with the uploaded file.
+    $nid = $this->uploadNodeFile($test_file, $field_name, $type_name);
+
+    // Check that the file exists on disk and in the database.
+    $node_storage->resetCache(array($nid));
+    $node = $node_storage->load($nid);
+    $node_file_r1 = File::load($node->{$field_name}->target_id);
+
+    // Upload another file to the same node in a new revision.
+    $this->replaceNodeFile($test_file, $field_name, $nid);
+    $node_storage->resetCache(array($nid));
+    $node = $node_storage->load($nid);
+    $node_file_r2 = File::load($node->{$field_name}->target_id);
+
+    // Check files from both revisions of Entity.
+    $this->assertFileExists($node_file_r1, 'New file saved to disk on node creation.');
+    $this->assertFileEntryExists($node_file_r1, 'File entry exists in database on node creation.');
+    $this->assertFileIsPermanent($node_file_r1, 'File is permanent.');
+
+    $this->assertFileExists($node_file_r2, 'Replacement file exists on disk after creating new revision.');
+    $this->assertFileEntryExists($node_file_r2, 'Replacement file entry exists in database after creating new revision.');
+    $this->assertFileIsPermanent($node_file_r2, 'Replacement file is permanent.');
+
+    // Delete entire Entity.
+    $node_storage->delete(array($node));
+
+    // Execute crons related to files.
+    db_update('file_managed')
+      ->fields(array(
+        'changed' => REQUEST_TIME - ($this->config('system.file')
+              ->get('temporary_maximum_age') + 1),
+      ))
+      ->condition('fid', array($node_file_r1->id(), $node_file_r2->id()), 'IN')
+      ->execute();
+    \Drupal::service('cron')->run();
+
+    // Check data integrity, both files should be removed.
+    $this->assertFileNotExists($node_file_r1, 'File from non-active revision is deleted from disk.');
+    $this->assertFileEntryNotExists($node_file_r1, 'File from non-active revision is deleted from database.');
+
+    $this->assertFileNotExists($node_file_r2, 'File from active revision is deleted from disk.');
+    $this->assertFileEntryNotExists($node_file_r2, 'File from active revision is deleted from database.');
+  }
+
 }
