diff --git a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
index dea8865..1ea8db0 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityStorageBase.php
@@ -312,6 +312,32 @@ protected function doPostSave(EntityInterface $entity, $update) {
   /**
    * {@inheritdoc}
    */
+  public function delete(array $entities) {
+    if ($this->entityType->isRevisionable()) {
+      $ids = array_map(function(ContentEntityInterface $entity) {
+        return $entity->id();
+      }, $entities);
+
+      if ($ids) {
+        $query = $this->getQuery()->allRevisions();
+        $query->condition($this->entityType->getKey('id'), $ids, 'IN');
+        foreach ($query->execute() as $revision_id => $id) {
+          try {
+            $this->deleteRevision($revision_id);
+          }
+          catch (EntityStorageDeleteDefaultRevisionException $e) {
+            // The default revision will be deleted as part of the entity delete.
+            continue;
+          }
+        }
+      }
+    }
+    return parent::delete($entities);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function doDelete($entities) {
     /** @var \Drupal\Core\Entity\ContentEntityInterface[] $entities */
     foreach ($entities as $entity) {
@@ -336,7 +362,7 @@ public function deleteRevision($revision_id) {
     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');
+        throw new EntityStorageDeleteDefaultRevisionException('Default revision can not be deleted');
       }
       $this->invokeFieldMethod('deleteRevision', $revision);
       $this->doDeleteRevisionFieldItems($revision);
diff --git a/core/lib/Drupal/Core/Entity/EntityStorageDeleteDefaultRevisionException.php b/core/lib/Drupal/Core/Entity/EntityStorageDeleteDefaultRevisionException.php
new file mode 100644
index 0000000..e0324c7
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/EntityStorageDeleteDefaultRevisionException.php
@@ -0,0 +1,8 @@
+<?php
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Defines an exception thrown when trying to delete a default revision.
+ */
+class EntityStorageDeleteDefaultRevisionException extends EntityStorageException { }
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.');
+  }
+
 }
