diff --git a/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php b/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
index 3d064af..cd6a008 100644
--- a/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
+++ b/core/modules/file/src/Plugin/Field/FieldType/FileFieldItemList.php
@@ -4,6 +4,7 @@
 
 use Drupal\Core\Field\EntityReferenceFieldItemList;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\file\Entity\File;
 
 /**
  * Represents a configurable entity file field.
@@ -80,9 +81,31 @@ public function postSave($update) {
   public function delete() {
     parent::delete();
     $entity = $this->getEntity();
+    $entity_type = $entity->getEntityType();
 
-    // Delete all file usages within this entity.
-    foreach ($this->referencedEntities() as $file) {
+    // Find all the files referenced by this field on all the revisions of this
+    // entity.
+    $query = \Drupal::entityQueryAggregate($entity_type->id())
+      ->groupBy($this->getName())
+      ->condition($entity_type->getKey('id'), $entity->id(), '=');
+
+    if ($entity_type->isRevisionable()) {
+      $query->allRevisions();
+    }
+
+    // Filter by translation if we are not deleting the whole entity.
+    if (!$entity->isDefaultTranslation()) {
+      $query->aggregate($this->getName(), 'COUNT', $entity->language()->getId());
+    }
+
+    $fids = [];
+    foreach ($query->execute() as $row) {
+      if ($target_id = reset($row)) {
+        $fids[] = $target_id;
+      }
+    }
+
+    foreach (File::loadMultiple($fids) as $file) {
       \Drupal::service('file.usage')->delete($file, 'file', $entity->getEntityTypeId(), $entity->id(), 0);
     }
   }
diff --git a/core/modules/file/src/Tests/FileFieldRevisionTest.php b/core/modules/file/src/Tests/FileFieldRevisionTest.php
index f5d00c7..7261c74 100644
--- a/core/modules/file/src/Tests/FileFieldRevisionTest.php
+++ b/core/modules/file/src/Tests/FileFieldRevisionTest.php
@@ -139,4 +139,121 @@ function testRevisions() {
     $this->assertFileEntryNotExists($node_file_r1, 'Original file entry is deleted after deleting the entire node with two revisions remaining.');
   }
 
+  /**
+   * Tests deletion of entity with multiple revisions.
+   *
+   * Every entity revision is 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 over UI.
+    $this->drupalPostForm('/node/' . $node->id() . '/delete', array(), t('Delete'));
+
+    // 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.');
+  }
+
+  /**
+   * Tests deletion of file field usage for multiple revisions entity.
+   *
+   * Every entity revision referencing a different file, then, after deleting
+   * the field, all usages should be removed too.
+   */
+  public function testDeleteFieldWithMultipleRevisionsEntity() {
+    $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 Field over UI.
+    $this->drupalPostForm('/admin/structure/types/manage/' . $type_name . '/fields/node.' . $type_name . '.' . $field_name . '/delete', array(), t('Delete'));
+
+    // 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.');
+  }
+
 }
