diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index 792be25ab6da89c52163b34d54e37d6d9d1a6bfa..6ea873af2b5eaa6ee45c812937581b7a33f0948c 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -69,8 +69,10 @@ public function listInfo() {
       $this->list = [];
       $installed_themes = $this->configFactory->get('core.extension')->get('theme');
       if (!empty($installed_themes)) {
-        $installed_themes = array_intersect_key($this->themeList->getList(), $installed_themes);
-        array_map([$this, 'addTheme'], $installed_themes);
+        $list = $this->themeList->getList();
+        foreach (array_keys($installed_themes) as $theme_name) {
+          $this->addTheme($list[$theme_name]);
+        }
       }
     }
     return $this->list;
diff --git a/core/modules/system/tests/themes/test_child_theme/test_child_theme.info.yml b/core/modules/system/tests/themes/test_child_theme/test_child_theme.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..9f053829cd4347b05e71cfa98947d1213491455e
--- /dev/null
+++ b/core/modules/system/tests/themes/test_child_theme/test_child_theme.info.yml
@@ -0,0 +1,4 @@
+name: 'Theme test child theme'
+type: theme
+version: VERSION
+base theme: test_parent_theme
diff --git a/core/modules/system/tests/themes/test_child_theme/test_child_theme.layouts.yml b/core/modules/system/tests/themes/test_child_theme/test_child_theme.layouts.yml
new file mode 100644
index 0000000000000000000000000000000000000000..7c3861ed394dd08b91ca51fa340878ac2b09374e
--- /dev/null
+++ b/core/modules/system/tests/themes/test_child_theme/test_child_theme.layouts.yml
@@ -0,0 +1,3 @@
+theme_parent_provided_layout:
+  class: '\Drupal\Core\Layout\LayoutDefault'
+  label: Child
diff --git a/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.info.yml b/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.info.yml
new file mode 100644
index 0000000000000000000000000000000000000000..6e4d4164b4e252247cd29560792a595ca2475beb
--- /dev/null
+++ b/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.info.yml
@@ -0,0 +1,4 @@
+name: 'Theme test parent theme'
+type: theme
+version: VERSION
+base theme: false
diff --git a/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.layouts.yml b/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.layouts.yml
new file mode 100644
index 0000000000000000000000000000000000000000..a07c1be3ce022fcce9e1da65050f6cee61a0ba3f
--- /dev/null
+++ b/core/modules/system/tests/themes/test_parent_theme/test_parent_theme.layouts.yml
@@ -0,0 +1,3 @@
+theme_parent_provided_layout:
+  class: '\Drupal\Core\Layout\LayoutDefault'
+  label: Parent
diff --git a/core/tests/Drupal/KernelTests/Core/Layout/LayoutPluginManagerTest.php b/core/tests/Drupal/KernelTests/Core/Layout/LayoutPluginManagerTest.php
new file mode 100644
index 0000000000000000000000000000000000000000..050f76567c8e039468e11560d418a92c90ce40e9
--- /dev/null
+++ b/core/tests/Drupal/KernelTests/Core/Layout/LayoutPluginManagerTest.php
@@ -0,0 +1,64 @@
+<?php
+
+declare(strict_types=1);
+
+namespace Drupal\KernelTests\Core\Layout;
+
+use Drupal\Core\Layout\LayoutDefinition;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Layout\LayoutPluginManager
+ * @group Layout
+ */
+class LayoutPluginManagerTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected static $modules = ['layout_discovery'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp(): void {
+    parent::setUp();
+
+    $this->container->get('theme_installer')->install(['test_child_theme']);
+    $this->activateTheme('test_child_theme');
+  }
+
+  /**
+   * Tests that layout plugins are correctly overridden.
+   */
+  public function testPluginOverride(): void {
+    /** @var \Drupal\Core\Layout\LayoutPluginManagerInterface $layouts_manager */
+    $layouts_manager = $this->container->get('plugin.manager.core.layout');
+    $definitions = $layouts_manager->getDefinitions();
+
+    $this->assertInstanceOf(LayoutDefinition::class, $definitions['theme_parent_provided_layout']);
+    $this->assertSame('Child', $definitions['theme_parent_provided_layout']->getLabel()->render());
+  }
+
+  /**
+   * Activates a specified theme.
+   *
+   * Installs the theme if not already installed and makes it the active theme.
+   *
+   * @param string $theme_name
+   *   The name of the theme to be activated.
+   */
+  protected function activateTheme(string $theme_name): void {
+    $this->container->get('theme_installer')->install([$theme_name]);
+
+    /** @var \Drupal\Core\Theme\ThemeInitializationInterface $theme_initializer */
+    $theme_initializer = $this->container->get('theme.initialization');
+
+    /** @var \Drupal\Core\Theme\ThemeManagerInterface $theme_manager */
+    $theme_manager = $this->container->get('theme.manager');
+
+    $theme_manager->setActiveTheme($theme_initializer->getActiveThemeByName($theme_name));
+    $this->assertSame($theme_name, $theme_manager->getActiveTheme()->getName());
+  }
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/Theme/ThemeInstallerTest.php b/core/tests/Drupal/KernelTests/Core/Theme/ThemeInstallerTest.php
index 980a500e59f51274eea16490f66eba7dc6282ebe..71d8cd80e51d530a54b8da92e70e1afcedce5eee 100644
--- a/core/tests/Drupal/KernelTests/Core/Theme/ThemeInstallerTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Theme/ThemeInstallerTest.php
@@ -88,8 +88,8 @@ public function testInstall(): void {
    * Tests installing a sub-theme.
    */
   public function testInstallSubTheme(): void {
-    $name = 'test_subtheme';
-    $base_name = 'test_basetheme';
+    $name = 'test_child_theme';
+    $base_name = 'test_parent_theme';
 
     $themes = $this->themeHandler()->listInfo();
     $this->assertEmpty(array_keys($themes));
@@ -100,6 +100,12 @@ public function testInstallSubTheme(): void {
     $this->assertTrue(isset($themes[$name]));
     $this->assertTrue(isset($themes[$base_name]));
 
+    $expectedOrder = [
+      $base_name,
+      $name,
+    ];
+    $this->assertEquals($expectedOrder, array_keys($themes));
+
     $this->themeInstaller()->uninstall([$name]);
 
     $themes = $this->themeHandler()->listInfo();