diff --git a/core/lib/Drupal/Core/Block/Plugin/Block/PageTitleBlock.php b/core/lib/Drupal/Core/Block/Plugin/Block/PageTitleBlock.php
index af1fb6ee37..5775408c02 100644
--- a/core/lib/Drupal/Core/Block/Plugin/Block/PageTitleBlock.php
+++ b/core/lib/Drupal/Core/Block/Plugin/Block/PageTitleBlock.php
@@ -14,6 +14,9 @@
  *   forms = {
  *     "settings_tray" = FALSE,
  *   },
+ *   context = {
+ *     "title" = @ContextDefinition("string", required = FALSE)
+ *   },
  * )
  */
 class PageTitleBlock extends BlockBase implements TitleBlockPluginInterface {
@@ -46,7 +49,7 @@ public function defaultConfiguration() {
   public function build() {
     return [
       '#type' => 'page_title',
-      '#title' => $this->title,
+      '#title' => $this->getContextValue('title') ?: $this->title,
     ];
   }
 
diff --git a/core/modules/layout_builder/config/schema/layout_builder.schema.yml b/core/modules/layout_builder/config/schema/layout_builder.schema.yml
index 682caa78c4..b7850267a1 100644
--- a/core/modules/layout_builder/config/schema/layout_builder.schema.yml
+++ b/core/modules/layout_builder/config/schema/layout_builder.schema.yml
@@ -44,3 +44,12 @@ layout_builder.component:
     additional:
       type: ignore
       label: 'Additional data'
+
+layout_builder.theme.*:
+  type: config_object
+  label: 'Per-theme Layout Builder settings'
+  mapping:
+    sections:
+      type: sequence
+      sequence:
+        type: layout_builder.section
diff --git a/core/modules/layout_builder/layout_builder.install b/core/modules/layout_builder/layout_builder.install
index acb1e4fdf3..7669d9e5fa 100644
--- a/core/modules/layout_builder/layout_builder.install
+++ b/core/modules/layout_builder/layout_builder.install
@@ -5,9 +5,11 @@
  * Contains install and update functions for Layout Builder.
  */
 
+use Drupal\block\Entity\Block;
 use Drupal\Core\Cache\Cache;
 use Drupal\layout_builder\Entity\LayoutBuilderEntityViewDisplay;
 use Drupal\layout_builder\Section;
+use Drupal\layout_builder\SectionComponent;
 
 /**
  * Implements hook_install().
@@ -32,6 +34,109 @@ function layout_builder_install() {
     $display->save();
   }
 
+  if (\Drupal::moduleHandler()->moduleExists('block')) {
+    $theme_region_map['bartik'] = [
+      'sidebar_first' => [
+        'layout_id' => 'layout_threecol_25_50_25',
+        'component_region' => 'first',
+        'section_region' => 'content',
+      ],
+      'content' => [
+        'layout_id' => 'layout_threecol_25_50_25',
+        'component_region' => 'second',
+        'section_region' => 'content',
+      ],
+      'sidebar_second' => [
+        'layout_id' => 'layout_threecol_25_50_25',
+        'component_region' => 'third',
+        'section_region' => 'content',
+      ],
+      'featured_bottom_first' => [
+        'layout_id' => 'layout_threecol_33_34_33',
+        'component_region' => 'first',
+        'section_region' => 'featured_bottom',
+      ],
+      'featured_bottom_second' => [
+        'layout_id' => 'layout_threecol_33_34_33',
+        'component_region' => 'second',
+        'section_region' => 'featured_bottom',
+      ],
+      'featured_bottom_third' => [
+        'layout_id' => 'layout_threecol_33_34_33',
+        'component_region' => 'third',
+        'section_region' => 'featured_bottom',
+      ],
+      'footer_first' => [
+        'layout_id' => 'layout_fourcol',
+        'component_region' => 'first',
+        'section_region' => 'footer',
+      ],
+      'footer_second' => [
+        'layout_id' => 'layout_fourcol',
+        'component_region' => 'second',
+        'section_region' => 'footer',
+      ],
+      'footer_third' => [
+        'layout_id' => 'layout_fourcol',
+        'component_region' => 'third',
+        'section_region' => 'footer',
+      ],
+      'footer_fourth' => [
+        'layout_id' => 'layout_fourcol',
+        'component_region' => 'fourth',
+        'section_region' => 'footer',
+      ],
+    ];
+    $uuid_generator = \Drupal::service('uuid');
+
+    /** @var \Drupal\block\BlockInterface[] $blocks */
+    $blocks = Block::loadMultiple();
+    $themes = [];
+    foreach ($blocks as $block) {
+      $theme = $block->getTheme();
+
+      // Populate the list of regions to ensure the correct order.
+      if (!isset($themes[$theme])) {
+        $region_list = system_region_list($theme);
+        $themes[$theme] = array_fill_keys(array_keys($region_list), []);
+      }
+
+      // If the block's region is in the theme's region map, use the specified
+      // values. Otherwise use default value.
+      $old_region = $block->getRegion();
+      if (isset($theme_region_map[$theme][$old_region])) {
+        $layout_id = $theme_region_map[$theme][$old_region]['layout_id'];
+        $component_region = $theme_region_map[$theme][$old_region]['component_region'];
+        $section_region = $theme_region_map[$theme][$old_region]['section_region'];
+      }
+      else {
+        $layout_id = 'layout_onecol';
+        $component_region = 'content';
+        $section_region = $old_region;
+      }
+
+      $themes[$theme][$section_region]['layout_id'] = $layout_id;
+      $themes[$theme][$section_region]['layout_settings'] = [];
+      $themes[$theme][$section_region]['components'][] = [
+        'uuid' => $uuid_generator->generate(),
+        'region' => $component_region,
+        'configuration' => $block->get('settings'),
+        'additional' => [],
+        'weight' => $block->getWeight(),
+      ];
+    }
+
+    // Save each theme's sections in a simple config file.
+    $config_factory = \Drupal::configFactory();
+    foreach ($themes as $theme => $regions) {
+      // Only save populated regions and ensure the list is numerically indexed.
+      $sections = array_values(array_filter($regions));
+      $config_factory->getEditable("layout_builder.theme.$theme")
+        ->set('sections', $sections)
+        ->save();
+    }
+  }
+
   // Clear the rendered cache to ensure the new layout builder flow is used.
   // While in many cases the above change will not affect the rendered output,
   // the cacheability metadata will have changed and should be processed to
diff --git a/core/modules/layout_builder/layout_builder.services.yml b/core/modules/layout_builder/layout_builder.services.yml
index 6f5f3e2c60..497b0b7f3e 100644
--- a/core/modules/layout_builder/layout_builder.services.yml
+++ b/core/modules/layout_builder/layout_builder.services.yml
@@ -28,3 +28,7 @@ services:
     arguments: ['@current_route_match']
     tags:
       - { name: cache.context}
+  layout_builder.page_display_variant_subscriber:
+    class: Drupal\layout_builder\EventSubscriber\SectionDisplayVariantSubscriber
+    tags:
+      - { name: event_subscriber }
diff --git a/core/modules/layout_builder/src/EventSubscriber/SectionDisplayVariantSubscriber.php b/core/modules/layout_builder/src/EventSubscriber/SectionDisplayVariantSubscriber.php
new file mode 100644
index 0000000000..43508f70dd
--- /dev/null
+++ b/core/modules/layout_builder/src/EventSubscriber/SectionDisplayVariantSubscriber.php
@@ -0,0 +1,33 @@
+<?php
+
+namespace Drupal\layout_builder\EventSubscriber;
+
+use Drupal\Core\Render\PageDisplayVariantSelectionEvent;
+use Drupal\Core\Render\RenderEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Selects the section-based page display variant.
+ */
+class SectionDisplayVariantSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Selects the section-based page display variant.
+   *
+   * @param \Drupal\Core\Render\PageDisplayVariantSelectionEvent $event
+   *   The event to process.
+   */
+  public function onSelectPageDisplayVariant(PageDisplayVariantSelectionEvent $event) {
+    $event->setPluginId('layout_builder__section');
+    $event->stopPropagation();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[RenderEvents::SELECT_PAGE_DISPLAY_VARIANT][] = ['onSelectPageDisplayVariant', 100];
+    return $events;
+  }
+
+}
diff --git a/core/modules/layout_builder/src/Plugin/Derivative/LayoutBuilderLocalTaskDeriver.php b/core/modules/layout_builder/src/Plugin/Derivative/LayoutBuilderLocalTaskDeriver.php
index c2046c0fd4..a43ffe5c97 100644
--- a/core/modules/layout_builder/src/Plugin/Derivative/LayoutBuilderLocalTaskDeriver.php
+++ b/core/modules/layout_builder/src/Plugin/Derivative/LayoutBuilderLocalTaskDeriver.php
@@ -99,6 +99,22 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         'weight' => 5,
         'parent_id' => "layout_builder_ui:layout_builder.defaults.$entity_type_id.view",
       ];
+      $this->derivatives["layout_builder.theme.view"] = $base_plugin_definition + [
+        'route_name' => "layout_builder.theme.view",
+        'base_route' => "layout_builder.theme.view",
+        'title' => $this->t('Manage layout'),
+      ];
+      $this->derivatives["layout_builder.theme.save"] = $base_plugin_definition + [
+        'route_name' => "layout_builder.theme.save",
+        'title' => $this->t('Save Layout'),
+        'parent_id' => "layout_builder_ui:layout_builder.theme.view",
+      ];
+      $this->derivatives["layout_builder.theme.cancel"] = $base_plugin_definition + [
+        'route_name' => "layout_builder.theme.cancel",
+        'title' => $this->t('Cancel Layout'),
+        'weight' => 5,
+        'parent_id' => "layout_builder_ui:layout_builder.theme.view",
+      ];
     }
 
     return $this->derivatives;
diff --git a/core/modules/layout_builder/src/Plugin/DisplayVariant/SectionDisplayVariant.php b/core/modules/layout_builder/src/Plugin/DisplayVariant/SectionDisplayVariant.php
new file mode 100644
index 0000000000..7a43689053
--- /dev/null
+++ b/core/modules/layout_builder/src/Plugin/DisplayVariant/SectionDisplayVariant.php
@@ -0,0 +1,180 @@
+<?php
+
+namespace Drupal\layout_builder\Plugin\DisplayVariant;
+
+use Drupal\Core\Display\ContextAwareVariantInterface;
+use Drupal\Core\Display\PageVariantInterface;
+use Drupal\Core\Display\VariantBase;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Plugin\Context\Context;
+use Drupal\Core\Plugin\Context\ContextDefinition;
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Theme\ThemeManagerInterface;
+use Drupal\layout_builder\Section;
+use Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+
+/**
+ * Provides a section-based page display variant.
+ *
+ * @PageDisplayVariant(
+ *   id = "layout_builder__section",
+ *   admin_label = @Translation("Section-based")
+ * )
+ */
+class SectionDisplayVariant extends VariantBase implements PageVariantInterface, ContainerFactoryPluginInterface, ContextAwareVariantInterface {
+
+  /**
+   * The render array representing the main content.
+   *
+   * @var array
+   */
+  protected $mainContent = [];
+
+  /**
+   * An array of collected contexts.
+   *
+   * This is only used on runtime, and is not stored.
+   *
+   * @var \Drupal\Component\Plugin\Context\ContextInterface[]
+   */
+  protected $contexts = [];
+
+  /**
+   * The page title: a string (plain title) or a render array (formatted title).
+   *
+   * @var string|array
+   */
+  protected $title = '';
+
+  /**
+   * The theme manager.
+   *
+   * @var \Drupal\Core\Theme\ThemeManagerInterface
+   */
+  protected $themeManager;
+
+  /**
+   * The route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * The section storage manager.
+   *
+   * @var \Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface
+   */
+  protected $sectionStorageManager;
+
+  /**
+   * SectionDisplayVariant constructor.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin_id for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\layout_builder\SectionStorage\SectionStorageManagerInterface $section_storage_manager
+   *   The section storage manager.
+   * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
+   *   The theme manager.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The route match.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, SectionStorageManagerInterface $section_storage_manager, ThemeManagerInterface $theme_manager, RouteMatchInterface $route_match) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->sectionStorageManager = $section_storage_manager;
+    $this->themeManager = $theme_manager;
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('plugin.manager.layout_builder.section_storage'),
+      $container->get('theme.manager'),
+      $container->get('current_route_match')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setMainContent(array $main_content) {
+    $this->mainContent = $main_content;
+    $this->contexts['main_content'] = new Context(new ContextDefinition('string', 'Main Content'), $main_content);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTitle($title) {
+    $this->title = $title;
+    $this->contexts['title'] = new Context(new ContextDefinition('string', 'Title'), $title);
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    if ($this->routeMatch->getRouteName() !== 'layout_builder.theme.view') {
+      $section_storage = $this->sectionStorageManager->loadFromRoute('theme', $this->themeManager->getActiveTheme()->getName(), [], '', []);
+      if ($sections = $section_storage->getSections()) {
+        $contexts = $this->getContexts();
+        $build['content']['sections'] = array_map(function (Section $section) use ($contexts) {
+          return $section->toRenderArray($contexts);
+        }, $sections);
+        return $build;
+      }
+    }
+
+    return [
+      'content' => [
+        'messages' => [
+          '#type' => 'status_messages',
+          '#weight' => -1000,
+        ],
+        'page_title' => [
+          '#type' => 'page_title',
+          '#title' => $this->title,
+          '#weight' => -900,
+        ],
+        'main_content' => ['#weight' => -800] + $this->mainContent,
+      ],
+    ];
+  }
+
+  /**
+   * Gets the contexts.
+   *
+   * @return \Drupal\Component\Plugin\Context\ContextInterface[]
+   *   An array of set contexts, keyed by context name.
+   */
+  public function getContexts() {
+    return $this->contexts;
+  }
+
+  /**
+   * Sets the contexts.
+   *
+   * @param \Drupal\Component\Plugin\Context\ContextInterface[] $contexts
+   *   An array of contexts, keyed by context name.
+   *
+   * @return $this
+   */
+  public function setContexts(array $contexts) {
+    $this->contexts += $contexts;
+    return $this;
+  }
+
+}
diff --git a/core/modules/layout_builder/src/Plugin/SectionStorage/ThemeSectionStorage.php b/core/modules/layout_builder/src/Plugin/SectionStorage/ThemeSectionStorage.php
new file mode 100644
index 0000000000..c5a2159263
--- /dev/null
+++ b/core/modules/layout_builder/src/Plugin/SectionStorage/ThemeSectionStorage.php
@@ -0,0 +1,192 @@
+<?php
+
+namespace Drupal\layout_builder\Plugin\SectionStorage;
+
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Extension\ThemeHandlerInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Drupal\Core\Plugin\PluginBase;
+use Drupal\Core\Url;
+use Drupal\layout_builder\Routing\LayoutBuilderRoutesTrait;
+use Drupal\layout_builder\Section;
+use Drupal\layout_builder\SectionComponent;
+use Drupal\layout_builder\SectionListInterface;
+use Drupal\layout_builder\SectionStorage\SectionStorageTrait;
+use Drupal\layout_builder\SectionStorageInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\Routing\RouteCollection;
+
+/**
+ * Stores sections for the whole page.
+ *
+ * @SectionStorage(
+ *   id = "theme",
+ * )
+ */
+class ThemeSectionStorage extends PluginBase implements SectionStorageInterface, ContainerFactoryPluginInterface {
+
+  use LayoutBuilderRoutesTrait;
+  use SectionStorageTrait;
+
+  /**
+   * The theme name.
+   *
+   * @var string
+   */
+  protected $themeName;
+
+  /**
+   * The sections for this theme.
+   *
+   * @var \Drupal\layout_builder\Section[]
+   */
+  protected $sections;
+
+  /**
+   * The theme handler.
+   *
+   * @var \Drupal\Core\Extension\ThemeHandlerInterface
+   */
+  protected $themeHandler;
+
+  /**
+   * The config factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ThemeHandlerInterface $theme_handler, ConfigFactoryInterface $config_factory) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->themeHandler = $theme_handler;
+    $this->configFactory = $config_factory;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('theme_handler'),
+      $container->get('config.factory')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getSections() {
+    return $this->sections;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setSections(array $sections) {
+    $this->sections = $sections;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContexts() {
+    return [];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getStorageId() {
+    return $this->themeName;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getStorageType() {
+    return 'theme';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function label() {
+    return $this->themeHandler->getName($this->themeName);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function save() {
+    $sections = array_map(function (Section $section) {
+      return $section->toArray();
+    }, $this->getSections());
+
+    $this->configFactory->getEditable("layout_builder.theme.{$this->themeName}")
+      ->set('sections', $sections)
+      ->save();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCanonicalUrl() {
+    // Themes do not have a canonical URL, go to the Layout Builder UI.
+    return $this->getLayoutBuilderUrl();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getLayoutBuilderUrl() {
+    return Url::fromRoute('layout_builder.theme.view', ['theme_name' => $this->themeName]);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setSectionList(SectionListInterface $section_list) {
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alterRoutes(RouteCollection $collection) {
+    $this->buildRoute($collection, $this->getPluginDefinition(), '/page-layout/{theme_name}');
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function convert($value, $definition, $name, array $defaults) {
+    if (!$value && isset($defaults['theme_name'])) {
+      $value = $defaults['theme_name'];
+    }
+
+    if ($value) {
+      $sections = $this->configFactory->get("layout_builder.theme.$value")->get('sections') ?: [];
+      foreach ($sections as $section_delta => $section) {
+        $sections[$section_delta] = new Section(
+          $section['layout_id'],
+          $section['layout_settings'],
+          array_map(function (array $component) {
+            return (new SectionComponent($component['uuid'], $component['region'], $component['configuration'], $component['additional']))->setWeight($component['weight']);
+          }, $section['components'])
+        );
+      }
+
+      $this->themeName = $value;
+      $this->sections = $sections;
+      return $this;
+    }
+  }
+
+}
diff --git a/core/modules/layout_builder/src/SectionComponent.php b/core/modules/layout_builder/src/SectionComponent.php
index 7af03af132..4f2e45e9ca 100644
--- a/core/modules/layout_builder/src/SectionComponent.php
+++ b/core/modules/layout_builder/src/SectionComponent.php
@@ -6,6 +6,7 @@
 use Drupal\Core\Block\BlockPluginInterface;
 use Drupal\Core\Cache\CacheableMetadata;
 use Drupal\Core\Plugin\ContextAwarePluginInterface;
+use Drupal\Core\Render\Element;
 
 /**
  * Provides a value object for a section component.
@@ -109,15 +110,26 @@ public function toRenderArray(array $contexts = [], $in_preview = FALSE) {
       if ($in_preview || $access->isAllowed()) {
         $cacheability->addCacheableDependency($plugin);
         // @todo Move this to BlockBase in https://www.drupal.org/node/2931040.
-        $output = [
-          '#theme' => 'block',
-          '#configuration' => $plugin->getConfiguration(),
-          '#plugin_id' => $plugin->getPluginId(),
-          '#base_plugin_id' => $plugin->getBaseId(),
-          '#derivative_plugin_id' => $plugin->getDerivativeId(),
-          '#weight' => $this->getWeight(),
-          'content' => $plugin->build(),
-        ];
+        $content = $plugin->build();
+        if ($content !== NULL && !Element::isEmpty($content)) {
+          $output = [
+            '#theme' => 'block',
+            '#configuration' => $plugin->getConfiguration(),
+            '#plugin_id' => $plugin->getPluginId(),
+            '#base_plugin_id' => $plugin->getBaseId(),
+            '#derivative_plugin_id' => $plugin->getDerivativeId(),
+            '#weight' => $this->getWeight(),
+            'content' => $content,
+          ];
+        }
+        else {
+          $output = [
+            '#markup' => '',
+          ];
+          if (!empty($content)) {
+            $cacheability->merge(CacheableMetadata::createFromRenderArray($content));
+          }
+        }
       }
       $cacheability->applyTo($output);
     }
diff --git a/core/modules/layout_discovery/layout_discovery.layouts.yml b/core/modules/layout_discovery/layout_discovery.layouts.yml
index 755a96b5f7..feb93e9476 100644
--- a/core/modules/layout_discovery/layout_discovery.layouts.yml
+++ b/core/modules/layout_discovery/layout_discovery.layouts.yml
@@ -106,3 +106,19 @@ layout_threecol_33_34_33:
       label: Third
     bottom:
       label: Bottom
+
+layout_fourcol:
+  label: 'Four column'
+  category: 'Columns: 4'
+  default_region: first
+  icon_map:
+    - [first, second, third, fourth]
+  regions:
+    first:
+      label: First
+    second:
+      label: Second
+    third:
+      label: Third
+    fourth:
+      label: Fourth
diff --git a/core/modules/system/src/Plugin/Block/SystemMainBlock.php b/core/modules/system/src/Plugin/Block/SystemMainBlock.php
index 92f4430812..19e0e38c0f 100644
--- a/core/modules/system/src/Plugin/Block/SystemMainBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemMainBlock.php
@@ -14,6 +14,9 @@
  *   forms = {
  *     "settings_tray" = FALSE,
  *   },
+ *   context = {
+ *     "main_content" = @ContextDefinition("string", required = FALSE)
+ *   },
  * )
  */
 class SystemMainBlock extends BlockBase implements MainContentBlockPluginInterface {
@@ -36,7 +39,7 @@ public function setMainContent(array $main_content) {
    * {@inheritdoc}
    */
   public function build() {
-    return $this->mainContent;
+    return $this->getContextValue('main_content') ?: $this->mainContent;
   }
 
 }
