diff --git a/core/lib/Drupal/Core/Extension/ModuleHandler.php b/core/lib/Drupal/Core/Extension/ModuleHandler.php
index 6bc848e..7d08351 100644
--- a/core/lib/Drupal/Core/Extension/ModuleHandler.php
+++ b/core/lib/Drupal/Core/Extension/ModuleHandler.php
@@ -842,6 +842,9 @@ public function uninstall($module_list = array(), $uninstall_dependents = TRUE)
       $module_list = array_keys($module_list);
     }
 
+    // Allow modules to react prior to the uninstallation of modules.
+    $this->invokeAll('modules_preuninstall', array($module_list));
+
     $schema_store = \Drupal::keyValue('system.schema');
     $disabled_config = config('system.module.disabled');
     foreach ($module_list as $module) {
diff --git a/core/modules/system/system.api.php b/core/modules/system/system.api.php
index 2b362a0..24e8db4 100644
--- a/core/modules/system/system.api.php
+++ b/core/modules/system/system.api.php
@@ -2017,6 +2017,18 @@ function hook_modules_disabled($modules) {
 }
 
 /**
+ * Perform necessary actions before modules are uninstalled.
+ *
+ * This function allows all modules to react prior to modules being uninstalled.
+ *
+ * @param $modules
+ *   An array of modules about to be uninstalled.
+ */
+function hook_modules_preuninstall($modules) {
+  mymodule_cache_clear();
+}
+
+/**
  * Perform necessary actions after modules are uninstalled.
  *
  * This function differs from hook_uninstall() in that it gives all other
