diff --git a/core/config/schema/core.entity.schema.yml b/core/config/schema/core.entity.schema.yml
index 8850d40ef7..456fbaf7cd 100644
--- a/core/config/schema/core.entity.schema.yml
+++ b/core/config/schema/core.entity.schema.yml
@@ -62,6 +62,12 @@ core.entity_view_display.*.*.*:
       sequence:
         type: boolean
         label: 'Value'
+    layout_id:
+      type: string
+      label: 'Layout ID'
+    layout_settings:
+      type: layout_plugin.settings.[%parent.layout_id]
+      label: 'Layout settings'
 
 field_formatter:
   type: mapping
@@ -142,6 +148,12 @@ core.entity_form_display.*.*.*:
       sequence:
         type: boolean
         label: 'Component'
+    layout_id:
+      type: string
+      label: 'Layout ID'
+    layout_settings:
+      type: layout_plugin.settings.[%parent.layout_id]
+      label: 'Layout settings'
 
 # Default schema for entity display field with undefined type.
 field.formatter.settings.*:
diff --git a/core/core.services.yml b/core/core.services.yml
index c42ca2dd21..cb4fa34c34 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -675,12 +675,18 @@ services:
   plugin.manager.display_variant:
     class: Drupal\Core\Display\VariantManager
     parent: default_plugin_manager
+  plugin.manager.core.layout:
+    class: Drupal\Core\Layout\LayoutPluginManager
+    arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@theme_handler']
   plugin.manager.queue_worker:
     class: Drupal\Core\Queue\QueueWorkerManager
     parent: default_plugin_manager
   plugin.cache_clearer:
     class: Drupal\Core\Plugin\CachedDiscoveryClearer
     lazy: true
+  layout.icon_builder:
+    class: Drupal\Core\Layout\Icon\SvgIconBuilder
+    shared: false
   paramconverter.menu_link:
     class: Drupal\Core\ParamConverter\MenuLinkPluginConverter
     tags:
diff --git a/core/modules/field_layout/src/Display/EntityDisplayWithLayoutInterface.php b/core/lib/Drupal/Core/Entity/Display/EntityDisplayWithLayoutInterface.php
similarity index 100%
rename from core/modules/field_layout/src/Display/EntityDisplayWithLayoutInterface.php
rename to core/lib/Drupal/Core/Entity/Display/EntityDisplayWithLayoutInterface.php
diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
index 26bdf67b32..ee4dd9d637 100644
--- a/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
+++ b/core/lib/Drupal/Core/Entity/Entity/EntityFormDisplay.php
@@ -33,6 +33,8 @@
  *     "mode",
  *     "content",
  *     "hidden",
+ *     "layout_id",
+ *     "layout_settings",
  *   }
  * )
  */
diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
index 00800b5839..adb2e2861e 100644
--- a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
+++ b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
@@ -32,6 +32,8 @@
  *     "mode",
  *     "content",
  *     "hidden",
+ *     "layout_id",
+ *     "layout_settings",
  *   }
  * )
  */
@@ -281,6 +283,7 @@ public function buildMultiple(array $entities) {
         'view_mode' => $this->originalMode,
         'display' => $this,
       ];
+      $this->applyLayout($build_list[$id]);
       \Drupal::moduleHandler()->alter('entity_display_build', $build_list[$id], $context);
     }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityDisplayBase.php b/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
index c2b6786930..53351541cc 100644
--- a/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
+++ b/core/lib/Drupal/Core/Entity/EntityDisplayBase.php
@@ -172,8 +172,8 @@ protected function init() {
           }
         }
         // Ensure extra fields have a 'region'.
-        if (isset($this->content[$name])) {
-          $this->content[$name] += ['region' => $default_region];
+        if (isset($this->content[$name]) && !isset($this->content[$name]['region'])) {
+          $this->content[$name]['region'] = $this->getDefaultRegion();
         }
       }
 
@@ -187,7 +187,9 @@ protected function init() {
             $this->removeComponent($name);
           }
           elseif ($options) {
-            $options += ['region' => $default_region];
+            if (!isset($options['region'])) {
+              $options['region'] = $this->getDefaultRegion();
+            }
             $this->setComponent($name, $options);
           }
           // Note: (base) fields that do not specify display options are not
diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index 722a9ce992..c0e8ac3419 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -523,11 +523,14 @@ protected function getSingleFieldDisplay($entity, $field_name, $display_options)
       $bundle = $entity->bundle();
       $key = $entity_type_id . ':' . $bundle . ':' . $field_name . ':' . Crypt::hashBase64(serialize($display_options));
       if (!isset($this->singleFieldDisplays[$key])) {
-        $this->singleFieldDisplays[$key] = EntityViewDisplay::create([
+        $display = EntityViewDisplay::create([
           'targetEntityType' => $entity_type_id,
           'bundle' => $bundle,
           'status' => TRUE,
-        ])->setComponent($field_name, $display_options);
+        ]);
+        $display_options += ['region' => $display->getDefaultRegion()];
+        $display->setComponent($field_name, $display_options);
+        $this->singleFieldDisplays[$key] = $display;
       }
       $display = $this->singleFieldDisplays[$key];
     }
diff --git a/core/lib/Drupal/Core/Layout/Annotation/Layout.php b/core/lib/Drupal/Core/Layout/Annotation/Layout.php
index eae930cf4e..371c1af3c8 100644
--- a/core/lib/Drupal/Core/Layout/Annotation/Layout.php
+++ b/core/lib/Drupal/Core/Layout/Annotation/Layout.php
@@ -67,9 +67,9 @@ class Layout extends Plugin {
   /**
    * The template file to render this layout (relative to the 'path' given).
    *
-   * If specified, then the layout_discovery module will register the template
-   * with hook_theme() and the module or theme registering this layout does not
-   * need to do it.
+   * If specified, then the system module will register the template with
+   * hook_theme() and the module or theme registering this layout does not need
+   * to do it.
    *
    * @var string optional
    *
diff --git a/core/lib/Drupal/Core/Layout/Plugin/Layout/DefaultLayout.php b/core/lib/Drupal/Core/Layout/Plugin/Layout/DefaultLayout.php
new file mode 100644
index 0000000000..2d650477c1
--- /dev/null
+++ b/core/lib/Drupal/Core/Layout/Plugin/Layout/DefaultLayout.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\Core\Layout\Plugin\Layout;
+
+use Drupal\Core\Layout\LayoutDefault;
+
+/**
+ * Provides a default layout with no markup.
+ *
+ * @Layout(
+ *   id = "layout_default",
+ *   label = @Translation("Default"),
+ *   category = @Translation("Columns: 1"),
+ *   regions = {
+ *     "content" = {
+ *       "label" = @Translation("Content")
+ *     },
+ *   },
+ * )
+ */
+class DefaultLayout extends LayoutDefault {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build(array $regions) {
+    $build = parent::build($regions);
+    // Remove the theme hook so no additional markup is added.
+    unset($build['#theme']);
+    return $build;
+  }
+
+}
diff --git a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.default.yml b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.default.yml
index e0232cfb51..f982504718 100644
--- a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.default.yml
+++ b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.default.yml
@@ -36,3 +36,5 @@ content:
     label: inline
 hidden:
   more_link: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.summary.yml b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.summary.yml
index 5e5e468ae5..917d410c07 100644
--- a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.summary.yml
+++ b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_feed.aggregator_feed.summary.yml
@@ -22,3 +22,5 @@ hidden:
   feed_icon: true
   image: true
   link: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
index 8e29395a81..5aa077b5a1 100644
--- a/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
+++ b/core/modules/aggregator/config/install/core.entity_view_display.aggregator_item.aggregator_item.summary.yml
@@ -18,3 +18,5 @@ hidden:
   description: true
   feed: true
   link: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml b/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml
index 4b7f304c27..1a0e859f22 100644
--- a/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml
+++ b/core/modules/book/config/optional/core.entity_form_display.node.book.default.yml
@@ -67,3 +67,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/book/config/optional/core.entity_view_display.node.book.default.yml b/core/modules/book/config/optional/core.entity_view_display.node.book.default.yml
index d6ef64df86..caf15c9bba 100644
--- a/core/modules/book/config/optional/core.entity_view_display.node.book.default.yml
+++ b/core/modules/book/config/optional/core.entity_view_display.node.book.default.yml
@@ -23,3 +23,5 @@ content:
     weight: 101
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/book/config/optional/core.entity_view_display.node.book.teaser.yml b/core/modules/book/config/optional/core.entity_view_display.node.book.teaser.yml
index 77a62c35ab..7d48aaa5ac 100644
--- a/core/modules/book/config/optional/core.entity_view_display.node.book.teaser.yml
+++ b/core/modules/book/config/optional/core.entity_view_display.node.book.teaser.yml
@@ -25,3 +25,5 @@ content:
     weight: 101
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php b/core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php
index 472df0bd7f..50994d1695 100644
--- a/core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php
+++ b/core/modules/field/tests/src/Kernel/FieldAttachOtherTest.php
@@ -18,6 +18,14 @@ protected function setUp(): void {
     $this->container->get('router.builder')->rebuild();
     $this->installEntitySchema('entity_test_rev');
     $this->createFieldWithStorage();
+
+    EntityViewMode::create([
+      'id' => 'entity_test.full',
+      'targetEntityType' => 'entity_test',
+      'status' => TRUE,
+      'enabled' => TRUE,
+      'label' => 'Full',
+    ])->save();
   }
 
   /**
@@ -61,6 +69,7 @@ public function testEntityDisplayBuild() {
       ],
     ];
     $display->setComponent($this->fieldTestData->field_name_2, $display_options_2);
+    $display->save();
 
     // View all fields.
     $content = $display->build($entity);
@@ -78,6 +87,7 @@ public function testEntityDisplayBuild() {
     $entity = clone($entity_init);
     $display_options['label'] = 'hidden';
     $display->setComponent($this->fieldTestData->field_name, $display_options);
+    $display->save();
     $content = $display->build($entity);
     $this->render($content);
     $this->assertNoRaw($this->fieldTestData->field->getLabel(), "Hidden label: label is not displayed.");
@@ -85,6 +95,7 @@ public function testEntityDisplayBuild() {
     // Field hidden.
     $entity = clone($entity_init);
     $display->removeComponent($this->fieldTestData->field_name);
+    $display->save();
     $content = $display->build($entity);
     $this->render($content);
     $this->assertNoRaw($this->fieldTestData->field->getLabel(), "Hidden field: label is not displayed.");
@@ -102,6 +113,7 @@ public function testEntityDisplayBuild() {
         'test_formatter_setting_multiple' => $formatter_setting,
       ],
     ]);
+    $display->save();
     $content = $display->build($entity);
     $this->render($content);
     $expected_output = $formatter_setting;
@@ -120,6 +132,7 @@ public function testEntityDisplayBuild() {
         'test_formatter_setting_additional' => $formatter_setting,
       ],
     ]);
+    $display->save();
     $content = $display->build($entity);
     $this->render($content);
     foreach ($values as $delta => $value) {
@@ -141,6 +154,7 @@ public function testEntityDisplayViewMultiple() {
       ->setComponent($this->fieldTestData->field_name, [
         'type' => 'field_test_with_prepare_view',
       ]);
+    $display->save();
 
     // Create two entities.
     $entity1 = EntityTest::create(['id' => 1, 'type' => 'entity_test']);
diff --git a/core/modules/field_layout/config/schema/field_layout.schema.yml b/core/modules/field_layout/config/schema/field_layout.schema.yml
deleted file mode 100644
index 185fb4ef7a..0000000000
--- a/core/modules/field_layout/config/schema/field_layout.schema.yml
+++ /dev/null
@@ -1,16 +0,0 @@
-core.entity_view_display.*.*.*.third_party.field_layout:
-  type: field_layout.third_party_settings
-
-core.entity_form_display.*.*.*.third_party.field_layout:
-  type: field_layout.third_party_settings
-
-field_layout.third_party_settings:
-  type: mapping
-  label: 'Per-view-mode field layout settings'
-  mapping:
-    id:
-      type: string
-      label: 'Layout ID'
-    settings:
-      type: layout_plugin.settings.[%parent.id]
-      label: 'Layout settings'
diff --git a/core/modules/field_layout/field_layout.info.yml b/core/modules/field_layout/field_layout.info.yml
index f4b676f25b..2b1ec12c82 100644
--- a/core/modules/field_layout/field_layout.info.yml
+++ b/core/modules/field_layout/field_layout.info.yml
@@ -3,5 +3,4 @@ type: module
 description: 'Allows users to configure the display and form display by arranging fields in several columns.'
 package: Core (Experimental)
 version: VERSION
-dependencies:
-  - drupal:layout_discovery
+hidden: true
diff --git a/core/modules/field_layout/field_layout.install b/core/modules/field_layout/field_layout.install
deleted file mode 100644
index 88882d3928..0000000000
--- a/core/modules/field_layout/field_layout.install
+++ /dev/null
@@ -1,47 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains install and update functions for Field Layout.
- */
-
-use Drupal\Core\Cache\Cache;
-use Drupal\Core\Entity\Display\EntityDisplayInterface;
-use Drupal\Core\Entity\Entity\EntityFormDisplay;
-use Drupal\Core\Entity\Entity\EntityViewDisplay;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-
-/**
- * Implements hook_install().
- */
-function field_layout_install() {
-  // Ensure each entity display has a layout.
-  $entity_save = function (EntityDisplayInterface $entity) {
-    if ($entity instanceof EntityDisplayWithLayoutInterface) {
-      $entity->ensureLayout()->save();
-    }
-  };
-  array_map($entity_save, EntityViewDisplay::loadMultiple());
-  array_map($entity_save, EntityFormDisplay::loadMultiple());
-
-  // Invalidate the render cache since all content will now have a layout.
-  Cache::invalidateTags(['rendered']);
-}
-
-/**
- * Implements hook_uninstall().
- */
-function field_layout_uninstall() {
-  // Reset each entity display to use the one-column layout to best approximate
-  // the absence of layouts.
-  $entity_save = function (EntityDisplayInterface $entity) {
-    if ($entity instanceof EntityDisplayWithLayoutInterface) {
-      $entity->setLayoutId('layout_onecol')->save();
-    }
-  };
-  array_map($entity_save, EntityViewDisplay::loadMultiple());
-  array_map($entity_save, EntityFormDisplay::loadMultiple());
-
-  // Invalidate the render cache since all content will no longer have a layout.
-  Cache::invalidateTags(['rendered']);
-}
diff --git a/core/modules/field_layout/field_layout.module b/core/modules/field_layout/field_layout.module
index 713e7e4aac..6736e623ae 100644
--- a/core/modules/field_layout/field_layout.module
+++ b/core/modules/field_layout/field_layout.module
@@ -24,44 +24,8 @@ function field_layout_help($route_name, RouteMatchInterface $route_match) {
   switch ($route_name) {
     case 'help.page.field_layout':
       $output = '<h3>' . t('About') . '</h3>';
-      $output .= '<p>' . t('The Field Layout module allows you to arrange fields into regions on forms and displays of entities such as nodes and users.') . '</p>';
+      $output .= '<p>' . t('The Field Layout module is obsolete and its functionality is now part of the Field UI module.') . '</p>';
       $output .= '<p>' . t('For more information, see the <a href=":field-layout-documentation">online documentation for the Field Layout module</a>.', [':field-layout-documentation' => 'https://www.drupal.org/documentation/modules/field_layout']) . '</p>';
       return $output;
   }
 }
-
-/**
- * Implements hook_entity_type_alter().
- */
-function field_layout_entity_type_alter(array &$entity_types) {
-  /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
-  $entity_types['entity_view_display']->setClass(FieldLayoutEntityViewDisplay::class);
-  $entity_types['entity_form_display']->setClass(FieldLayoutEntityFormDisplay::class);
-
-  // The form classes are only needed when Field UI is installed.
-  if (\Drupal::moduleHandler()->moduleExists('field_ui')) {
-    $entity_types['entity_view_display']->setFormClass('edit', FieldLayoutEntityViewDisplayEditForm::class);
-    $entity_types['entity_form_display']->setFormClass('edit', FieldLayoutEntityFormDisplayEditForm::class);
-  }
-}
-
-/**
- * Implements hook_entity_view_alter().
- */
-function field_layout_entity_view_alter(array &$build, EntityInterface $entity, EntityViewDisplayInterface $display) {
-  if ($display instanceof EntityDisplayWithLayoutInterface) {
-    \Drupal::classResolver(FieldLayoutBuilder::class)->buildView($build, $display);
-  }
-}
-
-/**
- * Implements hook_form_alter().
- */
-function field_layout_form_alter(&$form, FormStateInterface $form_state, $form_id) {
-  $form_object = $form_state->getFormObject();
-  if ($form_object instanceof ContentEntityFormInterface && $display = $form_object->getFormDisplay($form_state)) {
-    if ($display instanceof EntityDisplayWithLayoutInterface) {
-      \Drupal::classResolver(FieldLayoutBuilder::class)->buildForm($form, $display);
-    }
-  }
-}
diff --git a/core/modules/field_layout/src/Entity/FieldLayoutEntityDisplayTrait.php b/core/modules/field_layout/src/Entity/FieldLayoutEntityDisplayTrait.php
deleted file mode 100644
index 652b72b49b..0000000000
--- a/core/modules/field_layout/src/Entity/FieldLayoutEntityDisplayTrait.php
+++ /dev/null
@@ -1,161 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Entity;
-
-use Drupal\Core\Entity\EntityStorageInterface;
-use Drupal\Core\Layout\LayoutInterface;
-
-/**
- * Provides shared code for entity displays.
- *
- * Both EntityViewDisplay and EntityFormDisplay must maintain their parent
- * hierarchy, while being identically enhanced by Field Layout. This trait
- * contains the code they both share.
- */
-trait FieldLayoutEntityDisplayTrait {
-
-  /**
-   * Gets a layout definition.
-   *
-   * @param string $layout_id
-   *   The layout ID.
-   *
-   * @return \Drupal\Core\Layout\LayoutDefinition
-   *   The layout definition.
-   */
-  protected function getLayoutDefinition($layout_id) {
-    return \Drupal::service('plugin.manager.core.layout')->getDefinition($layout_id);
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayoutId().
-   */
-  public function getLayoutId() {
-    return $this->getThirdPartySetting('field_layout', 'id');
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayoutSettings().
-   */
-  public function getLayoutSettings() {
-    return $this->getThirdPartySetting('field_layout', 'settings', []);
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::setLayoutId().
-   */
-  public function setLayoutId($layout_id, array $layout_settings = []) {
-    if ($this->getLayoutId() !== $layout_id) {
-      // @todo Devise a mechanism for mapping old regions to new ones in
-      //   https://www.drupal.org/node/2796877.
-      $layout_definition = $this->getLayoutDefinition($layout_id);
-      $new_region = $layout_definition->getDefaultRegion();
-      $layout_regions = $layout_definition->getRegions();
-      foreach ($this->getComponents() as $name => $component) {
-        if (isset($component['region']) && !isset($layout_regions[$component['region']])) {
-          $component['region'] = $new_region;
-          $this->setComponent($name, $component);
-        }
-      }
-    }
-    $this->setThirdPartySetting('field_layout', 'id', $layout_id);
-    // Instantiate the plugin and consult it for the updated plugin
-    // configuration. Once layouts are no longer stored as third party settings,
-    // this will be handled by the code in
-    // \Drupal\Core\Config\Entity\ConfigEntityBase::set() that handles
-    // \Drupal\Core\Entity\EntityWithPluginCollectionInterface.
-    $layout_settings = $this->doGetLayout($layout_id, $layout_settings)->getConfiguration();
-    $this->setThirdPartySetting('field_layout', 'settings', $layout_settings);
-    return $this;
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::setLayout().
-   */
-  public function setLayout(LayoutInterface $layout) {
-    $this->setLayoutId($layout->getPluginId(), $layout->getConfiguration());
-    return $this;
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getLayout().
-   */
-  public function getLayout() {
-    return $this->doGetLayout($this->getLayoutId(), $this->getLayoutSettings());
-  }
-
-  /**
-   * Gets the layout plugin.
-   *
-   * @param string $layout_id
-   *   A layout plugin ID.
-   * @param array $layout_settings
-   *   An array of settings.
-   *
-   * @return \Drupal\Core\Layout\LayoutInterface
-   *   The layout plugin.
-   */
-  protected function doGetLayout($layout_id, array $layout_settings) {
-    return \Drupal::service('plugin.manager.core.layout')->createInstance($layout_id, $layout_settings);
-  }
-
-  /**
-   * Overrides \Drupal\Core\Entity\EntityDisplayBase::init().
-   */
-  protected function init() {
-    $this->ensureLayout();
-    parent::init();
-  }
-
-  /**
-   * Overrides \Drupal\Core\Entity\EntityDisplayBase::preSave().
-   */
-  public function preSave(EntityStorageInterface $storage) {
-    parent::preSave($storage);
-
-    // Ensure the plugin configuration is updated. Once layouts are no longer
-    // stored as third party settings, this will be handled by the code in
-    // \Drupal\Core\Config\Entity\ConfigEntityBase::preSave() that handles
-    // \Drupal\Core\Entity\EntityWithPluginCollectionInterface.
-    if ($this->getLayoutId()) {
-      $this->setLayout($this->getLayout());
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function ensureLayout($default_layout_id = 'layout_onecol') {
-    if (!$this->getLayoutId()) {
-      $this->setLayoutId($default_layout_id);
-    }
-
-    return $this;
-  }
-
-  /**
-   * Overrides \Drupal\Core\Entity\EntityDisplayBase::calculateDependencies().
-   *
-   * Ensure the plugin dependencies are included. Once layouts are no longer
-   * stored as third party settings, this will be handled by the code in
-   * \Drupal\Core\Config\Entity\ConfigEntityBase::calculateDependencies() that
-   * handles \Drupal\Core\Entity\EntityWithPluginCollectionInterface.
-   */
-  public function calculateDependencies() {
-    parent::calculateDependencies();
-
-    // This can be called during uninstallation, so check for a valid ID first.
-    if ($this->getLayoutId()) {
-      $this->calculatePluginDependencies($this->getLayout());
-    }
-    return $this;
-  }
-
-  /**
-   * Implements \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface::getDefaultRegion().
-   */
-  public function getDefaultRegion() {
-    return $this->getLayoutDefinition($this->getLayoutId())->getDefaultRegion();
-  }
-
-}
diff --git a/core/modules/field_layout/src/Entity/FieldLayoutEntityFormDisplay.php b/core/modules/field_layout/src/Entity/FieldLayoutEntityFormDisplay.php
deleted file mode 100644
index 275d4b04d3..0000000000
--- a/core/modules/field_layout/src/Entity/FieldLayoutEntityFormDisplay.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Entity;
-
-use Drupal\Core\Entity\Entity\EntityFormDisplay;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-
-/**
- * Provides an entity form display entity that has a layout.
- */
-class FieldLayoutEntityFormDisplay extends EntityFormDisplay implements EntityDisplayWithLayoutInterface {
-
-  use FieldLayoutEntityDisplayTrait;
-
-}
diff --git a/core/modules/field_layout/src/Entity/FieldLayoutEntityViewDisplay.php b/core/modules/field_layout/src/Entity/FieldLayoutEntityViewDisplay.php
deleted file mode 100644
index 5ad419c6c6..0000000000
--- a/core/modules/field_layout/src/Entity/FieldLayoutEntityViewDisplay.php
+++ /dev/null
@@ -1,15 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Entity;
-
-use Drupal\Core\Entity\Entity\EntityViewDisplay;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-
-/**
- * Provides an entity view display entity that has a layout.
- */
-class FieldLayoutEntityViewDisplay extends EntityViewDisplay implements EntityDisplayWithLayoutInterface {
-
-  use FieldLayoutEntityDisplayTrait;
-
-}
diff --git a/core/modules/field_layout/src/FieldLayoutBuilder.php b/core/modules/field_layout/src/FieldLayoutBuilder.php
deleted file mode 100644
index fdbefd5e8d..0000000000
--- a/core/modules/field_layout/src/FieldLayoutBuilder.php
+++ /dev/null
@@ -1,156 +0,0 @@
-<?php
-
-namespace Drupal\field_layout;
-
-use Drupal\Core\DependencyInjection\ContainerInjectionInterface;
-use Drupal\Core\Entity\EntityFieldManagerInterface;
-use Drupal\Core\Field\FieldDefinitionInterface;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-use Drupal\Core\Layout\LayoutPluginManagerInterface;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Builds a field layout.
- */
-class FieldLayoutBuilder implements ContainerInjectionInterface {
-
-  /**
-   * The layout plugin manager.
-   *
-   * @var \Drupal\Core\Layout\LayoutPluginManagerInterface
-   */
-  protected $layoutPluginManager;
-
-  /**
-   * The entity field manager.
-   *
-   * @var \Drupal\Core\Entity\EntityFieldManagerInterface
-   */
-  protected $entityFieldManager;
-
-  /**
-   * Constructs a new FieldLayoutBuilder.
-   *
-   * @param \Drupal\Core\Layout\LayoutPluginManagerInterface $layout_plugin_manager
-   *   The layout plugin manager.
-   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
-   *   The entity field manager.
-   */
-  public function __construct(LayoutPluginManagerInterface $layout_plugin_manager, EntityFieldManagerInterface $entity_field_manager) {
-    $this->layoutPluginManager = $layout_plugin_manager;
-    $this->entityFieldManager = $entity_field_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('plugin.manager.core.layout'),
-      $container->get('entity_field.manager')
-    );
-  }
-
-  /**
-   * Applies the layout to an entity build.
-   *
-   * @param array $build
-   *   A renderable array representing the entity content or form.
-   * @param \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface $display
-   *   The entity display holding the display options configured for the entity
-   *   components.
-   */
-  public function buildView(array &$build, EntityDisplayWithLayoutInterface $display) {
-    $layout_definition = $this->layoutPluginManager->getDefinition($display->getLayoutId(), FALSE);
-    if ($layout_definition && $fields = $this->getFields($build, $display, 'view')) {
-      // Add the regions to the $build in the correct order.
-      $regions = array_fill_keys($layout_definition->getRegionNames(), []);
-
-      foreach ($fields as $name => $field) {
-        // If the region is controlled by the layout, move the field from the
-        // top-level of $build into a region-specific section. Custom regions
-        // could be set by other code at run-time; these should be ignored.
-        // @todo Ideally the array structure would remain unchanged, see
-        //   https://www.drupal.org/node/2846393.
-        if (isset($regions[$field['region']])) {
-          $regions[$field['region']][$name] = $build[$name];
-          unset($build[$name]);
-        }
-      }
-      // Ensure this will not conflict with any existing array elements by
-      // prefixing with an underscore.
-      $build['_field_layout'] = $display->getLayout()->build($regions);
-    }
-  }
-
-  /**
-   * Applies the layout to an entity form.
-   *
-   * @param array $build
-   *   A renderable array representing the entity content or form.
-   * @param \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface $display
-   *   The entity display holding the display options configured for the entity
-   *   components.
-   */
-  public function buildForm(array &$build, EntityDisplayWithLayoutInterface $display) {
-    $layout_definition = $this->layoutPluginManager->getDefinition($display->getLayoutId(), FALSE);
-    if ($layout_definition && $fields = $this->getFields($build, $display, 'form')) {
-      $fill = [];
-      $fill['#process'][] = '\Drupal\Core\Render\Element\RenderElement::processGroup';
-      $fill['#pre_render'][] = '\Drupal\Core\Render\Element\RenderElement::preRenderGroup';
-      // Add the regions to the $build in the correct order.
-      $regions = array_fill_keys($layout_definition->getRegionNames(), $fill);
-
-      foreach ($fields as $name => $field) {
-        // As this is a form, #group can be used to relocate the fields. This
-        // avoids breaking hook_form_alter() implementations by not actually
-        // moving the field in the form structure. If a #group is already set,
-        // do not overwrite it.
-        if (isset($regions[$field['region']]) && !isset($build[$name]['#group'])) {
-          $build[$name]['#group'] = $field['region'];
-        }
-      }
-      // Ensure this will not conflict with any existing array elements by
-      // prefixing with an underscore.
-      $build['_field_layout'] = $display->getLayout()->build($regions);
-    }
-  }
-
-  /**
-   * Gets the fields that need to be processed.
-   *
-   * @param array $build
-   *   A renderable array representing the entity content or form.
-   * @param \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface $display
-   *   The entity display holding the display options configured for the entity
-   *   components.
-   * @param string $display_context
-   *   The display context, either 'form' or 'view'.
-   *
-   * @return array
-   *   An array of configurable fields present in the build.
-   */
-  protected function getFields(array $build, EntityDisplayWithLayoutInterface $display, $display_context) {
-    $components = $display->getComponents();
-
-    // Ignore any extra fields from the list of field definitions. Field
-    // definitions can have a non-configurable display, but all extra fields are
-    // always displayed.
-    $field_definitions = array_diff_key(
-      $this->entityFieldManager->getFieldDefinitions($display->getTargetEntityTypeId(), $display->getTargetBundle()),
-      $this->entityFieldManager->getExtraFields($display->getTargetEntityTypeId(), $display->getTargetBundle())
-    );
-
-    $fields_to_exclude = array_filter($field_definitions, function (FieldDefinitionInterface $field_definition) use ($display_context) {
-      // Remove fields with a non-configurable display.
-      return !$field_definition->isDisplayConfigurable($display_context);
-    });
-    $components = array_diff_key($components, $fields_to_exclude);
-
-    // Only include fields present in the build.
-    $components = array_intersect_key($components, $build);
-
-    return $components;
-  }
-
-}
diff --git a/core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php b/core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php
deleted file mode 100644
index 170bcd093a..0000000000
--- a/core/modules/field_layout/src/Form/FieldLayoutEntityDisplayFormTrait.php
+++ /dev/null
@@ -1,179 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Form;
-
-use Drupal\Core\Form\FormStateInterface;
-use Drupal\Core\Form\SubformState;
-use Drupal\Core\Plugin\PluginFormInterface;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-
-/**
- * Provides shared code for entity display forms.
- *
- * Both EntityViewDisplayEditForm and EntityFormDisplayEditForm must maintain
- * their parent hierarchy, while being identically enhanced by Field Layout.
- * This trait contains the code they both share.
- */
-trait FieldLayoutEntityDisplayFormTrait {
-
-  /**
-   * The field layout plugin manager.
-   *
-   * @var \Drupal\Core\Layout\LayoutPluginManagerInterface
-   */
-  protected $layoutPluginManager;
-
-  /**
-   * Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::getRegions().
-   */
-  public function getRegions() {
-    $regions = [];
-
-    $layout_definition = $this->layoutPluginManager->getDefinition($this->getEntity()->getLayoutId());
-    foreach ($layout_definition->getRegions() as $name => $region) {
-      $regions[$name] = [
-        'title' => $region['label'],
-        'message' => $this->t('No field is displayed.'),
-      ];
-    }
-
-    $regions['hidden'] = [
-      'title' => $this->t('Disabled', [], ['context' => 'Plural']),
-      'message' => $this->t('No field is hidden.'),
-    ];
-
-    return $regions;
-  }
-
-  /**
-   * Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::form().
-   */
-  public function form(array $form, FormStateInterface $form_state) {
-    $form = parent::form($form, $form_state);
-
-    $form['field_layouts'] = [
-      '#type' => 'details',
-      '#title' => $this->t('Layout settings'),
-    ];
-
-    $layout_plugin = $this->getLayout($this->getEntity(), $form_state);
-
-    $form['field_layouts']['field_layout'] = [
-      '#type' => 'select',
-      '#title' => $this->t('Select a layout'),
-      '#options' => $this->layoutPluginManager->getLayoutOptions(),
-      '#default_value' => $layout_plugin->getPluginId(),
-      '#ajax' => [
-        'callback' => '::settingsAjax',
-        'wrapper' => 'field-layout-settings-wrapper',
-        'trigger_as' => ['name' => 'field_layout_change'],
-      ],
-    ];
-    $form['field_layouts']['submit'] = [
-      '#type' => 'submit',
-      '#name' => 'field_layout_change',
-      '#value' => $this->t('Change layout'),
-      '#submit' => ['::settingsAjaxSubmit'],
-      '#attributes' => ['class' => ['js-hide']],
-      '#ajax' => [
-        'callback' => '::settingsAjax',
-        'wrapper' => 'field-layout-settings-wrapper',
-      ],
-    ];
-
-    $form['field_layouts']['settings_wrapper'] = [
-      '#type' => 'container',
-      '#id' => 'field-layout-settings-wrapper',
-      '#tree' => TRUE,
-    ];
-
-    $form['field_layouts']['settings_wrapper']['icon'] = $layout_plugin->getPluginDefinition()->getIcon();
-
-    if ($layout_plugin instanceof PluginFormInterface) {
-      $form['field_layouts']['settings_wrapper']['layout_settings'] = [];
-      $subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
-      $form['field_layouts']['settings_wrapper']['layout_settings'] = $layout_plugin->buildConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
-    }
-
-    return $form;
-  }
-
-  /**
-   * Gets the layout plugin for the currently selected field layout.
-   *
-   * @param \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface $entity
-   *   The current form entity.
-   * @param \Drupal\Core\Form\FormStateInterface $form_state
-   *   The current state of the form.
-   *
-   * @return \Drupal\Core\Layout\LayoutInterface
-   *   The layout plugin.
-   */
-  protected function getLayout(EntityDisplayWithLayoutInterface $entity, FormStateInterface $form_state) {
-    if (!$layout_plugin = $form_state->get('layout_plugin')) {
-      $stored_layout_id = $entity->getLayoutId();
-      // Use selected layout if it exists, falling back to the stored layout.
-      $layout_id = $form_state->getValue('field_layout', $stored_layout_id);
-      // If the current layout is the stored layout, use the stored layout
-      // settings. Otherwise leave the settings empty.
-      $layout_settings = $layout_id === $stored_layout_id ? $entity->getLayoutSettings() : [];
-
-      $layout_plugin = $this->layoutPluginManager->createInstance($layout_id, $layout_settings);
-      $form_state->set('layout_plugin', $layout_plugin);
-    }
-    return $layout_plugin;
-  }
-
-  /**
-   * Ajax callback for the field layout settings form.
-   */
-  public static function settingsAjax($form, FormStateInterface $form_state) {
-    return $form['field_layouts']['settings_wrapper'];
-  }
-
-  /**
-   * Submit handler for the non-JS case.
-   */
-  public function settingsAjaxSubmit($form, FormStateInterface $form_state) {
-    $form_state->set('layout_plugin', NULL);
-    $form_state->setRebuild();
-  }
-
-  /**
-   * Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::validateForm().
-   */
-  public function validateForm(array &$form, FormStateInterface $form_state) {
-    parent::validateForm($form, $form_state);
-
-    $layout_plugin = $this->getLayout($this->getEntity(), $form_state);
-    if ($layout_plugin instanceof PluginFormInterface) {
-      $subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
-      $layout_plugin->validateConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
-    }
-  }
-
-  /**
-   * Overrides \Drupal\field_ui\Form\EntityDisplayFormBase::submitForm().
-   */
-  public function submitForm(array &$form, FormStateInterface $form_state) {
-    parent::submitForm($form, $form_state);
-
-    $entity = $this->getEntity();
-    $layout_plugin = $this->getLayout($entity, $form_state);
-    if ($layout_plugin instanceof PluginFormInterface) {
-      $subform_state = SubformState::createForSubform($form['field_layouts']['settings_wrapper']['layout_settings'], $form, $form_state);
-      $layout_plugin->submitConfigurationForm($form['field_layouts']['settings_wrapper']['layout_settings'], $subform_state);
-    }
-
-    $entity->setLayout($layout_plugin);
-  }
-
-  /**
-   * Gets the form entity.
-   *
-   * @return \Drupal\field_layout\Display\EntityDisplayWithLayoutInterface
-   *   The current form entity.
-   */
-  abstract public function getEntity();
-
-}
diff --git a/core/modules/field_layout/src/Form/FieldLayoutEntityFormDisplayEditForm.php b/core/modules/field_layout/src/Form/FieldLayoutEntityFormDisplayEditForm.php
deleted file mode 100644
index bb8bc221ea..0000000000
--- a/core/modules/field_layout/src/Form/FieldLayoutEntityFormDisplayEditForm.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Form;
-
-use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
-use Drupal\Core\Entity\EntityFieldManagerInterface;
-use Drupal\Core\Field\FieldTypePluginManagerInterface;
-use Drupal\Core\Layout\LayoutPluginManagerInterface;
-use Drupal\field_ui\Form\EntityFormDisplayEditForm;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Edit form for the EntityFormDisplay entity type.
- *
- * @internal
- */
-class FieldLayoutEntityFormDisplayEditForm extends EntityFormDisplayEditForm {
-
-  use FieldLayoutEntityDisplayFormTrait;
-
-  /**
-   * FieldLayoutEntityFormDisplayEditForm constructor.
-   *
-   * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager
-   *   The field type manager.
-   * @param \Drupal\Component\Plugin\PluginManagerBase $plugin_manager
-   *   The widget plugin manager.
-   * @param \Drupal\Core\Layout\LayoutPluginManagerInterface $layout_plugin_manager
-   *   The layout plugin manager.
-   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
-   *   The entity display_repository.
-   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
-   *   The entity field manager.
-   */
-  public function __construct(FieldTypePluginManagerInterface $field_type_manager, PluginManagerBase $plugin_manager, LayoutPluginManagerInterface $layout_plugin_manager, EntityDisplayRepositoryInterface $entity_display_repository = NULL, EntityFieldManagerInterface $entity_field_manager = NULL) {
-    parent::__construct($field_type_manager, $plugin_manager, $entity_display_repository, $entity_field_manager);
-    $this->layoutPluginManager = $layout_plugin_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('plugin.manager.field.field_type'),
-      $container->get('plugin.manager.field.widget'),
-      $container->get('plugin.manager.core.layout'),
-      $container->get('entity_display.repository'),
-      $container->get('entity_field.manager')
-    );
-  }
-
-}
diff --git a/core/modules/field_layout/src/Form/FieldLayoutEntityViewDisplayEditForm.php b/core/modules/field_layout/src/Form/FieldLayoutEntityViewDisplayEditForm.php
deleted file mode 100644
index 628b1ae917..0000000000
--- a/core/modules/field_layout/src/Form/FieldLayoutEntityViewDisplayEditForm.php
+++ /dev/null
@@ -1,54 +0,0 @@
-<?php
-
-namespace Drupal\field_layout\Form;
-
-use Drupal\Component\Plugin\PluginManagerBase;
-use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
-use Drupal\Core\Entity\EntityFieldManagerInterface;
-use Drupal\Core\Field\FieldTypePluginManagerInterface;
-use Drupal\Core\Layout\LayoutPluginManagerInterface;
-use Drupal\field_ui\Form\EntityViewDisplayEditForm;
-use Symfony\Component\DependencyInjection\ContainerInterface;
-
-/**
- * Edit form for the EntityViewDisplay entity type.
- *
- * @internal
- */
-class FieldLayoutEntityViewDisplayEditForm extends EntityViewDisplayEditForm {
-
-  use FieldLayoutEntityDisplayFormTrait;
-
-  /**
-   * FieldLayoutEntityViewDisplayEditForm constructor.
-   *
-   * @param \Drupal\Core\Field\FieldTypePluginManagerInterface $field_type_manager
-   *   The field type manager.
-   * @param \Drupal\Component\Plugin\PluginManagerBase $plugin_manager
-   *   The formatter plugin manager.
-   * @param \Drupal\Core\Layout\LayoutPluginManagerInterface $layout_plugin_manager
-   *   The field layout plugin manager.
-   * @param \Drupal\Core\Entity\EntityDisplayRepositoryInterface $entity_display_repository
-   *   The entity display_repository.
-   * @param \Drupal\Core\Entity\EntityFieldManagerInterface $entity_field_manager
-   *   The entity field manager.
-   */
-  public function __construct(FieldTypePluginManagerInterface $field_type_manager, PluginManagerBase $plugin_manager, LayoutPluginManagerInterface $layout_plugin_manager, EntityDisplayRepositoryInterface $entity_display_repository = NULL, EntityFieldManagerInterface $entity_field_manager = NULL) {
-    parent::__construct($field_type_manager, $plugin_manager, $entity_display_repository, $entity_field_manager);
-    $this->layoutPluginManager = $layout_plugin_manager;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public static function create(ContainerInterface $container) {
-    return new static(
-      $container->get('plugin.manager.field.field_type'),
-      $container->get('plugin.manager.field.formatter'),
-      $container->get('plugin.manager.core.layout'),
-      $container->get('entity_display.repository'),
-      $container->get('entity_field.manager')
-    );
-  }
-
-}
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/config/schema/field_layout_test.schema.yml b/core/modules/field_layout/tests/modules/field_layout_test/config/schema/field_layout_test.schema.yml
deleted file mode 100644
index dc95ab32fd..0000000000
--- a/core/modules/field_layout/tests/modules/field_layout_test/config/schema/field_layout_test.schema.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-layout_plugin.settings.test_layout_main_and_footer:
-  type: layout_plugin.settings
-  label: 'Layout test plugin settings'
-  mapping:
-    setting_1:
-      type: string
-      label: 'Setting 1'
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.info.yml b/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.info.yml
deleted file mode 100644
index 47364228fd..0000000000
--- a/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.info.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-name: 'Field Layout test'
-type: module
-description: 'Support module for Field Layout tests.'
-package: Testing
-version: VERSION
-dependencies:
-  - drupal:entity_test
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.module b/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.module
deleted file mode 100644
index 6905c3daac..0000000000
--- a/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.module
+++ /dev/null
@@ -1,16 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains hook implementations for field_layout_test.
- */
-
-/**
- * Implements hook_layout_alter().
- */
-function field_layout_test_layout_alter(&$definitions) {
-  /** @var \Drupal\Core\Layout\LayoutDefinition[] $definitions */
-  if (\Drupal::state()->get('field_layout_test.alter_regions') && isset($definitions['layout_onecol'])) {
-    $definitions['layout_onecol']->setRegions(['foo' => ['label' => 'Foo']]);
-  }
-}
diff --git a/core/modules/field_layout/tests/src/Functional/FieldLayoutTest.php b/core/modules/field_layout/tests/src/Functional/FieldLayoutTest.php
deleted file mode 100644
index 8c739e1a27..0000000000
--- a/core/modules/field_layout/tests/src/Functional/FieldLayoutTest.php
+++ /dev/null
@@ -1,102 +0,0 @@
-<?php
-
-namespace Drupal\Tests\field_layout\Functional;
-
-use Drupal\Tests\BrowserTestBase;
-
-/**
- * Tests using field layout for entity displays.
- *
- * @group field_layout
- */
-class FieldLayoutTest extends BrowserTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = [
-    'field_layout',
-    'field_ui',
-    'node',
-    'field_layout_test',
-  ];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'classy';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    $this->createContentType([
-      'type' => 'article',
-    ]);
-    $this->createNode([
-      'type' => 'article',
-      'title' => 'The node title',
-      'body' => [
-        ['value' => 'The node body'],
-      ],
-    ]);
-    $this->drupalLogin($this->drupalCreateUser([
-      'access administration pages',
-      'administer content types',
-      'administer nodes',
-      'administer node fields',
-      'administer node display',
-      'administer node form display',
-      'view the administration theme',
-    ]));
-  }
-
-  /**
-   * Tests an entity type that has fields shown by default.
-   */
-  public function testNodeView() {
-    // By default, the one-column layout is used.
-    $this->drupalGet('node/1');
-    $this->assertSession()->elementExists('css', '.layout--onecol');
-    $this->assertSession()->elementExists('css', '.layout__region--content .field--name-body');
-
-    $this->drupalGet('admin/structure/types/manage/article/display');
-    $this->assertEquals(['Content', 'Disabled'], $this->getRegionTitles());
-    $this->assertSession()->optionExists('fields[body][region]', 'content');
-  }
-
-  /**
-   * Tests that changes to the regions still leave the fields visible.
-   */
-  public function testRegionChanges() {
-    $this->drupalGet('admin/structure/types/manage/article/display');
-    $this->assertEquals(['Content', 'Disabled'], $this->getRegionTitles());
-    $this->assertSession()->optionExists('fields[body][region]', 'content');
-
-    \Drupal::state()->set('field_layout_test.alter_regions', TRUE);
-    \Drupal::service('plugin.cache_clearer')->clearCachedDefinitions();
-
-    $this->drupalGet('admin/structure/types/manage/article/display');
-    $this->assertEquals(['Foo', 'Disabled'], $this->getRegionTitles());
-    $this->assertSession()->optionExists('fields[body][region]', 'hidden');
-  }
-
-  /**
-   * Gets the region titles on the page.
-   *
-   * @return string[]
-   *   An array of region titles.
-   */
-  protected function getRegionTitles() {
-    $region_titles = [];
-    $region_title_elements = $this->getSession()->getPage()->findAll('css', '.region-title td');
-    /** @var \Behat\Mink\Element\NodeElement[] $region_title_elements */
-    foreach ($region_title_elements as $region_title_element) {
-      $region_titles[] = $region_title_element->getText();
-    }
-    return $region_titles;
-  }
-
-}
diff --git a/core/modules/field_layout/tests/src/FunctionalJavascript/FieldLayoutTest.php b/core/modules/field_layout/tests/src/FunctionalJavascript/FieldLayoutTest.php
deleted file mode 100644
index 7ad41defd3..0000000000
--- a/core/modules/field_layout/tests/src/FunctionalJavascript/FieldLayoutTest.php
+++ /dev/null
@@ -1,316 +0,0 @@
-<?php
-
-namespace Drupal\Tests\field_layout\FunctionalJavascript;
-
-use Drupal\entity_test\Entity\EntityTest;
-use Drupal\FunctionalJavascriptTests\WebDriverTestBase;
-
-/**
- * Tests using field layout for entity displays.
- *
- * @group field_layout
- */
-class FieldLayoutTest extends WebDriverTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected static $modules = [
-    'field_layout',
-    'field_ui',
-    'field_layout_test',
-    'layout_test',
-  ];
-
-  /**
-   * {@inheritdoc}
-   */
-  protected $defaultTheme = 'classy';
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    $entity = EntityTest::create([
-      'name' => 'The name for this entity',
-      'field_test_text' => [
-        ['value' => 'The field test text value'],
-      ],
-    ]);
-    $entity->save();
-    $this->drupalLogin($this->drupalCreateUser([
-      'access administration pages',
-      'view test entity',
-      'administer entity_test content',
-      'administer entity_test fields',
-      'administer entity_test display',
-      'administer entity_test form display',
-      'view the administration theme',
-    ]));
-  }
-
-  /**
-   * Tests that layouts are unique per view mode.
-   */
-  public function testEntityViewModes() {
-    // By default, the field is not visible.
-    $this->drupalGet('entity_test/1/test');
-    $this->assertSession()->elementNotExists('css', '.layout__region--content .field--name-field-test-text');
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->elementNotExists('css', '.layout__region--content .field--name-field-test-text');
-
-    // Change the layout for the "test" view mode. See
-    // core.entity_view_mode.entity_test.test.yml.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $this->click('#edit-modes');
-    $this->getSession()->getPage()->checkField('display_modes_custom[test]');
-    $this->submitForm([], 'Save');
-    $this->clickLink('configure them');
-    $this->getSession()->getPage()->pressButton('Show row weights');
-    $this->getSession()->getPage()->selectFieldOption('fields[field_test_text][region]', 'content');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-
-    // Each view mode has a different layout.
-    $this->drupalGet('entity_test/1/test');
-    $this->assertSession()->elementExists('css', '.layout__region--content .field--name-field-test-text');
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->elementNotExists('css', '.layout__region--content .field--name-field-test-text');
-  }
-
-  /**
-   * Tests the use of field layout for entity form displays.
-   */
-  public function testEntityForm() {
-    // By default, the one-column layout is used.
-    $this->drupalGet('entity_test/manage/1/edit');
-    $this->assertFieldInRegion('field_test_text[0][value]', 'content');
-
-    // The one-column layout is in use.
-    $this->drupalGet('entity_test/structure/entity_test/form-display');
-    $this->assertEquals(['Content', 'Disabled'], $this->getRegionTitles());
-
-    // Switch the layout to two columns.
-    $this->click('#edit-field-layouts');
-    $this->getSession()->getPage()->selectFieldOption('field_layout', 'layout_twocol');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-
-    // The field is moved to the default region for the new layout.
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-    $this->assertEquals(['Top', 'First', 'Second', 'Bottom', 'Disabled'], $this->getRegionTitles());
-
-    $this->drupalGet('entity_test/manage/1/edit');
-    // No fields are visible, and the regions don't display when empty.
-    $this->assertFieldInRegion('field_test_text[0][value]', 'first');
-    $this->assertSession()->elementExists('css', '.layout__region--first .field--name-field-test-text');
-
-    // After a refresh the new regions are still there.
-    $this->drupalGet('entity_test/structure/entity_test/form-display');
-    $this->assertEquals(['Top', 'First', 'Second', 'Bottom', 'Disabled'], $this->getRegionTitles());
-    $this->assertSession()->waitForElement('css', '.tabledrag-handle');
-    $id = $this->getSession()->getPage()->find('css', '[name="form_build_id"]')->getValue();
-
-    // Drag the field to the second region.
-    $field_test_text_row = $this->getSession()->getPage()->find('css', '#field-test-text');
-    $second_region_row = $this->getSession()->getPage()->find('css', '.region-second-message');
-    $field_test_text_row->find('css', '.handle')->dragTo($second_region_row);
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->waitForElement('css', "[name='form_build_id']:not([value='$id'])");
-    $this->submitForm([], 'Save');
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-
-    // The new layout is used.
-    $this->drupalGet('entity_test/manage/1/edit');
-    $this->assertSession()->elementExists('css', '.layout__region--second .field--name-field-test-text');
-    $this->assertFieldInRegion('field_test_text[0][value]', 'second');
-
-    // Move the field to the second region without tabledrag.
-    $this->drupalGet('entity_test/structure/entity_test/form-display');
-    $this->getSession()->getPage()->pressButton('Show row weights');
-    $this->getSession()->getPage()->selectFieldOption('fields[field_test_text][region]', 'second');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-
-    // The updated region is used.
-    $this->drupalGet('entity_test/manage/1/edit');
-    $this->assertFieldInRegion('field_test_text[0][value]', 'second');
-
-    // The layout is still in use without Field UI.
-    $this->container->get('module_installer')->uninstall(['field_ui']);
-    $this->drupalGet('entity_test/manage/1/edit');
-    $this->assertFieldInRegion('field_test_text[0][value]', 'second');
-  }
-
-  /**
-   * Tests the use of field layout for entity view displays.
-   */
-  public function testEntityView() {
-    // The one-column layout is in use.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $this->assertEquals(['Content', 'Disabled'], $this->getRegionTitles());
-
-    // Switch the layout to two columns.
-    $this->click('#edit-field-layouts');
-    $this->getSession()->getPage()->selectFieldOption('field_layout', 'layout_twocol');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-    $this->assertEquals(['Top', 'First', 'Second', 'Bottom', 'Disabled'], $this->getRegionTitles());
-
-    $this->drupalGet('entity_test/1');
-    // No fields are visible, and the regions don't display when empty.
-    $this->assertSession()->elementNotExists('css', '.layout--twocol');
-    $this->assertSession()->elementNotExists('css', '.layout__region');
-    $this->assertSession()->elementNotExists('css', '.field--name-field-test-text');
-
-    // After a refresh the new regions are still there.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $this->assertEquals(['Top', 'First', 'Second', 'Bottom', 'Disabled'], $this->getRegionTitles());
-    $this->assertSession()->waitForElement('css', '.tabledrag-handle');
-    $id = $this->getSession()->getPage()->find('css', '[name="form_build_id"]')->getValue();
-
-    // Drag the field to the first region.
-    $this->assertTrue($this->assertSession()->optionExists('fields[field_test_text][region]', 'hidden')->isSelected());
-    $field_test_text_row = $this->getSession()->getPage()->find('css', '#field-test-text');
-    $first_region_row = $this->getSession()->getPage()->find('css', '.region-first-message');
-    $field_test_text_row->find('css', '.handle')->dragTo($first_region_row);
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertFalse($this->assertSession()->optionExists('fields[field_test_text][region]', 'hidden')->isSelected());
-    $this->assertSession()->waitForElement('css', "[name='form_build_id']:not([value='$id'])");
-    $this->submitForm([], 'Save');
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-
-    // The new layout is used.
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->elementExists('css', '.layout--twocol');
-    $this->assertSession()->elementExists('css', '.layout__region--first .field--name-field-test-text');
-
-    // Move the field to the second region without tabledrag.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $this->getSession()->getPage()->pressButton('Show row weights');
-    $this->getSession()->getPage()->selectFieldOption('fields[field_test_text][region]', 'second');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-    $this->assertSession()->pageTextContains('Your settings have been saved.');
-
-    // The updated region is used.
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->elementExists('css', '.layout__region--second .field--name-field-test-text');
-
-    // The layout is still in use without Field UI.
-    $this->container->get('module_installer')->uninstall(['field_ui']);
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->elementExists('css', '.layout--twocol');
-    $this->assertSession()->elementExists('css', '.layout__region--second .field--name-field-test-text');
-  }
-
-  /**
-   * Tests layout plugins with forms.
-   */
-  public function testLayoutForms() {
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    // Switch to a field layout with settings.
-    $this->click('#edit-field-layouts');
-
-    // Test switching between layouts with and without forms.
-    $this->getSession()->getPage()->selectFieldOption('field_layout', 'layout_test_plugin');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->fieldExists('settings_wrapper[layout_settings][setting_1]');
-
-    $this->getSession()->getPage()->selectFieldOption('field_layout', 'layout_test_2col');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->fieldNotExists('settings_wrapper[layout_settings][setting_1]');
-
-    $this->getSession()->getPage()->selectFieldOption('field_layout', 'layout_test_plugin');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->assertSession()->fieldExists('settings_wrapper[layout_settings][setting_1]');
-
-    // Move the test field to the content region.
-    $this->getSession()->getPage()->pressButton('Show row weights');
-    $this->getSession()->getPage()->selectFieldOption('fields[field_test_text][region]', 'content');
-    $this->assertSession()->assertWaitOnAjaxRequest();
-    $this->submitForm([], 'Save');
-
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->pageTextContains('Blah: Default');
-
-    // Update the field layout settings.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $this->click('#edit-field-layouts');
-    $this->getSession()->getPage()->fillField('settings_wrapper[layout_settings][setting_1]', 'Test text');
-    $this->submitForm([], 'Save');
-
-    $this->drupalGet('entity_test/1');
-    $this->assertSession()->pageTextContains('Blah: Test text');
-  }
-
-  /**
-   * Tests changing the formatter and region at the same time.
-   */
-  public function testChangingFormatterAndRegion() {
-    $assert_session = $this->assertSession();
-    $page = $this->getSession()->getPage();
-
-    // Add the test field to the content region.
-    $this->drupalGet('entity_test/structure/entity_test/display');
-    $page->find('css', '#field-test-text .handle')->dragTo($page->find('css', '.region-content-message'));
-    $assert_session->assertWaitOnAjaxRequest();
-    $page->pressButton('Save');
-    $assert_session->fieldValueEquals('fields[field_test_text][region]', 'content');
-    $assert_session->fieldValueEquals('fields[field_test_text][type]', 'text_default');
-
-    // Switch the layout to two columns.
-    $this->click('#edit-field-layouts');
-    $page->selectFieldOption('field_layout', 'layout_twocol');
-    $assert_session->assertWaitOnAjaxRequest();
-    $page->pressButton('Save');
-    $assert_session->fieldValueEquals('fields[field_test_text][region]', 'first');
-
-    // Change the formatter and move to another region.
-    $page->selectFieldOption('fields[field_test_text][type]', 'text_trimmed');
-    $assert_session->assertWaitOnAjaxRequest();
-    $page->find('css', '#field-test-text .handle')->dragTo($page->find('css', '.region-second-message'));
-    $assert_session->assertWaitOnAjaxRequest();
-    $page->pressButton('Save');
-
-    // Assert that both the formatter and region change are persisted.
-    $assert_session->fieldValueEquals('fields[field_test_text][region]', 'second');
-    $assert_session->fieldValueEquals('fields[field_test_text][type]', 'text_trimmed');
-  }
-
-  /**
-   * Gets the region titles on the page.
-   *
-   * @return string[]
-   *   An array of region titles.
-   */
-  protected function getRegionTitles() {
-    $region_titles = [];
-    $region_title_elements = $this->getSession()->getPage()->findAll('css', '.region-title td');
-    /** @var \Behat\Mink\Element\NodeElement[] $region_title_elements */
-    foreach ($region_title_elements as $region_title_element) {
-      $region_titles[] = $region_title_element->getText();
-    }
-    return $region_titles;
-  }
-
-  /**
-   * Asserts that a field exists in a given region.
-   *
-   * @param string $field_selector
-   *   The field selector, one of field id|name|label|value.
-   * @param string $region_name
-   *   The machine name of the region.
-   */
-  protected function assertFieldInRegion($field_selector, $region_name) {
-    $region_element = $this->getSession()->getPage()->find('css', ".layout__region--$region_name");
-    $this->assertNotNull($region_element);
-    $this->assertSession()->fieldExists($field_selector, $region_element);
-  }
-
-}
diff --git a/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php b/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php
deleted file mode 100644
index 8b074d5a07..0000000000
--- a/core/modules/field_layout/tests/src/Unit/FieldLayoutBuilderTest.php
+++ /dev/null
@@ -1,330 +0,0 @@
-<?php
-
-namespace Drupal\Tests\field_layout\Unit;
-
-use Drupal\Core\Entity\EntityFieldManagerInterface;
-use Drupal\Core\Field\FieldDefinitionInterface;
-use Drupal\field_layout\Display\EntityDisplayWithLayoutInterface;
-use Drupal\field_layout\FieldLayoutBuilder;
-use Drupal\Core\Layout\LayoutPluginManagerInterface;
-use Drupal\Core\Layout\LayoutDefault;
-use Drupal\Core\Layout\LayoutDefinition;
-use Drupal\Tests\UnitTestCase;
-use Prophecy\Argument;
-
-/**
- * @coversDefaultClass \Drupal\field_layout\FieldLayoutBuilder
- * @group field_layout
- */
-class FieldLayoutBuilderTest extends UnitTestCase {
-
-  /**
-   * @var \Drupal\Core\Layout\LayoutPluginManager|\Prophecy\Prophecy\ProphecyInterface
-   */
-  protected $layoutPluginManager;
-
-  /**
-   * @var \Drupal\Core\Entity\EntityFieldManagerInterface|\Prophecy\Prophecy\ProphecyInterface
-   */
-  protected $entityFieldManager;
-
-  /**
-   * @var \Drupal\field_layout\FieldLayoutBuilder
-   */
-  protected $fieldLayoutBuilder;
-
-  /**
-   * @var \Drupal\Core\Layout\LayoutInterface
-   */
-  protected $layoutPlugin;
-
-  /**
-   * @var \Drupal\Core\Layout\LayoutDefinition
-   */
-  protected $pluginDefinition;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp(): void {
-    parent::setUp();
-
-    $this->pluginDefinition = new LayoutDefinition([
-      'library' => 'field_layout/drupal.layout.twocol',
-      'theme_hook' => 'layout__twocol',
-      'regions' => [
-        'left' => [
-          'label' => 'Left',
-        ],
-        'right' => [
-          'label' => 'Right',
-        ],
-      ],
-    ]);
-    $this->layoutPlugin = new LayoutDefault([], 'two_column', $this->pluginDefinition);
-
-    $this->layoutPluginManager = $this->prophesize(LayoutPluginManagerInterface::class);
-    $this->layoutPluginManager->getDefinition('unknown', FALSE)->willReturn(NULL);
-    $this->layoutPluginManager->getDefinition('two_column', FALSE)->willReturn($this->pluginDefinition);
-
-    $this->entityFieldManager = $this->prophesize(EntityFieldManagerInterface::class);
-
-    $this->fieldLayoutBuilder = new FieldLayoutBuilder($this->layoutPluginManager->reveal(), $this->entityFieldManager->reveal());
-  }
-
-  /**
-   * @covers ::buildView
-   * @covers ::getFields
-   */
-  public function testBuildView() {
-    $definitions = [];
-    $non_configurable_field_definition = $this->prophesize(FieldDefinitionInterface::class);
-    $non_configurable_field_definition->isDisplayConfigurable('view')->willReturn(FALSE);
-    $definitions['non_configurable_field'] = $non_configurable_field_definition->reveal();
-    $definitions['non_configurable_field_with_extra_field'] = $non_configurable_field_definition->reveal();
-    $this->entityFieldManager->getFieldDefinitions('the_entity_type_id', 'the_entity_type_bundle')->willReturn($definitions);
-    $extra_fields = [];
-    $extra_fields['non_configurable_field_with_extra_field'] = [
-      'label' => 'This non-configurable field is also defined in hook_entity_extra_field_info()',
-    ];
-    $this->entityFieldManager->getExtraFields('the_entity_type_id', 'the_entity_type_bundle')->willReturn($extra_fields);
-
-    $build = [
-      'test1' => [
-        '#markup' => 'Test1',
-      ],
-      'test2' => [
-        '#markup' => 'Test2',
-      ],
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-      'non_configurable_field_with_extra_field' => [
-        '#markup' => 'Non-configurable with extra field',
-      ],
-    ];
-
-    $display = $this->prophesize(EntityDisplayWithLayoutInterface::class);
-    $display->getTargetEntityTypeId()->willReturn('the_entity_type_id');
-    $display->getTargetBundle()->willReturn('the_entity_type_bundle');
-    $display->getLayout()->willReturn($this->layoutPlugin);
-    $display->getLayoutId()->willReturn('two_column');
-    $display->getLayoutSettings()->willReturn([]);
-    $display->getComponents()->willReturn([
-      'test1' => [
-        'region' => 'right',
-      ],
-      'test2' => [
-        'region' => 'unknown_region',
-      ],
-      'non_configurable_field' => [
-        'region' => 'left',
-      ],
-      'non_configurable_field_with_extra_field' => [
-        'region' => 'left',
-      ],
-    ]);
-
-    $expected = [
-      'test2' => [
-        '#markup' => 'Test2',
-      ],
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-      '_field_layout' => [
-        'left' => [
-          'non_configurable_field_with_extra_field' => [
-            '#markup' => 'Non-configurable with extra field',
-          ],
-        ],
-        'right' => [
-          'test1' => [
-            '#markup' => 'Test1',
-          ],
-        ],
-        '#settings' => [
-          'label' => '',
-        ],
-        '#layout' => $this->pluginDefinition,
-        '#theme' => 'layout__twocol',
-        '#attached' => [
-          'library' => [
-            'field_layout/drupal.layout.twocol',
-          ],
-        ],
-      ],
-    ];
-    $this->fieldLayoutBuilder->buildView($build, $display->reveal());
-    $this->assertEquals($expected, $build);
-    $this->assertSame($expected, $build);
-  }
-
-  /**
-   * @covers ::buildForm
-   * @covers ::getFields
-   */
-  public function testBuildForm() {
-    $definitions = [];
-    $non_configurable_field_definition = $this->prophesize(FieldDefinitionInterface::class);
-    $non_configurable_field_definition->isDisplayConfigurable('form')->willReturn(FALSE);
-    $definitions['non_configurable_field'] = $non_configurable_field_definition->reveal();
-    $this->entityFieldManager->getFieldDefinitions('the_entity_type_id', 'the_entity_type_bundle')->willReturn($definitions);
-    $this->entityFieldManager->getExtraFields('the_entity_type_id', 'the_entity_type_bundle')->willReturn([]);
-
-    $build = [
-      'test1' => [
-        '#markup' => 'Test1',
-      ],
-      'test2' => [
-        '#markup' => 'Test2',
-        '#group' => 'existing_group',
-      ],
-      'test3' => [
-        '#markup' => 'Test3',
-      ],
-      'field_layout' => [
-        '#markup' => 'Field created through the UI happens to be named "Layout"',
-      ],
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-    ];
-
-    $display = $this->prophesize(EntityDisplayWithLayoutInterface::class);
-    $display->getTargetEntityTypeId()->willReturn('the_entity_type_id');
-    $display->getTargetBundle()->willReturn('the_entity_type_bundle');
-    $display->getLayout()->willReturn($this->layoutPlugin);
-    $display->getLayoutId()->willReturn('two_column');
-    $display->getLayoutSettings()->willReturn([]);
-    $display->getComponents()->willReturn([
-      'test1' => [
-        'region' => 'right',
-      ],
-      'test2' => [
-        'region' => 'left',
-      ],
-      'test3' => [
-        'region' => 'unknown_region',
-      ],
-      'field_layout' => [
-        'region' => 'right',
-      ],
-      'non_configurable_field' => [
-        'region' => 'left',
-      ],
-    ]);
-
-    $expected = [
-      'test1' => [
-        '#markup' => 'Test1',
-        '#group' => 'right',
-      ],
-      'test2' => [
-        '#markup' => 'Test2',
-        '#group' => 'existing_group',
-      ],
-      'test3' => [
-        '#markup' => 'Test3',
-      ],
-      'field_layout' => [
-        '#markup' => 'Field created through the UI happens to be named "Layout"',
-        '#group' => 'right',
-      ],
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-      '_field_layout' => [
-        'left' => [
-          '#process' => ['\Drupal\Core\Render\Element\RenderElement::processGroup'],
-          '#pre_render' => ['\Drupal\Core\Render\Element\RenderElement::preRenderGroup'],
-        ],
-        'right' => [
-          '#process' => ['\Drupal\Core\Render\Element\RenderElement::processGroup'],
-          '#pre_render' => ['\Drupal\Core\Render\Element\RenderElement::preRenderGroup'],
-        ],
-        '#settings' => [
-          'label' => '',
-        ],
-        '#layout' => $this->pluginDefinition,
-        '#theme' => 'layout__twocol',
-        '#attached' => [
-          'library' => [
-            'field_layout/drupal.layout.twocol',
-          ],
-        ],
-      ],
-    ];
-    $this->fieldLayoutBuilder->buildForm($build, $display->reveal());
-    $this->assertEquals($expected, $build);
-    $this->assertSame($expected, $build);
-  }
-
-  /**
-   * @covers ::buildForm
-   */
-  public function testBuildFormEmpty() {
-    $definitions = [];
-    $non_configurable_field_definition = $this->prophesize(FieldDefinitionInterface::class);
-    $non_configurable_field_definition->isDisplayConfigurable('form')->willReturn(FALSE);
-    $definitions['non_configurable_field'] = $non_configurable_field_definition->reveal();
-    $this->entityFieldManager->getFieldDefinitions('the_entity_type_id', 'the_entity_type_bundle')->willReturn($definitions);
-    $this->entityFieldManager->getExtraFields('the_entity_type_id', 'the_entity_type_bundle')->willReturn([]);
-
-    $build = [
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-    ];
-
-    $display = $this->prophesize(EntityDisplayWithLayoutInterface::class);
-    $display->getTargetEntityTypeId()->willReturn('the_entity_type_id');
-    $display->getTargetBundle()->willReturn('the_entity_type_bundle');
-    $display->getLayout()->willReturn($this->layoutPlugin);
-    $display->getLayoutId()->willReturn('two_column');
-    $display->getLayoutSettings()->willReturn([]);
-    $display->getComponents()->willReturn([
-      'test1' => [
-        'region' => 'right',
-      ],
-      'non_configurable_field' => [
-        'region' => 'left',
-      ],
-    ]);
-
-    $expected = [
-      'non_configurable_field' => [
-        '#markup' => 'Non-configurable',
-      ],
-    ];
-    $this->fieldLayoutBuilder->buildForm($build, $display->reveal());
-    $this->assertSame($expected, $build);
-  }
-
-  /**
-   * @covers ::buildForm
-   */
-  public function testBuildFormNoLayout() {
-    $this->entityFieldManager->getFieldDefinitions(Argument::any(), Argument::any())->shouldNotBeCalled();
-
-    $build = [
-      'test1' => [
-        '#markup' => 'Test1',
-      ],
-    ];
-
-    $display = $this->prophesize(EntityDisplayWithLayoutInterface::class);
-    $display->getLayoutId()->willReturn('unknown');
-    $display->getLayoutSettings()->willReturn([]);
-    $display->getComponents()->shouldNotBeCalled();
-
-    $expected = [
-      'test1' => [
-        '#markup' => 'Test1',
-      ],
-    ];
-    $this->fieldLayoutBuilder->buildForm($build, $display->reveal());
-    $this->assertSame($expected, $build);
-  }
-
-}
diff --git a/core/modules/field_ui/src/Form/EntityDisplayFormBase.php b/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
index 97d234aad4..c077b049b6 100644
--- a/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
+++ b/core/modules/field_ui/src/Form/EntityDisplayFormBase.php
@@ -5,6 +5,7 @@
 use Drupal\Component\Plugin\Factory\DefaultFactory;
 use Drupal\Component\Plugin\PluginManagerBase;
 use Drupal\Core\Entity\EntityFieldManagerInterface;
+use Drupal\Core\Entity\Display\EntityDisplayWithLayoutInterface;
 use Drupal\Core\Entity\EntityForm;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityDisplayRepositoryInterface;
@@ -13,6 +14,9 @@
 use Drupal\Core\Field\FieldTypePluginManagerInterface;
 use Drupal\Core\Field\PluginSettingsInterface;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\Core\Form\SubformState;
+use Drupal\Core\Layout\LayoutPluginManagerInterface;
+use Drupal\Core\Plugin\PluginFormInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Drupal\field_ui\FieldUI;
 
@@ -60,7 +64,7 @@ abstract class EntityDisplayFormBase extends EntityForm {
   /**
    * The entity being used by this form.
    *
-   * @var \Drupal\Core\Entity\Display\EntityDisplayInterface
+   * @var \Drupal\Core\Entity\Display\EntityDisplayWithLayoutInterface
    */
   protected $entity;
 
@@ -75,12 +79,19 @@ abstract class EntityDisplayFormBase extends EntityForm {
    *   (optional) The entity display_repository.
    * @param \Drupal\Core\Entity\EntityFieldManagerInterface|null $entity_field_manager
    *   (optional) The entity field manager.
+   * @param \Drupal\Core\Layout\LayoutPluginManagerInterface $layout_plugin_manager
+   *   The layout plugin manager.
    */
-  public function __construct(FieldTypePluginManagerInterface $field_type_manager, PluginManagerBase $plugin_manager, EntityDisplayRepositoryInterface $entity_display_repository, EntityFieldManagerInterface $entity_field_manager) {
+  public function __construct(FieldTypePluginManagerInterface $field_type_manager, PluginManagerBase $plugin_manager, EntityDisplayRepositoryInterface $entity_display_repository = NULL, EntityFieldManagerInterface $entity_field_manager = NULL, LayoutPluginManagerInterface $layout_plugin_manager = NULL) {
     $this->fieldTypes = $field_type_manager->getDefinitions();
     $this->pluginManager = $plugin_manager;
     $this->entityDisplayRepository = $entity_display_repository;
     $this->entityFieldManager = $entity_field_manager;
+    if (!$layout_plugin_manager) {
+      @trigger_error('Calling EntityDisplayFormBase::__construct() with the $layout_plugin_manager argument is supported in Drupal 8.7.0 and will be required before Drupal 9.0.0. See https://www.drupal.org/node/@todo.', E_USER_DEPRECATED);
+      $layout_plugin_manager = \Drupal::service('plugin.manager.core.layout');
+    }
+    $this->layoutPluginManager = $layout_plugin_manager;
   }
 
   /**
@@ -112,17 +123,22 @@ public function getEntityFromRouteMatch(RouteMatchInterface $route_match, $entit
    *   @endcode
    */
   public function getRegions() {
-    return [
-      'content' => [
-        'title' => $this->t('Content'),
-        'invisible' => TRUE,
+    $regions = [];
+
+    $layout_definition = $this->entity->getLayout()->getPluginDefinition();
+    foreach ($layout_definition->getRegions() as $name => $region) {
+      $regions[$name] = [
+        'title' => $region['label'],
         'message' => $this->t('No field is displayed.'),
-      ],
-      'hidden' => [
-        'title' => $this->t('Disabled', [], ['context' => 'Plural']),
-        'message' => $this->t('No field is hidden.'),
-      ],
+      ];
+    }
+
+    $regions['hidden'] = [
+      'title' => $this->t('Disabled', [], ['context' => 'Plural']),
+      'message' => $this->t('No field is hidden.'),
     ];
+
+    return $regions;
   }
 
   /**
diff --git a/core/modules/field_ui/src/Form/EntityFormDisplayEditForm.php b/core/modules/field_ui/src/Form/EntityFormDisplayEditForm.php
index 230b927119..f5408dee19 100644
--- a/core/modules/field_ui/src/Form/EntityFormDisplayEditForm.php
+++ b/core/modules/field_ui/src/Form/EntityFormDisplayEditForm.php
@@ -29,7 +29,8 @@ public static function create(ContainerInterface $container) {
       $container->get('plugin.manager.field.field_type'),
       $container->get('plugin.manager.field.widget'),
       $container->get('entity_display.repository'),
-      $container->get('entity_field.manager')
+      $container->get('entity_field.manager'),
+      $container->get('plugin.manager.core.layout')
     );
   }
 
diff --git a/core/modules/field_ui/src/Form/EntityViewDisplayEditForm.php b/core/modules/field_ui/src/Form/EntityViewDisplayEditForm.php
index eb5ecac690..5c22ff9f86 100644
--- a/core/modules/field_ui/src/Form/EntityViewDisplayEditForm.php
+++ b/core/modules/field_ui/src/Form/EntityViewDisplayEditForm.php
@@ -29,7 +29,8 @@ public static function create(ContainerInterface $container) {
       $container->get('plugin.manager.field.field_type'),
       $container->get('plugin.manager.field.formatter'),
       $container->get('entity_display.repository'),
-      $container->get('entity_field.manager')
+      $container->get('entity_field.manager'),
+      $container->get('plugin.manager.core.layout')
     );
   }
 
diff --git a/core/modules/field_ui/tests/src/Functional/EntityDisplayTest.php b/core/modules/field_ui/tests/src/Functional/EntityDisplayTest.php
index d02ba07de4..a4f322bb3e 100644
--- a/core/modules/field_ui/tests/src/Functional/EntityDisplayTest.php
+++ b/core/modules/field_ui/tests/src/Functional/EntityDisplayTest.php
@@ -14,7 +14,7 @@ class EntityDisplayTest extends BrowserTestBase {
   /**
    * {@inheritdoc}
    */
-  protected static $modules = ['field_ui', 'entity_test'];
+  public static $modules = ['field_ui', 'entity_test', 'layout_test'];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/field_ui/tests/src/FunctionalJavascript/EntityDisplayTest.php b/core/modules/field_ui/tests/src/FunctionalJavascript/EntityDisplayTest.php
index 61c65769b8..73be616f60 100644
--- a/core/modules/field_ui/tests/src/FunctionalJavascript/EntityDisplayTest.php
+++ b/core/modules/field_ui/tests/src/FunctionalJavascript/EntityDisplayTest.php
@@ -15,7 +15,7 @@ class EntityDisplayTest extends WebDriverTestBase {
   /**
    * {@inheritdoc}
    */
-  protected static $modules = ['field_ui', 'entity_test'];
+  protected static $modules = ['field_ui', 'layout_test', 'layout_discovery'];
 
   /**
    * {@inheritdoc}
diff --git a/core/modules/forum/config/optional/core.entity_form_display.comment.comment_forum.default.yml b/core/modules/forum/config/optional/core.entity_form_display.comment.comment_forum.default.yml
index 4738bbb43a..b426ba2359 100644
--- a/core/modules/forum/config/optional/core.entity_form_display.comment.comment_forum.default.yml
+++ b/core/modules/forum/config/optional/core.entity_form_display.comment.comment_forum.default.yml
@@ -31,3 +31,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml b/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml
index 2f87d23d59..aa5a2f96bc 100644
--- a/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml
+++ b/core/modules/forum/config/optional/core.entity_form_display.node.forum.default.yml
@@ -82,3 +82,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_form_display.taxonomy_term.forums.default.yml b/core/modules/forum/config/optional/core.entity_form_display.taxonomy_term.forums.default.yml
index 51fa06906f..010adfffc8 100644
--- a/core/modules/forum/config/optional/core.entity_form_display.taxonomy_term.forums.default.yml
+++ b/core/modules/forum/config/optional/core.entity_form_display.taxonomy_term.forums.default.yml
@@ -34,3 +34,5 @@ content:
     third_party_settings: {  }
 hidden:
   forum_container: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_view_display.comment.comment_forum.default.yml b/core/modules/forum/config/optional/core.entity_view_display.comment.comment_forum.default.yml
index befeba89ae..a7fe3d8aad 100644
--- a/core/modules/forum/config/optional/core.entity_view_display.comment.comment_forum.default.yml
+++ b/core/modules/forum/config/optional/core.entity_view_display.comment.comment_forum.default.yml
@@ -22,3 +22,5 @@ content:
     weight: 100
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_view_display.node.forum.default.yml b/core/modules/forum/config/optional/core.entity_view_display.node.forum.default.yml
index f3e8c5c613..6ff22bb817 100644
--- a/core/modules/forum/config/optional/core.entity_view_display.node.forum.default.yml
+++ b/core/modules/forum/config/optional/core.entity_view_display.node.forum.default.yml
@@ -44,3 +44,5 @@ content:
       link: true
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_view_display.node.forum.teaser.yml b/core/modules/forum/config/optional/core.entity_view_display.node.forum.teaser.yml
index 7b174f4429..c9bd86ddaf 100644
--- a/core/modules/forum/config/optional/core.entity_view_display.node.forum.teaser.yml
+++ b/core/modules/forum/config/optional/core.entity_view_display.node.forum.teaser.yml
@@ -36,3 +36,5 @@ content:
     third_party_settings: {  }
 hidden:
   comment_forum: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/forum/config/optional/core.entity_view_display.taxonomy_term.forums.default.yml b/core/modules/forum/config/optional/core.entity_view_display.taxonomy_term.forums.default.yml
index b326039a46..4835e73b13 100644
--- a/core/modules/forum/config/optional/core.entity_view_display.taxonomy_term.forums.default.yml
+++ b/core/modules/forum/config/optional/core.entity_view_display.taxonomy_term.forums.default.yml
@@ -20,3 +20,5 @@ content:
     label: above
 hidden:
   forum_container: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/image/tests/src/Functional/ImageFieldDefaultImagesTest.php b/core/modules/image/tests/src/Functional/ImageFieldDefaultImagesTest.php
index 3e2bce273a..55b3e79d10 100644
--- a/core/modules/image/tests/src/Functional/ImageFieldDefaultImagesTest.php
+++ b/core/modules/image/tests/src/Functional/ImageFieldDefaultImagesTest.php
@@ -22,9 +22,7 @@ class ImageFieldDefaultImagesTest extends ImageFieldTestBase {
     getTestFiles as drupalGetTestFiles;
     compareFiles as drupalCompareFiles;
   }
-  use EntityViewTrait {
-    buildEntityView as drupalBuildEntityView;
-  }
+  use EntityViewTrait;
 
   /**
    * Modules to enable.
@@ -172,7 +170,7 @@ public function testDefaultImages() {
 
     // Confirm that the image default is shown for a new article node.
     $article = $this->drupalCreateNode(['type' => 'article']);
-    $article_built = $this->drupalBuildEntityView($article);
+    $article_built = $this->buildFullEntityView($article);
     $this->assertEqual(
       $article_built[$field_name][0]['#item']->target_id,
       $default_images['field']->id(),
@@ -191,7 +189,7 @@ public function testDefaultImages() {
 
     // Confirm that the image default is shown for a new page node.
     $page = $this->drupalCreateNode(['type' => 'page']);
-    $page_built = $this->drupalBuildEntityView($page);
+    $page_built = $this->buildFullEntityView($page);
     $this->assertEqual(
       $page_built[$field_name][0]['#item']->target_id,
       $default_images['field2']->id(),
@@ -221,8 +219,8 @@ public function testDefaultImages() {
 
     // Reload the nodes and confirm the field defaults are used.
     $node_storage->resetCache([$article->id(), $page->id()]);
-    $article_built = $this->drupalBuildEntityView($article = $node_storage->load($article->id()));
-    $page_built = $this->drupalBuildEntityView($page = $node_storage->load($page->id()));
+    $article_built = $this->buildFullEntityView($article = $node_storage->load($article->id()));
+    $page_built = $this->buildFullEntityView($page = $node_storage->load($page->id()));
     $this->assertEqual(
       $article_built[$field_name][0]['#item']->target_id,
       $default_images['field']->id(),
@@ -259,8 +257,8 @@ public function testDefaultImages() {
 
     // Reload the nodes.
     $node_storage->resetCache([$article->id(), $page->id()]);
-    $article_built = $this->drupalBuildEntityView($article = $node_storage->load($article->id()));
-    $page_built = $this->drupalBuildEntityView($page = $node_storage->load($page->id()));
+    $article_built = $this->buildFullEntityView($article = $node_storage->load($article->id()));
+    $page_built = $this->buildFullEntityView($page = $node_storage->load($page->id()));
 
     // Confirm the article uses the new default.
     $this->assertEqual(
@@ -302,8 +300,8 @@ public function testDefaultImages() {
 
     // Reload the nodes.
     $node_storage->resetCache([$article->id(), $page->id()]);
-    $article_built = $this->drupalBuildEntityView($article = $node_storage->load($article->id()));
-    $page_built = $this->drupalBuildEntityView($page = $node_storage->load($page->id()));
+    $article_built = $this->buildFullEntityView($article = $node_storage->load($article->id()));
+    $page_built = $this->buildFullEntityView($page = $node_storage->load($page->id()));
     // Confirm the article uses the new field storage (not field) default.
     $this->assertEqual(
       $article_built[$field_name][0]['#item']->target_id,
diff --git a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
index 8f3b022899..6c0ca045de 100644
--- a/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
+++ b/core/modules/layout_builder/src/Entity/LayoutBuilderEntityViewDisplay.php
@@ -232,7 +232,7 @@ public function createCopy($mode) {
   /**
    * {@inheritdoc}
    */
-  protected function getDefaultRegion() {
+  public function getDefaultRegion() {
     if ($this->hasSection(0)) {
       return $this->getSection(0)->getDefaultRegion();
     }
@@ -280,6 +280,7 @@ public function buildMultiple(array $entities) {
       // field blocks by ::setComponent().
       if (!Element::isEmpty($build_list[$id]['_layout_builder'])) {
         foreach ($build_list[$id] as $name => $build_part) {
+          unset($build_list[$id]['_layout']);
           $field_definition = $this->getFieldDefinition($name);
           if ($field_definition && $field_definition->isDisplayConfigurable($this->displayContext)) {
             unset($build_list[$id][$name]);
diff --git a/core/modules/layout_discovery/layout_discovery.module b/core/modules/layout_discovery/layout_discovery.module
index 3eed9fe2f9..ca31ff77ad 100644
--- a/core/modules/layout_discovery/layout_discovery.module
+++ b/core/modules/layout_discovery/layout_discovery.module
@@ -20,31 +20,3 @@ function layout_discovery_help($route_name) {
       return $output;
   }
 }
-
-/**
- * Implements hook_theme().
- */
-function layout_discovery_theme() {
-  return \Drupal::service('plugin.manager.core.layout')->getThemeImplementations();
-}
-
-/**
- * Prepares variables for layout templates.
- *
- * @param array &$variables
- *   An associative array containing:
- *   - content: An associative array containing the properties of the element.
- *     Properties used: #settings, #layout.
- */
-function template_preprocess_layout(&$variables) {
-  $variables['settings'] = isset($variables['content']['#settings']) ? $variables['content']['#settings'] : [];
-  $variables['layout'] = isset($variables['content']['#layout']) ? $variables['content']['#layout'] : [];
-
-  // Create an attributes variable for each region.
-  foreach (Element::children($variables['content']) as $name) {
-    if (!isset($variables['content'][$name]['#attributes'])) {
-      $variables['content'][$name]['#attributes'] = [];
-    }
-    $variables['region_attributes'][$name] = new Attribute($variables['content'][$name]['#attributes']);
-  }
-}
diff --git a/core/modules/layout_discovery/layout_discovery.services.yml b/core/modules/layout_discovery/layout_discovery.services.yml
deleted file mode 100644
index 48d32292cc..0000000000
--- a/core/modules/layout_discovery/layout_discovery.services.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-services:
-  plugin.manager.core.layout:
-    class: Drupal\Core\Layout\LayoutPluginManager
-    arguments: ['@container.namespaces', '@cache.discovery', '@module_handler', '@theme_handler']
-  layout.icon_builder:
-    class: Drupal\Core\Layout\Icon\SvgIconBuilder
-    shared: false
diff --git a/core/modules/layout_discovery/tests/src/Kernel/LayoutTest.php b/core/modules/layout_discovery/tests/src/Kernel/LayoutTest.php
index c802b3ef0f..c20ac80d01 100644
--- a/core/modules/layout_discovery/tests/src/Kernel/LayoutTest.php
+++ b/core/modules/layout_discovery/tests/src/Kernel/LayoutTest.php
@@ -91,6 +91,17 @@ protected function render(array &$elements) {
    * Data provider for testRenderLayout().
    */
   public function renderLayoutData() {
+    $data['layout_default'] = [
+      'layout_default',
+      [],
+      [
+        'content' => [
+          '#markup' => "This is the content\n",
+        ],
+      ],
+      ['This is the content'],
+    ];
+
     $html = [];
     $html[] = '<div data-drupal-selector="edit-layout" class="layout layout--onecol">';
     $html[] = '<div data-drupal-selector="edit-content" class="layout__region layout__region--content">';
diff --git a/core/modules/node/tests/src/Kernel/SummaryLengthTest.php b/core/modules/node/tests/src/Kernel/SummaryLengthTest.php
index 97830c656b..89c0d05113 100644
--- a/core/modules/node/tests/src/Kernel/SummaryLengthTest.php
+++ b/core/modules/node/tests/src/Kernel/SummaryLengthTest.php
@@ -29,9 +29,7 @@ class SummaryLengthTest extends KernelTestBase {
   use ContentTypeCreationTrait {
     createContentType as drupalCreateContentType;
   }
-  use EntityViewTrait {
-    buildEntityView as drupalBuildEntityView;
-  }
+  use EntityViewTrait;
 
   /**
    * {@inheritdoc}
@@ -89,7 +87,7 @@ public function testSummaryLength() {
     $this->assertNotEmpty(Node::load($node->id()), 'Node created.');
 
     // Render the node as a teaser.
-    $content = $this->drupalBuildEntityView($node, 'teaser');
+    $content = $this->buildFullEntityView($node, 'teaser');
     $this->assertTrue(strlen($content['body'][0]['#markup']) < 600, 'Teaser is less than 600 characters long.');
     $this->setRawContent($renderer->renderRoot($content));
     // The string 'What is a Drupalism?' is between the 200th and 600th
@@ -108,8 +106,11 @@ public function testSummaryLength() {
 
     // Render the node as a teaser again and check that the summary is now only
     // 200 characters in length and so does not include 'What is a Drupalism?'.
-    $content = $this->drupalBuildEntityView($node, 'teaser');
+    $content = $this->buildFullEntityView($node, 'teaser');
     $this->assertTrue(strlen($content['body'][0]['#markup']) < 200, 'Teaser is less than 200 characters long.');
+
+    // Render the entire content array.
+    $content = $this->buildFullEntityView($node, 'teaser');
     $this->setRawContent($renderer->renderRoot($content));
     $this->assertText($node->label());
     $this->assertNoRaw($expected);
diff --git a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
index aecc9590fd..d6e6275c64 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/core.entity_form_display.node.options_install_test.default.yml
@@ -61,3 +61,5 @@ content:
     third_party_settings: {  }
 hidden: {  }
 third_party_settings: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.default.yml b/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.default.yml
index aaea1cb90e..13b63349ae 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.default.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.default.yml
@@ -25,3 +25,5 @@ content:
 hidden:
   langcode: true
 third_party_settings: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.teaser.yml b/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.teaser.yml
index 6e79af94ee..47f26ea90a 100644
--- a/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.teaser.yml
+++ b/core/modules/options/tests/options_config_install_test/config/install/core.entity_view_display.node.options_install_test.teaser.yml
@@ -27,3 +27,5 @@ content:
 hidden:
   langcode: true
 third_party_settings: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/modules/rdf/rdf.module b/core/modules/rdf/rdf.module
index 92cc337fc1..417703c8ac 100644
--- a/core/modules/rdf/rdf.module
+++ b/core/modules/rdf/rdf.module
@@ -520,6 +520,15 @@ function rdf_preprocess_comment(&$variables) {
     $variables['title_attributes']['property'] = $title_mapping['properties'];
     $variables['title_attributes']['datatype'] = '';
   }
+}
+
+/**
+ * Implements hook_entity_display_build_alter().
+ */
+function rdf_entity_display_build_alter(&$build, $context) {
+  if (!($context['entity'] instanceof CommentInterface)) {
+    return;
+  }
 
   // Annotates the parent relationship between the current comment and the node
   // it belongs to. If available, the parent comment is also annotated.
@@ -532,7 +541,7 @@ function rdf_preprocess_comment(&$variables) {
     // The parent entity URI is precomputed as part of the rdf_data so that it
     // can be cached as part of the entity.
     $parent_entity_attributes['resource'] = $comment->rdf_data['entity_uri'];
-    $variables['rdf_metadata_attributes'][] = $parent_entity_attributes;
+    $rdf_metadata_attributes[] = $parent_entity_attributes;
 
     // Adds the relation to parent comment, if it exists.
     if ($comment->hasParentComment()) {
@@ -540,19 +549,19 @@ function rdf_preprocess_comment(&$variables) {
       // The parent comment URI is precomputed as part of the rdf_data so that
       // it can be cached as part of the entity.
       $parent_comment_attributes['resource'] = $comment->rdf_data['pid_uri'];
-      $variables['rdf_metadata_attributes'][] = $parent_comment_attributes;
+      $rdf_metadata_attributes[] = $parent_comment_attributes;
     }
   }
   // Adds RDF metadata markup above comment body if any.
-  if (!empty($variables['rdf_metadata_attributes']) && isset($variables['content']['comment_body'])) {
+  if (!empty($rdf_metadata_attributes) && isset($build['comment_body'])) {
     $rdf_metadata = [
       '#theme' => 'rdf_metadata',
-      '#metadata' => $variables['rdf_metadata_attributes'],
+      '#metadata' => $rdf_metadata_attributes,
     ];
-    if (!empty($variables['content']['comment_body']['#prefix'])) {
-      $rdf_metadata['#suffix'] = $variables['content']['comment_body']['#prefix'];
+    if (!empty($build['comment_body']['#prefix'])) {
+      $rdf_metadata['#suffix'] = $build['comment_body']['#prefix'];
     }
-    $variables['content']['comment_body']['#prefix'] = \Drupal::service('renderer')->render($rdf_metadata);
+    $build['comment_body']['#prefix'] = \Drupal::service('renderer')->render($rdf_metadata);
   }
 }
 
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 28758b0601..4586d34431 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -242,7 +242,7 @@ function system_theme() {
     'off_canvas_page_wrapper' => [
       'variables' => ['children' => NULL],
     ],
-  ]);
+  ], \Drupal::service('plugin.manager.core.layout')->getThemeImplementations());
 }
 
 /**
diff --git a/core/modules/layout_discovery/templates/layout.html.twig b/core/modules/system/templates/layout.html.twig
similarity index 100%
rename from core/modules/layout_discovery/templates/layout.html.twig
rename to core/modules/system/templates/layout.html.twig
diff --git a/core/modules/system/tests/modules/layout_test/config/schema/layout_test.schema.yml b/core/modules/system/tests/modules/layout_test/config/schema/layout_test.schema.yml
index 521faafae1..9377c73cf6 100644
--- a/core/modules/system/tests/modules/layout_test/config/schema/layout_test.schema.yml
+++ b/core/modules/system/tests/modules/layout_test/config/schema/layout_test.schema.yml
@@ -5,3 +5,11 @@ layout_plugin.settings.layout_test_plugin:
     setting_1:
       type: string
       label: 'Setting 1'
+
+layout_plugin.settings.test_layout_main_and_footer:
+  type: layout_plugin.settings
+  label: 'Layout test plugin settings'
+  mapping:
+    setting_1:
+      type: string
+      label: 'Setting 1'
diff --git a/core/modules/system/tests/modules/layout_test/layout_test.info.yml b/core/modules/system/tests/modules/layout_test/layout_test.info.yml
index 2a7a5c01e0..8492c1b8bc 100644
--- a/core/modules/system/tests/modules/layout_test/layout_test.info.yml
+++ b/core/modules/system/tests/modules/layout_test/layout_test.info.yml
@@ -3,3 +3,5 @@ type: module
 description: 'Support module for testing layouts.'
 package: Testing
 version: VERSION
+dependencies:
+  - entity_test
diff --git a/core/modules/system/tests/modules/layout_test/layout_test.module b/core/modules/system/tests/modules/layout_test/layout_test.module
index 6ebaa25456..831cd89106 100644
--- a/core/modules/system/tests/modules/layout_test/layout_test.module
+++ b/core/modules/system/tests/modules/layout_test/layout_test.module
@@ -11,3 +11,13 @@
 function template_preprocess_layout_test_2col(&$variables) {
   $variables['region_attributes']['left']->addClass('class-added-by-preprocess');
 }
+
+/**
+ * Implements hook_layout_alter().
+ */
+function layout_test_layout_alter(&$definitions) {
+  /** @var \Drupal\Core\Layout\LayoutDefinition[] $definitions */
+  if (\Drupal::state()->get('layout_test.alter_regions') && isset($definitions['layout_default'])) {
+    $definitions['layout_default']->setRegions(['foo' => ['label' => 'Foo']]);
+  }
+}
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.routing.yml b/core/modules/system/tests/modules/layout_test/layout_test.routing.yml
similarity index 100%
rename from core/modules/field_layout/tests/modules/field_layout_test/field_layout_test.routing.yml
rename to core/modules/system/tests/modules/layout_test/layout_test.routing.yml
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/src/Plugin/Layout/TestLayoutContentFooter.php b/core/modules/system/tests/modules/layout_test/src/Plugin/Layout/TestLayoutContentFooter.php
similarity index 100%
rename from core/modules/field_layout/tests/modules/field_layout_test/src/Plugin/Layout/TestLayoutContentFooter.php
rename to core/modules/system/tests/modules/layout_test/src/Plugin/Layout/TestLayoutContentFooter.php
diff --git a/core/modules/field_layout/tests/modules/field_layout_test/src/Plugin/Layout/TestLayoutMainFooter.php b/core/modules/system/tests/modules/layout_test/src/Plugin/Layout/TestLayoutMainFooter.php
similarity index 100%
rename from core/modules/field_layout/tests/modules/field_layout_test/src/Plugin/Layout/TestLayoutMainFooter.php
rename to core/modules/system/tests/modules/layout_test/src/Plugin/Layout/TestLayoutMainFooter.php
diff --git a/core/modules/views/src/Entity/Render/EntityFieldRenderer.php b/core/modules/views/src/Entity/Render/EntityFieldRenderer.php
index 7002c73403..b7a2655cd8 100644
--- a/core/modules/views/src/Entity/Render/EntityFieldRenderer.php
+++ b/core/modules/views/src/Entity/Render/EntityFieldRenderer.php
@@ -250,6 +250,7 @@ protected function buildFields(array $values) {
             $display->setComponent($field->definition['field_name'], [
               'type' => $field->options['type'],
               'settings' => $field->options['settings'],
+              'region' => $display->getDefaultRegion(),
             ]);
           }
           // Let the display build the render array for the entities.
@@ -258,7 +259,7 @@ protected function buildFields(array $values) {
           // row indexes and field IDs.
           foreach ($display_build as $row_index => $entity_build) {
             foreach ($display_fields['field_ids'] as $field_id => $field) {
-              $build[$row_index][$field_id] = !empty($entity_build[$field->definition['field_name']]) ? $entity_build[$field->definition['field_name']] : [];
+              $build[$row_index][$field_id] = $display->getFieldFromBuild($field->definition['field_name'], $entity_build);
             }
           }
         }
diff --git a/core/modules/workspaces/config/install/core.entity_form_display.workspace.workspace.deploy.yml b/core/modules/workspaces/config/install/core.entity_form_display.workspace.workspace.deploy.yml
index 201d636235..3299c6a7a0 100644
--- a/core/modules/workspaces/config/install/core.entity_form_display.workspace.workspace.deploy.yml
+++ b/core/modules/workspaces/config/install/core.entity_form_display.workspace.workspace.deploy.yml
@@ -13,3 +13,5 @@ content: {  }
 hidden:
   parent: true
   uid: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
index ccacac9995..17460d2234 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.banner_block.default.yml
@@ -68,3 +68,5 @@ content:
     third_party_settings: {  }
 hidden:
   moderation_state: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
index 1f08c728c1..90b1166ae9 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.basic.default.yml
@@ -43,3 +43,5 @@ content:
     region: content
 hidden:
   moderation_state: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
index 14bc219b9b..860a63ea5f 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.disclaimer_block.default.yml
@@ -50,3 +50,5 @@ content:
     region: content
 hidden:
   moderation_state: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
index 336985a817..5420e7333e 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.block_content.footer_promo_block.default.yml
@@ -68,3 +68,5 @@ content:
     third_party_settings: {  }
 hidden:
   moderation_state: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.contact_message.feedback.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.contact_message.feedback.default.yml
index 140fb22249..983143c87b 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.contact_message.feedback.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.contact_message.feedback.default.yml
@@ -48,3 +48,5 @@ content:
     third_party_settings: {  }
 hidden:
   preview: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml
index ac659d3160..98515e6ca3 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.audio.default.yml
@@ -58,3 +58,5 @@ content:
 hidden:
   moderation_state: true
   name: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml
index eb3032bf8d..e960883051 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.image.default.yml
@@ -72,3 +72,5 @@ content:
     third_party_settings: {  }
 hidden:
   moderation_state: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml
index 9ff0e45382..183fa03ca6 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.remote_video.default.yml
@@ -59,3 +59,5 @@ content:
 hidden:
   moderation_state: true
   name: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml
index b934025533..c2620f7616 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.media.video.default.yml
@@ -58,3 +58,5 @@ content:
 hidden:
   moderation_state: true
   name: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
index cee7fda1f6..ad61f0fe86 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.article.default.yml
@@ -114,3 +114,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
index 97fb4e243b..8da2b292b1 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.page.default.yml
@@ -94,3 +94,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
index fba3439718..43e28bf77d 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.node.recipe.default.yml
@@ -179,3 +179,5 @@ content:
     region: content
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_form_display.user.user.default.yml b/core/profiles/demo_umami/config/install/core.entity_form_display.user.user.default.yml
index bcd230c637..22c17580ac 100644
--- a/core/profiles/demo_umami/config/install/core.entity_form_display.user.user.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_form_display.user.user.default.yml
@@ -34,3 +34,5 @@ content:
     region: content
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.banner_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.banner_block.default.yml
index cdeba466e1..7c464c7f3e 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.banner_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.banner_block.default.yml
@@ -52,3 +52,5 @@ content:
     region: content
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.basic.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.basic.default.yml
index 057e01cc93..da57d9351d 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.basic.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.basic.default.yml
@@ -20,3 +20,5 @@ content:
     third_party_settings: {  }
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.disclaimer_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.disclaimer_block.default.yml
index 92cef66880..87b37e8710 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.disclaimer_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.disclaimer_block.default.yml
@@ -28,3 +28,5 @@ content:
     region: content
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.footer_promo_block.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.footer_promo_block.default.yml
index a2f2262290..ab9a27cf5f 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.footer_promo_block.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.block_content.footer_promo_block.default.yml
@@ -52,3 +52,5 @@ content:
     region: content
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.media.audio.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.media.audio.default.yml
index 7de868a262..a898e8183e 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.media.audio.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.media.audio.default.yml
@@ -28,3 +28,5 @@ hidden:
   name: true
   thumbnail: true
   uid: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.media.image.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.media.image.default.yml
index f884019215..fbc4c891fc 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.media.image.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.media.image.default.yml
@@ -27,3 +27,5 @@ hidden:
   name: true
   thumbnail: true
   uid: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.media.remote_video.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.media.remote_video.default.yml
index 6894add2a9..f9015dc687 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.media.remote_video.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.media.remote_video.default.yml
@@ -26,3 +26,5 @@ hidden:
   name: true
   thumbnail: true
   uid: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.media.video.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.media.video.default.yml
index e33e0c10d3..3baab5469d 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.media.video.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.media.video.default.yml
@@ -31,3 +31,5 @@ hidden:
   name: true
   thumbnail: true
   uid: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card.yml
index 9d5d869e72..001a63f009 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card.yml
@@ -29,3 +29,5 @@ hidden:
   field_tags: true
   langcode: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common.yml
index 2f58539c3f..2a2dc472c9 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common.yml
@@ -29,3 +29,5 @@ hidden:
   field_tags: true
   langcode: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common_alt.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common_alt.yml
index 269dd8e27f..59cdfdb043 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common_alt.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.card_common_alt.yml
@@ -29,3 +29,5 @@ hidden:
   field_tags: true
   langcode: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.default.yml
index 340924b386..2f6f71cca0 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.default.yml
@@ -46,3 +46,5 @@ content:
 hidden:
   content_moderation_control: true
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.full.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.full.yml
index 6cbfbe7371..518956778c 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.full.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.full.yml
@@ -51,3 +51,5 @@ content:
     third_party_settings: {  }
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.rss.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.rss.yml
index 304b8aeb5a..5ca7a16eb6 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.rss.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.rss.yml
@@ -23,3 +23,5 @@ hidden:
   field_media_image: true
   field_tags: true
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.teaser.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.teaser.yml
index 0920f18055..b21079b512 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.teaser.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.article.teaser.yml
@@ -48,3 +48,5 @@ content:
 hidden:
   content_moderation_control: true
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.default.yml
index 86c812fd5f..78c3930978 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.default.yml
@@ -31,3 +31,5 @@ content:
     third_party_settings: {  }
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.teaser.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.teaser.yml
index 2b17fca843..4ce0c98ed0 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.teaser.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.page.teaser.yml
@@ -27,3 +27,5 @@ content:
 hidden:
   content_moderation_control: true
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card.yml
index 53dd3b04b3..4ded33212d 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card.yml
@@ -52,3 +52,5 @@ hidden:
   langcode: true
   layout_builder__layout: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common.yml
index e4f7e9b8f2..8701e08dd0 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common.yml
@@ -45,3 +45,5 @@ hidden:
   langcode: true
   layout_builder__layout: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common_alt.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common_alt.yml
index 229f4e1fdd..c0f057804a 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common_alt.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.card_common_alt.yml
@@ -45,3 +45,5 @@ hidden:
   langcode: true
   layout_builder__layout: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.default.yml
index 20daf4d001..64cfb3d219 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.default.yml
@@ -113,3 +113,5 @@ hidden:
   content_moderation_control: true
   langcode: true
   layout_builder__layout: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.full.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.full.yml
index eddea371d1..1238b12557 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.full.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.full.yml
@@ -332,3 +332,5 @@ hidden:
   langcode: true
   layout_builder__layout: true
   links: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.teaser.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.teaser.yml
index d72087e46b..64790ad4a0 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.teaser.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.node.recipe.teaser.yml
@@ -39,3 +39,5 @@ hidden:
   field_tags: true
   langcode: true
   layout_builder__layout: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.compact.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.compact.yml
index 0cfcf3a111..c0a1b313ff 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.compact.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.compact.yml
@@ -25,3 +25,5 @@ content:
 hidden:
   langcode: true
   member_for: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.default.yml b/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.default.yml
index 0e18a05ea1..927f16d08c 100644
--- a/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.default.yml
+++ b/core/profiles/demo_umami/config/install/core.entity_view_display.user.user.default.yml
@@ -26,3 +26,5 @@ content:
     label: hidden
 hidden:
   langcode: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_form_display.block_content.basic.default.yml b/core/profiles/standard/config/install/core.entity_form_display.block_content.basic.default.yml
index fe49840e80..5e84cddb49 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.block_content.basic.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.block_content.basic.default.yml
@@ -30,3 +30,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_form_display.comment.comment.default.yml b/core/profiles/standard/config/install/core.entity_form_display.comment.comment.default.yml
index 1010be2924..954293fe9a 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.comment.comment.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.comment.comment.default.yml
@@ -31,3 +31,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
index 1f7102dd49..a0255faba0 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.node.article.default.yml
@@ -104,3 +104,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
index 342988cbe2..09bb49597a 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.node.page.default.yml
@@ -74,3 +74,5 @@ content:
       placeholder: ''
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_form_display.user.user.default.yml b/core/profiles/standard/config/install/core.entity_form_display.user.user.default.yml
index 6832229268..8443df5a4c 100644
--- a/core/profiles/standard/config/install/core.entity_form_display.user.user.default.yml
+++ b/core/profiles/standard/config/install/core.entity_form_display.user.user.default.yml
@@ -33,3 +33,5 @@ content:
     weight: -1
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.block_content.basic.default.yml b/core/profiles/standard/config/install/core.entity_view_display.block_content.basic.default.yml
index e494882d40..f24c9e4dd2 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.block_content.basic.default.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.block_content.basic.default.yml
@@ -19,3 +19,5 @@ content:
     settings: {  }
     third_party_settings: {  }
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.comment.comment.default.yml b/core/profiles/standard/config/install/core.entity_view_display.comment.comment.default.yml
index 6ae213d3ee..10d9376cd3 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.comment.comment.default.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.comment.comment.default.yml
@@ -22,3 +22,5 @@ content:
     weight: 100
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.node.article.default.yml b/core/profiles/standard/config/install/core.entity_view_display.node.article.default.yml
index 5019b6503d..1fb56e20e5 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.node.article.default.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.node.article.default.yml
@@ -57,4 +57,8 @@ content:
     region: content
     settings: {  }
     third_party_settings: {  }
-hidden: {  }
+hidden:
+  field_image: true
+  field_tags: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.node.article.rss.yml b/core/profiles/standard/config/install/core.entity_view_display.node.article.rss.yml
index 84660b6d2b..a0402c3e0a 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.node.article.rss.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.node.article.rss.yml
@@ -23,3 +23,5 @@ hidden:
   comment: true
   field_image: true
   field_tags: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.node.article.teaser.yml b/core/profiles/standard/config/install/core.entity_view_display.node.article.teaser.yml
index 7b96908bed..4be0fb3227 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.node.article.teaser.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.node.article.teaser.yml
@@ -50,3 +50,5 @@ hidden:
   comment: true
   field_image: true
   field_tags: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.node.page.default.yml b/core/profiles/standard/config/install/core.entity_view_display.node.page.default.yml
index 8afd9423ec..4119e46e7b 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.node.page.default.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.node.page.default.yml
@@ -23,3 +23,5 @@ content:
     weight: 101
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.node.page.teaser.yml b/core/profiles/standard/config/install/core.entity_view_display.node.page.teaser.yml
index bc7a68c5b5..63e39031e6 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.node.page.teaser.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.node.page.teaser.yml
@@ -25,3 +25,5 @@ content:
     weight: 101
     region: content
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.user.user.compact.yml b/core/profiles/standard/config/install/core.entity_view_display.user.user.compact.yml
index 2ff13ad10f..c61652f03d 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.user.user.compact.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.user.user.compact.yml
@@ -24,3 +24,5 @@ content:
     label: hidden
 hidden:
   member_for: true
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/profiles/standard/config/install/core.entity_view_display.user.user.default.yml b/core/profiles/standard/config/install/core.entity_view_display.user.user.default.yml
index ef1fdd79ce..6c9b20f393 100644
--- a/core/profiles/standard/config/install/core.entity_view_display.user.user.default.yml
+++ b/core/profiles/standard/config/install/core.entity_view_display.user.user.default.yml
@@ -25,3 +25,5 @@ content:
     third_party_settings: {  }
     label: hidden
 hidden: {  }
+layout_id: layout_default
+layout_settings: {  }
diff --git a/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php b/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php
index 5ccd9ad5d1..485752a675 100644
--- a/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php
+++ b/core/tests/Drupal/FunctionalTests/Rest/EntityFormDisplayResourceTestBase.php
@@ -129,6 +129,8 @@ protected function getExpectedNormalizedEntity() {
       'status' => NULL,
       'targetEntityType' => 'node',
       'uuid' => $this->entity->uuid(),
+      'layout_id' => 'layout_default',
+      'layout_settings' => [],
     ];
   }
 
diff --git a/core/tests/Drupal/FunctionalTests/Rest/EntityViewDisplayResourceTestBase.php b/core/tests/Drupal/FunctionalTests/Rest/EntityViewDisplayResourceTestBase.php
index 50f6f3b6f3..157ccefff5 100644
--- a/core/tests/Drupal/FunctionalTests/Rest/EntityViewDisplayResourceTestBase.php
+++ b/core/tests/Drupal/FunctionalTests/Rest/EntityViewDisplayResourceTestBase.php
@@ -87,6 +87,8 @@ protected function getExpectedNormalizedEntity() {
       'status' => TRUE,
       'targetEntityType' => 'node',
       'uuid' => $this->entity->uuid(),
+      'layout_id' => 'layout_default',
+      'layout_settings' => [],
     ];
   }
 
diff --git a/core/modules/field_layout/tests/src/Kernel/FieldLayoutEntityDisplayTest.php b/core/tests/Drupal/KernelTests/Core/Entity/EntityViewDisplayTest.php
similarity index 97%
rename from core/modules/field_layout/tests/src/Kernel/FieldLayoutEntityDisplayTest.php
rename to core/tests/Drupal/KernelTests/Core/Entity/EntityViewDisplayTest.php
index 1f94b9da38..8f0d99235d 100644
--- a/core/modules/field_layout/tests/src/Kernel/FieldLayoutEntityDisplayTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Entity/EntityViewDisplayTest.php
@@ -28,7 +28,7 @@ class FieldLayoutEntityDisplayTest extends KernelTestBase {
    */
   public function testPreSave() {
     // Create an entity display with one hidden and one visible field.
-    $entity_display = FieldLayoutEntityViewDisplay::create([
+    $entity_display = EntityViewDisplay::create([
       'targetEntityType' => 'entity_test',
       'bundle' => 'entity_test',
       'mode' => 'default',
@@ -66,6 +66,8 @@ public function testPreSave() {
       'hidden' => [
         'bar' => TRUE,
       ],
+      'layout_id' => 'layout_default',
+      'layout_settings' => [],
     ];
     $this->assertEntityValues($expected, $entity_display->toArray());
 
diff --git a/core/tests/Drupal/Tests/Core/Config/Entity/EntityDisplayBaseTest.php b/core/tests/Drupal/Tests/Core/Config/Entity/EntityDisplayBaseTest.php
index 8dd7e77dc7..231e6f2d8d 100644
--- a/core/tests/Drupal/Tests/Core/Config/Entity/EntityDisplayBaseTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/Entity/EntityDisplayBaseTest.php
@@ -59,6 +59,11 @@ public function testGetTargetBundle() {
    * @covers ::setTargetBundle
    */
   public function testSetTargetBundle() {
+    $layout_plugin_manager = $this->prophesize(LayoutPluginManagerInterface::class);
+    $container = new ContainerBuilder();
+    $container->set('plugin.manager.core.layout', $layout_plugin_manager->reveal());
+    \Drupal::setContainer($container);
+
     $mock = $this->getMockForAbstractClass('\Drupal\Core\Entity\EntityDisplayBase', [], '', FALSE);
     $reflection = new \ReflectionProperty($mock, 'bundle');
     $reflection->setAccessible(TRUE);
diff --git a/core/tests/Drupal/Tests/EntityViewTrait.php b/core/tests/Drupal/Tests/EntityViewTrait.php
index 41581a5f30..9cdfbfd5c4 100644
--- a/core/tests/Drupal/Tests/EntityViewTrait.php
+++ b/core/tests/Drupal/Tests/EntityViewTrait.php
@@ -32,10 +32,11 @@ trait EntityViewTrait {
    *   (optional) Whether to clear the cache for this entity.
    *
    * @return array
+   *   The render array for the given entity.
    *
    * @see \Drupal\Core\Render\RendererInterface::render()
    */
-  protected function buildEntityView(EntityInterface $entity, $view_mode = 'full', $langcode = NULL, $reset = FALSE) {
+  protected function buildFullEntityView(EntityInterface $entity, $view_mode = 'full', $langcode = NULL, $reset = FALSE) {
     $ensure_fully_built = function (&$elements) use (&$ensure_fully_built) {
       // If the default values for this element have not been loaded yet, populate
       // them.
