 core/modules/file/file.module                      |    9 +++++
 .../file/FileUsage/DatabaseFileUsageBackend.php    |   16 +++++++--
 .../Drupal/file/FileUsage/FileUsageInterface.php   |    9 +++++
 .../file/lib/Drupal/file/Tests/UsageTest.php       |   38 ++++++++++++++++++++
 4 files changed, 69 insertions(+), 3 deletions(-)

diff --git a/core/modules/file/file.module b/core/modules/file/file.module
index d37a1ba..6980430 100644
--- a/core/modules/file/file.module
+++ b/core/modules/file/file.module
@@ -40,6 +40,15 @@ function file_help($path, $arg) {
 }
 
 /**
+ * Implements hook_modules_uninstalled().
+ */
+function file_modules_uninstalled($modules) {
+  foreach ($modules as $module) {
+    file_usage()->deleteByModule($module);
+  }
+}
+
+/**
  * Implements hook_menu().
  */
 function file_menu() {
diff --git a/core/modules/file/lib/Drupal/file/FileUsage/DatabaseFileUsageBackend.php b/core/modules/file/lib/Drupal/file/FileUsage/DatabaseFileUsageBackend.php
index 80163c4..5b9b417 100644
--- a/core/modules/file/lib/Drupal/file/FileUsage/DatabaseFileUsageBackend.php
+++ b/core/modules/file/lib/Drupal/file/FileUsage/DatabaseFileUsageBackend.php
@@ -46,7 +46,7 @@ public function __construct(Connection $connection, $table = 'file_usage') {
   }
 
   /**
-   * Implements Drupal\file\FileUsage\FileUsageInterface::add().
+   * {@inheritdoc}
    */
   public function add(File $file, $module, $type, $id, $count = 1) {
     $this->connection->merge($this->tableName)
@@ -64,7 +64,7 @@ public function add(File $file, $module, $type, $id, $count = 1) {
   }
 
   /**
-   * Implements Drupal\file\FileUsage\FileUsageInterface::delete().
+   * {@inheritdoc}
    */
   public function delete(File $file, $module, $type = NULL, $id = NULL, $count = 1) {
     // Delete rows that have a exact or less value to prevent empty rows.
@@ -99,7 +99,7 @@ public function delete(File $file, $module, $type = NULL, $id = NULL, $count = 1
   }
 
   /**
-   * Implements Drupal\file\FileUsage\FileUsageInterface::listUsage().
+   * {@inheritdoc}
    */
   public function listUsage(File $file) {
     $result = $this->connection->select($this->tableName, 'f')
@@ -113,4 +113,14 @@ public function listUsage(File $file) {
     }
     return $references;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function deleteByModule($module) {
+    $this->connection->delete($this->tableName)
+      ->condition('module', $module)
+      ->execute();
+  }
+
 }
diff --git a/core/modules/file/lib/Drupal/file/FileUsage/FileUsageInterface.php b/core/modules/file/lib/Drupal/file/FileUsage/FileUsageInterface.php
index d9a248d..1e06dbb 100644
--- a/core/modules/file/lib/Drupal/file/FileUsage/FileUsageInterface.php
+++ b/core/modules/file/lib/Drupal/file/FileUsage/FileUsageInterface.php
@@ -72,4 +72,13 @@ public function delete(File $file, $module, $type = NULL, $id = NULL, $count = 1
    *
    */
   public function listUsage(File $file);
+
+  /**
+   * Removes all records for a specific module; useful for uninstalling modules.
+   *
+   * @param string $module
+   *   The name of the module using files.
+   */
+  public function deleteByModule($module);
+
 }
diff --git a/core/modules/file/lib/Drupal/file/Tests/UsageTest.php b/core/modules/file/lib/Drupal/file/Tests/UsageTest.php
index 17e51d8..7b15045 100644
--- a/core/modules/file/lib/Drupal/file/Tests/UsageTest.php
+++ b/core/modules/file/lib/Drupal/file/Tests/UsageTest.php
@@ -53,6 +53,44 @@ function testGetUsage() {
   }
 
   /**
+   * Tests file_usage()->deleteByModule().
+   */
+  function testDeleteByModule() {
+    $file = $this->createFile();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->id(),
+        'module' => 'testing',
+        'type' => 'foo',
+        'id' => 1,
+        'count' => 1
+      ))
+      ->execute();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->id(),
+        'module' => 'testing',
+        'type' => 'bar',
+        'id' => 2,
+        'count' => 2
+      ))
+      ->execute();
+    db_insert('file_usage')
+      ->fields(array(
+        'fid' => $file->id(),
+        'module' => 'file',
+        'type' => 'bar',
+        'id' => 2,
+        'count' => 2
+      ))
+      ->execute();
+
+    file_usage()->deleteByModule('testing');
+
+    $this->assertIdentical(array('file' => array('bar' => array(2 => '2'))), file_usage()->listUsage($file), 'All recors for the "testing" module have been deleted.');
+  }
+
+  /**
    * Tests file_usage()->add().
    */
   function testAddUsage() {
