 core/includes/theme.inc                            |  1 -
 .../Core/Block/MainContentBlockPluginInterface.php |  2 +-
 .../Core/Block/TitleBlockPluginInterface.php       | 27 ++++++++
 .../Drupal/Core/Display/PageVariantInterface.php   | 10 +++
 core/lib/Drupal/Core/Extension/ThemeHandler.php    |  1 +
 .../Core/Render/MainContent/HtmlRenderer.php       | 14 ++--
 .../Plugin/DisplayVariant/SimplePageVariant.php    | 17 +++++
 .../src/Plugin/DisplayVariant/BlockPageVariant.php | 31 ++++++++-
 .../src/Tests/PageCacheTagsIntegrationTest.php     |  2 +
 .../src/Plugin/Block/SystemPageTitleBlock.php      | 79 ++++++++++++++++++++++
 core/modules/system/system.module                  | 11 +++
 .../block--system-page-title-block.html.twig       | 23 +++++++
 core/modules/system/templates/page.html.twig       |  8 +--
 .../install/block.block.bartik_page_title.yml      | 18 +++++
 .../install/block.block.seven_page_title.yml       | 18 +++++
 core/themes/bartik/bartik.info.yml                 |  1 +
 core/themes/bartik/bartik.theme                    | 17 -----
 .../block--system-page-title-block.html.twig       | 23 +++++++
 core/themes/bartik/templates/page.html.twig        |  9 +--
 core/themes/classy/templates/layout/page.html.twig |  6 +-
 core/themes/seven/seven.info.yml                   |  1 +
 core/themes/seven/templates/page.html.twig         |  6 +-
 22 files changed, 282 insertions(+), 43 deletions(-)

diff --git a/core/includes/theme.inc b/core/includes/theme.inc
index 62bbb58..be5a6f2 100644
--- a/core/includes/theme.inc
+++ b/core/includes/theme.inc
@@ -1346,7 +1346,6 @@ function template_preprocess_page(&$variables) {
   $site_config = \Drupal::config('system.site');
 
   // Move some variables to the top level for themer convenience and template cleanliness.
-  $variables['title'] = $variables['page']['#title'];
 
   foreach (system_region_list(\Drupal::theme()->getActiveTheme()->getName()) as $region_key => $region_name) {
     if (!isset($variables['page'][$region_key])) {
diff --git a/core/lib/Drupal/Core/Block/MainContentBlockPluginInterface.php b/core/lib/Drupal/Core/Block/MainContentBlockPluginInterface.php
index 2516348..38da7b3 100644
--- a/core/lib/Drupal/Core/Block/MainContentBlockPluginInterface.php
+++ b/core/lib/Drupal/Core/Block/MainContentBlockPluginInterface.php
@@ -10,7 +10,7 @@
 /**
  * The interface for "main page content" blocks.
  *
- * A main page content block represents the content returns by the controller.
+ * A main page content block represents the content returned by the controller.
  *
  * @ingroup block_api
  */
diff --git a/core/lib/Drupal/Core/Block/TitleBlockPluginInterface.php b/core/lib/Drupal/Core/Block/TitleBlockPluginInterface.php
new file mode 100644
index 0000000..f4deff0
--- /dev/null
+++ b/core/lib/Drupal/Core/Block/TitleBlockPluginInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Block\TitleBlockPluginInterface.
+ */
+
+namespace Drupal\Core\Block;
+
+/**
+ * The interface for "title" blocks.
+ *
+ * A title block shows the title returned by the controller.
+ *
+ * @ingroup block_api
+ */
+interface TitleBlockPluginInterface extends BlockPluginInterface {
+
+  /**
+   * Sets the title.
+   *
+   * @param string $title
+   *   The page title.
+   */
+  public function setTitle($title);
+
+}
diff --git a/core/lib/Drupal/Core/Display/PageVariantInterface.php b/core/lib/Drupal/Core/Display/PageVariantInterface.php
index 4c50c0a..7499898 100644
--- a/core/lib/Drupal/Core/Display/PageVariantInterface.php
+++ b/core/lib/Drupal/Core/Display/PageVariantInterface.php
@@ -36,4 +36,14 @@
    */
   public function setMainContent(array $main_content);
 
+  /**
+   * Sets the title for the page being rendered.
+   *
+   * @param string $title
+   *   The page title.
+   *
+   * @return $this
+   */
+  public function setTitle($title);
+
 }
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index 57a317e..f0bd790 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -457,6 +457,7 @@ public function rebuildThemeData() {
         'page_top' => 'Page top',
         'page_bottom' => 'Page bottom',
         'breadcrumb' => 'Breadcrumb',
+        'page_title' => 'Page title',
       ),
       'description' => '',
       'features' => $this->defaultFeatures,
diff --git a/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php b/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php
index 70846dd..0af2acd 100644
--- a/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php
+++ b/core/lib/Drupal/Core/Render/MainContent/HtmlRenderer.php
@@ -204,11 +204,18 @@ public function renderResponse(array $main_content, Request $request, RouteMatch
    *   If the selected display variant does not implement PageVariantInterface.
    */
   protected function prepare(array $main_content, Request $request, RouteMatchInterface $route_match) {
+    // Determine the title: use the title provided by the main content if any,
+    // otherwise get it from the routing information.
+    $get_title = function (array $main_content) use ($request, $route_match) {
+      return isset($main_content['#title']) ? $main_content['#title'] : $this->titleResolver->getTitle($request, $route_match->getRouteObject());
+    };
+
     // If the _controller result already is #type => page,
     // we have no work to do: The "main content" already is an entire "page"
     // (see html.html.twig).
     if (isset($main_content['#type']) && $main_content['#type'] === 'page') {
       $page = $main_content;
+      $title = $get_title($page);
     }
     // Otherwise, render it as the main content of a #type => page, by selecting
     // page display variant to do that and building that page display variant.
@@ -232,12 +239,15 @@ protected function prepare(array $main_content, Request $request, RouteMatchInte
         ];
       }
 
+      $title = $get_title($main_content);
+
       // Instantiate the page display, and give it the main content.
       $page_display = $this->displayVariantManager->createInstance($variant_id);
       if (!$page_display instanceof PageVariantInterface) {
         throw new \LogicException('Cannot render the main content for this page because the provided display variant does not implement PageVariantInterface.');
       }
       $page_display->setMainContent($main_content);
+      $page_display->setTitle($title);
 
       // Generate a #type => page render array using the page display variant,
       // the page display will build the content for the various page regions.
@@ -260,10 +270,6 @@ protected function prepare(array $main_content, Request $request, RouteMatchInte
     // Allow hooks to add attachments to $page['#attached'].
     $this->invokePageAttachmentHooks($page);
 
-    // Determine the title: use the title provided by the main content if any,
-    // otherwise get it from the routing information.
-    $title = isset($main_content['#title']) ? $main_content['#title'] : $this->titleResolver->getTitle($request, $route_match->getRouteObject());
-
     return [$page, $title];
   }
 
diff --git a/core/lib/Drupal/Core/Render/Plugin/DisplayVariant/SimplePageVariant.php b/core/lib/Drupal/Core/Render/Plugin/DisplayVariant/SimplePageVariant.php
index 66f9086..0f0fd64 100644
--- a/core/lib/Drupal/Core/Render/Plugin/DisplayVariant/SimplePageVariant.php
+++ b/core/lib/Drupal/Core/Render/Plugin/DisplayVariant/SimplePageVariant.php
@@ -28,10 +28,26 @@ class SimplePageVariant extends VariantBase implements PageVariantInterface {
   protected $mainContent;
 
   /**
+   * The page title.
+   *
+   * @var string
+   */
+  protected $title = '';
+
+  /**
    * {@inheritdoc}
    */
   public function setMainContent(array $main_content) {
     $this->mainContent = $main_content;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTitle($title) {
+    $this->title = $title;
+    return $this;
   }
 
   /**
@@ -39,6 +55,7 @@ public function setMainContent(array $main_content) {
    */
   public function build() {
     $build = [
+      'title' => ['#markup' => '<h1>' . $this->title . '</h1>'],
       'content' => [
         'main_content' => $this->mainContent,
         'messages' => [
diff --git a/core/modules/block/src/Plugin/DisplayVariant/BlockPageVariant.php b/core/modules/block/src/Plugin/DisplayVariant/BlockPageVariant.php
index 7b67093..1ffa5f0 100644
--- a/core/modules/block/src/Plugin/DisplayVariant/BlockPageVariant.php
+++ b/core/modules/block/src/Plugin/DisplayVariant/BlockPageVariant.php
@@ -11,6 +11,7 @@
 use Drupal\block\Event\BlockContextEvent;
 use Drupal\block\Event\BlockEvents;
 use Drupal\Core\Block\MainContentBlockPluginInterface;
+use Drupal\Core\Block\TitleBlockPluginInterface;
 use Drupal\Core\Block\MessagesBlockPluginInterface;
 use Drupal\Core\Display\PageVariantInterface;
 use Drupal\Core\Entity\EntityTypeInterface;
@@ -67,6 +68,13 @@ class BlockPageVariant extends VariantBase implements PageVariantInterface, Cont
   protected $mainContent = [];
 
   /**
+   * The page title.
+   *
+   * @var string
+   */
+  protected $title = '';
+
+  /**
    * Constructs a new BlockPageVariant.
    *
    * @param array $configuration
@@ -118,9 +126,19 @@ public function setMainContent(array $main_content) {
   /**
    * {@inheritdoc}
    */
+  public function setTitle($title) {
+    $this->title = $title;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function build() {
-    // Track whether blocks showing the main content and messages are displayed.
+    // Track whether blocks showing the main content, title and messages are
+    // displayed.
     $main_content_block_displayed = FALSE;
+    $title_block_displayed = FALSE;
     $messages_block_displayed = FALSE;
 
     $build = [
@@ -138,6 +156,10 @@ public function build() {
           $block_plugin->setMainContent($this->mainContent);
           $main_content_block_displayed = TRUE;
         }
+        elseif ($block_plugin instanceof TitleBlockPluginInterface) {
+          $block_plugin->setTitle($this->title);
+          $title_block_displayed = TRUE;
+        }
         elseif ($block_plugin instanceof MessagesBlockPluginInterface) {
           $messages_block_displayed = TRUE;
         }
@@ -172,6 +194,13 @@ public function build() {
       ];
     }
 
+    // Analogously for the page title.
+    if (!$title_block_displayed) {
+      $build['title'] = [
+        '#markup' => $this->title,
+      ];
+    }
+
     return $build;
   }
 
diff --git a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
index c6af0ac..ee610eb 100644
--- a/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
+++ b/core/modules/page_cache/src/Tests/PageCacheTagsIntegrationTest.php
@@ -95,6 +95,7 @@ function testPageCacheTags() {
       'config:block.block.bartik_main_menu',
       'config:block.block.bartik_account_menu',
       'config:block.block.bartik_messages',
+      'config:block.block.bartik_page_title',
       'node_view',
       'node:' . $node_1->id(),
       'user:' . $author_1->id(),
@@ -127,6 +128,7 @@ function testPageCacheTags() {
       'config:block.block.bartik_main_menu',
       'config:block.block.bartik_account_menu',
       'config:block.block.bartik_messages',
+      'config:block.block.bartik_page_title',
       'node_view',
       'node:' . $node_2->id(),
       'user:' . $author_2->id(),
diff --git a/core/modules/system/src/Plugin/Block/SystemPageTitleBlock.php b/core/modules/system/src/Plugin/Block/SystemPageTitleBlock.php
new file mode 100644
index 0000000..e23785a
--- /dev/null
+++ b/core/modules/system/src/Plugin/Block/SystemPageTitleBlock.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Plugin\Block\SystemPageTitleBlock.
+ */
+
+namespace Drupal\system\Plugin\Block;
+
+use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Block\TitleBlockPluginInterface;
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Provides a block to display the page title.
+ *
+ * @Block(
+ *   id = "system_page_title_block",
+ *   admin_label = @Translation("Page title")
+ * )
+ */
+class SystemPageTitleBlock extends BlockBase implements TitleBlockPluginInterface {
+
+  /**
+   * The page title.
+   *
+   * @var string
+   */
+  protected $title = '';
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setTitle($title) {
+    $this->title = $title;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return ['label_display' => FALSE];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    return [
+      'title' => [
+        '#markup' => $this->title,
+      ],
+    ];
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
+    $form = parent::buildConfigurationForm($form, $form_state);
+
+    // The 'Page title' block is never cacheable, because it may be dynamic.
+    $form['cache']['#disabled'] = TRUE;
+    $form['cache']['#description'] = t('This block is never cacheable, it is not configurable.');
+    $form['cache']['max_age']['#value'] = 0;
+
+    return $form;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isCacheable() {
+    // The 'Page title' block is never cacheable, because it may be dynamic.
+    return FALSE;
+  }
+
+}
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 0575b1a..d2e9d0c 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -166,6 +166,10 @@ function system_theme() {
       'render element' => 'elements',
       'base hook' => 'block',
     ),
+    'block__system_page_title_block' => array(
+      'base hook' => 'block',
+      'template' => 'block--system-page-title-block',
+    ),
     'block__system_messages_block' => array(
       'base hook' => 'block',
     ),
@@ -781,6 +785,13 @@ function system_preprocess_block(&$variables) {
     case 'system_powered_by_block':
       $variables['attributes']['role'] = 'complementary';
       break;
+
+    case 'system_page_title_block':
+      $variables['title'] = '';
+      if($variables['content']['title']['#markup']) {
+        $variables['title'] = $variables['content']['title']['#markup'];
+      }
+      break;
   }
 }
 
diff --git a/core/modules/system/templates/block--system-page-title-block.html.twig b/core/modules/system/templates/block--system-page-title-block.html.twig
new file mode 100644
index 0000000..aca427c
--- /dev/null
+++ b/core/modules/system/templates/block--system-page-title-block.html.twig
@@ -0,0 +1,23 @@
+{% extends "@block/block.html.twig" %}
+{#
+/**
+ * @file
+ * Default theme implementation for a page title.
+ *
+ * Available variables:
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title: The page title, for use in the actual content.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @ingroup themeable
+ */
+#}
+{% block content %}
+  {{ title_prefix }}
+  {% if title %}
+    <h1>{{ title }}</h1>
+  {% endif %}
+  {{ title_suffix }}
+{% endblock %}
diff --git a/core/modules/system/templates/page.html.twig b/core/modules/system/templates/page.html.twig
index eb5c7bf..4ff0282 100644
--- a/core/modules/system/templates/page.html.twig
+++ b/core/modules/system/templates/page.html.twig
@@ -28,7 +28,6 @@
  * Page content (in order of occurrence in the default page.html.twig):
  * - title_prefix: Additional output populated by modules, intended to be
  *   displayed in front of the main title tag that appears in the template.
- * - title: The page title, for use in the actual content.
  * - title_suffix: Additional output populated by modules, intended to be
  *   displayed after the main title tag that appears in the template.
  * - messages: Status and error messages. Should be displayed prominently.
@@ -53,6 +52,7 @@
  * - page.sidebar_second: Items for the second sidebar.
  * - page.footer: Items for the footer region.
  * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.title: Items for the page title region.
  *
  * @see template_preprocess_page()
  * @see html.html.twig
@@ -73,7 +73,7 @@
       <div class="name-and-slogan">
 
         {# Use h1 when the content title is empty #}
-        {% if title %}
+        {% if page.title %}
           <strong class="site-name">
             <a href="{{ front_page }}" title="{{ 'Home'|t }}" rel="home">{{ site_name }}</a>
           </strong>
@@ -108,9 +108,7 @@
       {{ page.highlighted }}
 
       {{ title_prefix }}
-      {% if title %}
-        <h1>{{ title }}</h1>
-      {% endif %}
+      {{ page.title }}
       {{ title_suffix }}
 
       {{ tabs }}
diff --git a/core/profiles/standard/config/install/block.block.bartik_page_title.yml b/core/profiles/standard/config/install/block.block.bartik_page_title.yml
new file mode 100644
index 0000000..ff73d59
--- /dev/null
+++ b/core/profiles/standard/config/install/block.block.bartik_page_title.yml
@@ -0,0 +1,18 @@
+id: bartik_page_title
+theme: bartik
+weight: 10
+status: true
+langcode: en
+region: title
+plugin: system_page_title_block
+settings:
+  id: system_page_title_block
+  label: Page title
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - bartik
+visibility: {  }
diff --git a/core/profiles/standard/config/install/block.block.seven_page_title.yml b/core/profiles/standard/config/install/block.block.seven_page_title.yml
new file mode 100644
index 0000000..ae1cb30
--- /dev/null
+++ b/core/profiles/standard/config/install/block.block.seven_page_title.yml
@@ -0,0 +1,18 @@
+id: page_title
+theme: seven
+weight: 0
+status: true
+langcode: en
+region: title
+plugin: system_page_title_block
+settings:
+  id: system_page_title_block
+  label: Page Title
+  provider: system
+  label_display: '0'
+dependencies:
+  module:
+    - system
+  theme:
+    - seven
+visibility: {  }
diff --git a/core/themes/bartik/bartik.info.yml b/core/themes/bartik/bartik.info.yml
index 6f98537..bf1759f 100644
--- a/core/themes/bartik/bartik.info.yml
+++ b/core/themes/bartik/bartik.info.yml
@@ -24,6 +24,7 @@ regions:
   messages: Messages
   featured_top: 'Featured top'
   breadcrumb: Breadcrumb
+  title: Title
   content: Content
   sidebar_first: 'Sidebar first'
   sidebar_second: 'Sidebar second'
diff --git a/core/themes/bartik/bartik.theme b/core/themes/bartik/bartik.theme
index 1f69448..9576fce 100644
--- a/core/themes/bartik/bartik.theme
+++ b/core/themes/bartik/bartik.theme
@@ -43,23 +43,6 @@ function bartik_preprocess_html(&$variables) {
 function bartik_preprocess_page(&$variables) {
   // Set the options that apply to both page and maintenance page.
   _bartik_process_page($variables);
-
-  // Since the title and the shortcut link are both block level elements,
-  // positioning them next to each other is much simpler with a wrapper div.
-  if (!empty($variables['title_suffix']['add_or_remove_shortcut']) && $variables['title']) {
-    // Add a wrapper div using the title_prefix and title_suffix render
-    // elements.
-    $variables['title_prefix']['shortcut_wrapper'] = array(
-      '#markup' => '<div class="shortcut-wrapper clearfix">',
-      '#weight' => 100,
-    );
-    $variables['title_suffix']['shortcut_wrapper'] = array(
-      '#markup' => '</div>',
-      '#weight' => -99,
-    );
-    // Make sure the shortcut link is the first item in title_suffix.
-    $variables['title_suffix']['add_or_remove_shortcut']['#weight'] = -100;
-  }
 }
 
 /**
diff --git a/core/themes/bartik/templates/block--system-page-title-block.html.twig b/core/themes/bartik/templates/block--system-page-title-block.html.twig
new file mode 100644
index 0000000..d95521a
--- /dev/null
+++ b/core/themes/bartik/templates/block--system-page-title-block.html.twig
@@ -0,0 +1,23 @@
+{% extends "@block/block.html.twig" %}
+{#
+/**
+ * @file
+ * Bartik's theme implementation for a page title.
+ *
+ * Available variables:
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title: The page title, for use in the actual content.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @ingroup themeable
+ */
+#}
+{% block content %}
+  {% if title %}
+    <h1 class="title" id="page-title">
+      {{ title }}
+    </h1>
+  {% endif %}
+{% endblock %}
diff --git a/core/themes/bartik/templates/page.html.twig b/core/themes/bartik/templates/page.html.twig
index 60b2885..90a7d10 100644
--- a/core/themes/bartik/templates/page.html.twig
+++ b/core/themes/bartik/templates/page.html.twig
@@ -35,7 +35,6 @@
  * Page content (in order of occurrence in the default page.html.twig):
  * - title_prefix: Additional output populated by modules, intended to be
  *   displayed in front of the main title tag that appears in the template.
- * - title: The page title, for use in the actual content.
  * - title_suffix: Additional output populated by modules, intended to be
  *   displayed after the main title tag that appears in the template.
  * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
@@ -66,6 +65,7 @@
  * - page.footer_fourth: Items for the fourth footer column.
  * - page.footer_fifth: Items for the fifth footer column.
  * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.title: Items for the page title region.
  *
  * @see template_preprocess_page()
  * @see bartik_preprocess_page()
@@ -123,12 +123,7 @@
         <main id="content" class="column main-content" role="main">
           <section class="section">
             <a id="main-content" tabindex="-1"></a>
-            {{ title_prefix }}
-            {% if title %}
-              <h1 class="title" id="page-title">
-                {{ title }}
-              </h1>
-            {% endif %}
+            {{ page.title }}
             {{ title_suffix }}
             {% if tabs %}
               <nav class="tabs" role="navigation" aria-label="{{ 'Tabs'|t }}">
diff --git a/core/themes/classy/templates/layout/page.html.twig b/core/themes/classy/templates/layout/page.html.twig
index dcb8f4c..7c90fbb 100644
--- a/core/themes/classy/templates/layout/page.html.twig
+++ b/core/themes/classy/templates/layout/page.html.twig
@@ -28,7 +28,6 @@
  * Page content (in order of occurrence in the default page.html.twig):
  * - title_prefix: Additional output populated by modules, intended to be
  *   displayed in front of the main title tag that appears in the template.
- * - title: The page title, for use in the actual content.
  * - title_suffix: Additional output populated by modules, intended to be
  *   displayed after the main title tag that appears in the template.
  * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
@@ -52,6 +51,7 @@
  * - page.sidebar_second: Items for the second sidebar.
  * - page.footer: Items for the footer region.
  * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.title: Items for the page title region.
  *
  * @see template_preprocess_page()
  * @see html.html.twig
@@ -105,9 +105,7 @@
       {{ page.highlighted }}
 
       {{ title_prefix }}
-      {% if title %}
-        <h1>{{ title }}</h1>
-      {% endif %}
+      {{ page.title }}
       {{ title_suffix }}
 
       {{ tabs }}
diff --git a/core/themes/seven/seven.info.yml b/core/themes/seven/seven.info.yml
index 57bc632..e425d62 100644
--- a/core/themes/seven/seven.info.yml
+++ b/core/themes/seven/seven.info.yml
@@ -21,5 +21,6 @@ regions:
   page_bottom: 'Page bottom'
   sidebar_first: 'First sidebar'
   breadcrumb: Breadcrumb
+  title: Title
 regions_hidden:
   - sidebar_first
diff --git a/core/themes/seven/templates/page.html.twig b/core/themes/seven/templates/page.html.twig
index 4110987..b1ccb68 100644
--- a/core/themes/seven/templates/page.html.twig
+++ b/core/themes/seven/templates/page.html.twig
@@ -29,7 +29,6 @@
  * Page content (in order of occurrence in the default page.html.twig):
  * - title_prefix: Additional output populated by modules, intended to be
  *   displayed in front of the main title tag that appears in the template.
- * - title: The page title, for use in the actual content.
  * - title_suffix: Additional output populated by modules, intended to be
  *   displayed after the main title tag that appears in the template.
  * - tabs: Tabs linking to any sub-pages beneath the current page (e.g., the
@@ -51,6 +50,7 @@
  * - page.sidebar_second: Items for the second sidebar.
  * - page.page_bottom: Items for the footer region.
  * - page.breadcrumb: Items for the breadcrumb region.
+ * - page.title: Items for the page title region.
  *
  * @see template_preprocess_page()
  * @see seven_preprocess_page()
@@ -60,8 +60,8 @@
   <header class="content-header clearfix">
     <div class="layout-container">
       {{ title_prefix }}
-      {% if title %}
-        <h1 class="page-title">{{ title }}</h1>
+      {% if page.title %}
+        <h1 class="page-title">{{ page.title }}</h1>
       {% endif %}
       {{ title_suffix }}
       {% if primary_local_tasks %}
