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..a21d12c
--- /dev/null
+++ b/core/modules/layout_builder/src/Plugin/Field/FieldFormatter/LayoutSectionFormatter.php
@@ -0,0 +1,166 @@
+<?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\Plugin\Context\ContextHandlerInterface;
+use Drupal\Core\Plugin\Context\ContextRepositoryInterface;
+use Drupal\Core\Plugin\ContextAwarePluginInterface;
+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;
+
+  /**
+   * The plugin context handler.
+   *
+   * @var \Drupal\Core\Plugin\Context\ContextHandlerInterface
+   */
+  protected $contextHandler;
+
+  /**
+   * The context manager service.
+   *
+   * @var \Drupal\Core\Plugin\Context\ContextRepositoryInterface
+   */
+  protected $contextRepository;
+
+  /**
+   * 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 \Drupal\Core\Plugin\Context\ContextHandlerInterface $context_handler
+   *   The ContextHandler for applying contexts to conditions properly.
+   * @param \Drupal\Core\Plugin\Context\ContextRepositoryInterface $context_repository
+   *   The lazy context repository service.
+   * @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, ContextHandlerInterface $context_handler, ContextRepositoryInterface $context_repository, $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;
+    $this->contextHandler = $context_handler;
+    $this->contextRepository = $context_repository;
+    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'),
+      $container->get('context.handler'),
+      $container->get('context.repository'),
+      $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);
+        if ($block instanceof ContextAwarePluginInterface) {
+          $contexts = $this->contextRepository->getRuntimeContexts(array_values($block->getContextMapping()));
+          $this->contextHandler->applyContextMapping($block, $contexts);
+        }
+        $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..da5c9b5
--- /dev/null
+++ b/core/modules/layout_builder/tests/src/Kernel/LayoutSectionFormatterTest.php
@@ -0,0 +1,212 @@
+<?php
+
+namespace Drupal\Tests\layout_builder\Kernel;
+
+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;
+use Drupal\user\Entity\User;
+
+/**
+ * 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',
+    'block_test',
+  ];
+
+  /**
+   * 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->installSchema('system', ['sequences']);
+    $this->installEntitySchema('entity_test');
+    $this->installEntitySchema('user');
+
+    $entity_type = 'entity_test';
+    $bundle = $entity_type;
+    $this->fieldName = 'field_my_sections';
+
+    $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' => 'My Sections',
+    ]);
+    $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();
+
+    $test_user = User::create([
+      'name' => 'foobar',
+      'mail' => 'foobar@example.com',
+    ]);
+    $test_user->save();
+    $this->container->get('current_user')->setAccount($test_user);
+  }
+
+  /**
+   * Tests layout_section formatter output.
+   *
+   * @dataProvider providerTestLayoutSectionFormatter
+   */
+  public function testLayoutSectionFormatter($layout_data, $expected_selector, $expected_content) {
+    $values = [];
+    $values[$this->fieldName] = $layout_data;
+    $entity = EntityTest::create($values);
+
+    // Build and render the content.
+    $content = $this->display->build($entity);
+    $this->render($content);
+    // Pass the main content to the assertions to help with debugging.
+    $main_content = $this->cssSelect('main')[0]->asXML();
+
+    // Find the given selector.
+    foreach ((array) $expected_selector as $selector) {
+      $element = $this->cssSelect($selector);
+      $this->assertNotEmpty($element, $main_content);
+    }
+
+    // Find the given content.
+    foreach ((array) $expected_content as $content) {
+      $this->assertRaw($content, $main_content);
+    }
+  }
+
+  /**
+   * Provides test data to ::testLayoutSectionFormatter().
+   */
+  public function providerTestLayoutSectionFormatter() {
+    $data = [];
+    $data['block_with_context'] = [
+      [
+        [
+          'layout' => 'layout_onecol',
+          'section' => [
+            'content' => [
+              'baz' => [
+                'plugin_id' => 'test_context_aware',
+                'context_mapping' => [
+                  'user' => '@user.current_user_context:current_user',
+                ],
+              ],
+            ],
+          ],
+        ],
+      ],
+      [
+        '.layout--onecol',
+        '#test_context_aware--username',
+      ],
+      [
+        'foobar',
+        'User context found',
+      ],
+    ];
+    $data['single_section_single_block'] = [
+      [
+        [
+          'layout' => 'layout_onecol',
+          'section' => [
+            'content' => [
+              'baz' => [
+                'plugin_id' => 'system_powered_by_block',
+              ],
+            ],
+          ],
+        ],
+      ],
+      '.layout--onecol',
+      'Powered by',
+    ];
+    $data['multiple_sections'] = [
+      [
+        [
+          'layout' => 'layout_onecol',
+          'section' => [
+            'content' => [
+              'baz' => [
+                'plugin_id' => 'system_powered_by_block',
+              ],
+            ],
+          ],
+        ],
+        [
+          'layout' => 'layout_twocol',
+          'section' => [
+            'left' => [
+              'foo' => [
+                'plugin_id' => 'test_block_instantiation',
+                'display_message' => 'foo text',
+              ],
+            ],
+            'right' => [
+              'bar' => [
+                'plugin_id' => 'test_block_instantiation',
+                'display_message' => 'bar text',
+              ],
+            ],
+          ],
+        ],
+      ],
+      [
+        '.layout--onecol',
+        '.layout--twocol',
+      ],
+      [
+        'Powered by',
+        'foo text',
+        'bar text',
+      ],
+    ];
+    return $data;
+  }
+
+}
