diff --git a/core/composer.json b/core/composer.json
index c3600ab..e399eb2 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -110,6 +110,7 @@
         "drupal/image": "self.version",
         "drupal/inline_form_errors": "self.version",
         "drupal/language": "self.version",
+        "drupal/layout_builder": "self.version",
         "drupal/layout_discovery": "self.version",
         "drupal/link": "self.version",
         "drupal/locale": "self.version",
diff --git a/core/modules/layout_builder/layout_builder.info.yml b/core/modules/layout_builder/layout_builder.info.yml
new file mode 100644
index 0000000..50a51d0
--- /dev/null
+++ b/core/modules/layout_builder/layout_builder.info.yml
@@ -0,0 +1,8 @@
+name: 'Layout Builder'
+type: module
+description: 'Provides layout building utility.'
+package: Core (Experimental)
+version: VERSION
+core: 8.x
+dependencies:
+  - layout_discovery
diff --git a/core/modules/layout_builder/layout_builder.module b/core/modules/layout_builder/layout_builder.module
new file mode 100644
index 0000000..ab80ff5
--- /dev/null
+++ b/core/modules/layout_builder/layout_builder.module
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * @file
+ * Provides hook implementations for Layout Builder.
+ */
+
+/**
+ * Implements hook_help().
+ */
+function layout_builder_help($route_name) {
+  switch ($route_name) {
+    case 'help.page.layout_builder':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('Layout Builder provides layout building utility, surprisingly.') . '</p>';
+      $output .= '<p>' . t('For more information, see the <a href=":layout-builder-documentation">online documentation for the Layout Builder module</a>.', [':layout-builder-documentation' => 'https://www.drupal.org/docs/8/core/modules/layout_builder']) . '</p>';
+      return $output;
+  }
+}
diff --git a/core/modules/layout_builder/src/LayoutSectionItemInterface.php b/core/modules/layout_builder/src/LayoutSectionItemInterface.php
new file mode 100644
index 0000000..1a39cde
--- /dev/null
+++ b/core/modules/layout_builder/src/LayoutSectionItemInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Drupal\layout_builder;
+
+use Drupal\Core\Field\FieldItemInterface;
+
+/**
+ * Defines an interface for the layout section field item.
+ *
+ * @property string layout
+ * @property array[] section
+ */
+interface LayoutSectionItemInterface extends FieldItemInterface {
+
+}
diff --git a/core/modules/layout_builder/src/Plugin/Field/FieldFormatter/LayoutSectionFormatter.php b/core/modules/layout_builder/src/Plugin/Field/FieldFormatter/LayoutSectionFormatter.php
new file mode 100644
index 0000000..5b07008
--- /dev/null
+++ b/core/modules/layout_builder/src/Plugin/Field/FieldFormatter/LayoutSectionFormatter.php
@@ -0,0 +1,137 @@
+<?php
+
+namespace Drupal\layout_builder\Plugin\Field\FieldFormatter;
+
+use Drupal\Core\Block\BlockManagerInterface;
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemListInterface;
+use Drupal\Core\Field\FormatterBase;
+use Drupal\Core\Layout\LayoutPluginManagerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\layout_builder\LayoutSectionItemInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Plugin implementation of the 'layout_section' formatter.
+ *
+ * @FieldFormatter(
+ *   id = "layout_section",
+ *   label = @Translation("Layout Section"),
+ *   field_types = {
+ *     "layout_section"
+ *   }
+ * )
+ */
+class LayoutSectionFormatter extends FormatterBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * The layout plugin manager.
+   *
+   * @var \Drupal\Core\Layout\LayoutPluginManager
+   */
+  protected $layoutPluginManager;
+
+  /**
+   * The block plugin manager.
+   *
+   * @var \Drupal\Core\Block\BlockManagerInterface
+   */
+  protected $blockManager;
+
+  /**
+   * Constructs a LayoutSectionFormatter object.
+   *
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user.
+   * @param \Drupal\Core\Layout\LayoutPluginManagerInterface $layoutPluginManager
+   *   The layout plugin manager.
+   * @param \Drupal\Core\Block\BlockManagerInterface $blockManager
+   *   THe block plugin manager.
+   * @param string $plugin_id
+   *   The plugin ID for the formatter.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\Core\Field\FieldDefinitionInterface $field_definition
+   *   The definition of the field to which the formatter is associated.
+   * @param array $settings
+   *   The formatter settings.
+   * @param string $label
+   *   The formatter label display setting.
+   * @param string $view_mode
+   *   The view mode.
+   * @param array $third_party_settings
+   *   Any third party settings.
+   */
+  public function __construct(AccountInterface $account, LayoutPluginManagerInterface $layoutPluginManager, BlockManagerInterface $blockManager, $plugin_id, $plugin_definition, FieldDefinitionInterface $field_definition, array $settings, $label, $view_mode, array $third_party_settings) {
+    $this->account = $account;
+    $this->layoutPluginManager = $layoutPluginManager;
+    $this->blockManager = $blockManager;
+    parent::__construct($plugin_id, $plugin_definition, $field_definition, $settings, $label, $view_mode, $third_party_settings);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $container->get('current_user'),
+      $container->get('plugin.manager.core.layout'),
+      $container->get('plugin.manager.block'),
+      $plugin_id,
+      $plugin_definition,
+      $configuration['field_definition'],
+      $configuration['settings'],
+      $configuration['label'],
+      $configuration['view_mode'],
+      $configuration['third_party_settings']
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function viewElements(FieldItemListInterface $items, $langcode) {
+    $elements = [];
+
+    foreach ($items as $delta => $item) {
+      $elements[$delta] = $this->buildSection($item);
+    }
+
+    return $elements;
+  }
+
+  /**
+   * Builds the render array for the layout section.
+   *
+   * @param \Drupal\layout_builder\LayoutSectionItemInterface $item
+   *   The layout section item.
+   *
+   * @return array
+   *   A render array for the field item.
+   */
+  protected function buildSection(LayoutSectionItemInterface $item) {
+    /** @var \Drupal\Core\Layout\LayoutInterface $layout */
+    $layout = $this->layoutPluginManager->createInstance($item->layout);
+    $regions = [];
+    foreach ($item->section as $region => $blocks) {
+      foreach ($blocks as $uuid => $configuration) {
+        /** @var \Drupal\Core\Block\BlockPluginInterface $block */
+        $block = $this->blockManager->createInstance($configuration['plugin_id'], $configuration);
+        $access = $block->access($this->account, TRUE);
+        if ($access->isAllowed()) {
+          $regions[$region][$uuid] = $block->build();
+        }
+      }
+    }
+    return $layout->build($regions);
+  }
+
+}
diff --git a/core/modules/layout_builder/src/Plugin/Field/FieldType/LayoutSectionItem.php b/core/modules/layout_builder/src/Plugin/Field/FieldType/LayoutSectionItem.php
new file mode 100644
index 0000000..8cf547d
--- /dev/null
+++ b/core/modules/layout_builder/src/Plugin/Field/FieldType/LayoutSectionItem.php
@@ -0,0 +1,87 @@
+<?php
+
+namespace Drupal\layout_builder\Plugin\Field\FieldType;
+
+use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Core\Field\FieldItemBase;
+use Drupal\Core\Field\FieldStorageDefinitionInterface;
+use Drupal\Core\StringTranslation\TranslatableMarkup;
+use Drupal\Core\TypedData\DataDefinition;
+use Drupal\Core\TypedData\MapDataDefinition;
+use Drupal\layout_builder\LayoutSectionItemInterface;
+
+/**
+ * Plugin implementation of the 'layout_section' field type.
+ *
+ * @FieldType(
+ *   id = "layout_section",
+ *   label = @Translation("Layout Section"),
+ *   description = @Translation("Layout Section"),
+ *   default_formatter = "layout_section"
+ * )
+ */
+class LayoutSectionItem extends FieldItemBase implements LayoutSectionItemInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function propertyDefinitions(FieldStorageDefinitionInterface $field_definition) {
+    // Prevent early t() calls by using the TranslatableMarkup.
+    $properties['layout'] = DataDefinition::create('string')
+      ->setLabel(new TranslatableMarkup('Layout'))
+      ->setSetting('case_sensitive', FALSE)
+      ->setRequired(TRUE);
+    $properties[static::mainPropertyName()] = MapDataDefinition::create('map')
+      ->setLabel(new TranslatableMarkup('Layout Section'))
+      ->setRequired(FALSE);
+
+    return $properties;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function mainPropertyName() {
+    return 'section';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function schema(FieldStorageDefinitionInterface $field_definition) {
+    $schema = [
+      'columns' => [
+        'layout' => [
+          'type' => 'varchar',
+          'length' => '255',
+          'binary' => FALSE,
+        ],
+        static::mainPropertyName() => [
+          'type' => 'blob',
+          'size' => 'normal',
+          'serialize' => TRUE,
+        ],
+      ],
+    ];
+
+    return $schema;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function generateSampleValue(FieldDefinitionInterface $field_definition) {
+    $values['layout'] = 'layout_onecol';
+    $values[static::mainPropertyName()] = [];
+    return $values;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isEmpty() {
+    $sections = $this->get(static::mainPropertyName())->getValue();
+    return empty($sections);
+  }
+
+}
diff --git a/core/modules/layout_builder/tests/src/Kernel/LayoutSectionFormatterTest.php b/core/modules/layout_builder/tests/src/Kernel/LayoutSectionFormatterTest.php
new file mode 100644
index 0000000..fe540d0
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Kernel/LayoutSectionFormatterTest.php
@@ -0,0 +1,120 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Kernel;
+
+use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Entity\Entity\EntityViewDisplay;
+use Drupal\entity_test\Entity\EntityTest;
+use Drupal\field\Entity\FieldConfig;
+use Drupal\field\Entity\FieldStorageConfig;
+use Drupal\KernelTests\KernelTestBase;
+
+/**
+ * Tests the layout section formatter.
+ *
+ * @group layout_builder
+ */
+class LayoutSectionFormatterTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['field', 'layout_builder', 'layout_discovery', 'entity_test', 'user', 'system'];
+
+  /**
+   * The name of the layout section field.
+   *
+   * @var string
+   */
+  protected $fieldName;
+
+  /**
+   * The entity display.
+   *
+   * @var \Drupal\Core\Entity\Display\EntityViewDisplayInterface
+   */
+  protected $display;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installConfig(['field']);
+    $this->installEntitySchema('entity_test');
+
+    $entity_type = 'entity_test';
+    $bundle = $entity_type;
+    $this->fieldName = Unicode::strtolower($this->randomMachineName());
+
+    $field_storage = FieldStorageConfig::create([
+      'field_name' => $this->fieldName,
+      'entity_type' => $entity_type,
+      'type' => 'layout_section',
+    ]);
+    $field_storage->save();
+
+    $instance = FieldConfig::create([
+      'field_storage' => $field_storage,
+      'bundle' => $bundle,
+      'label' => $this->randomMachineName(),
+    ]);
+    $instance->save();
+
+    $this->display = EntityViewDisplay::create([
+      'targetEntityType' => $entity_type,
+      'bundle' => $bundle,
+      'mode' => 'default',
+      'status' => TRUE,
+    ]);
+    $this->display->setComponent($this->fieldName, [
+      'type' => 'layout_section',
+      'settings' => [],
+    ]);
+    $this->display->save();
+  }
+
+  /**
+   * Tests layout_section formatter output.
+   *
+   * @dataProvider providerTestLayoutSectionFormatter
+   */
+  public function testLayoutSectionFormatter($layout, $section, $expected_selector, $expected_content) {
+    $entity = EntityTest::create([]);
+    $entity->{$this->fieldName}->layout = $layout;
+    $entity->{$this->fieldName}->section = $section;
+
+    // Build and render the content.
+    $content = $this->display->build($entity);
+    $this->render($content);
+
+    // Find the given selector.
+    $element = $this->cssSelect($expected_selector);
+    $this->assertNotEmpty($element);
+
+    // Find the given content.
+    $this->assertRaw($expected_content);
+  }
+
+  /**
+   * Provides test data to ::testLayoutSectionFormatter().
+   */
+  public function providerTestLayoutSectionFormatter() {
+    $data = [];
+    $data[] = [
+      'layout_onecol',
+      [
+        'content' => [
+          'this_should_be_a_UUID' => [
+            'plugin_id' => 'system_powered_by_block',
+          ],
+        ],
+      ],
+      '.layout--onecol',
+      'Powered by',
+    ];
+    return $data;
+  }
+
+}
