diff --git a/core/lib/Drupal/Core/Extension/ThemeInstaller.php b/core/lib/Drupal/Core/Extension/ThemeInstaller.php
index db1226f..91c6a51 100644
--- a/core/lib/Drupal/Core/Extension/ThemeInstaller.php
+++ b/core/lib/Drupal/Core/Extension/ThemeInstaller.php
@@ -265,9 +265,6 @@ public function uninstall(array $theme_list) {
     $extension_config->save(TRUE);
     $this->state->set('system.theme.data', $current_theme_data);
 
-
-    // @todo Remove system_list().
-    $this->themeHandler->refreshInfo();
     $this->resetSystem();
 
     $this->moduleHandler->invokeAll('themes_uninstalled', [$theme_list]);
@@ -277,9 +274,15 @@ public function uninstall(array $theme_list) {
    * Resets some other systems like rebuilding the route information or caches.
    */
   protected function resetSystem() {
+    // Clear plugin manager caches.
+    \Drupal::getContainer()->get('plugin.cache_clearer')->clearCachedDefinitions();
+
+    $this->themeHandler->refreshInfo();
+
     if ($this->routeBuilder) {
       $this->routeBuilder->setRebuildNeeded();
     }
+    // @todo Remove system_list().
     $this->systemListReset();
 
     // @todo It feels wrong to have the requirement to clear the local tasks
diff --git a/core/lib/Drupal/Core/Layout/LayoutPluginManager.php b/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
index e11f105..e0a8223 100644
--- a/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
+++ b/core/lib/Drupal/Core/Layout/LayoutPluginManager.php
@@ -75,6 +75,16 @@ protected function getDiscovery() {
   /**
    * {@inheritdoc}
    */
+  public function clearCachedDefinitions() {
+    parent::clearCachedDefinitions();
+
+    // The discovery must be re-instantiated to pick up new themes and modules.
+    $this->discovery = NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function processDefinition(&$definition, $plugin_id) {
     parent::processDefinition($definition, $plugin_id);
 
