diff --git a/core/modules/system/src/Plugin/Block/SystemTitleBlock.php b/core/modules/system/src/Plugin/Block/SystemTitleBlock.php
new file mode 100644
index 0000000..2a47f5b
--- /dev/null
+++ b/core/modules/system/src/Plugin/Block/SystemTitleBlock.php
@@ -0,0 +1,134 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Plugin\Block\SystemTitleBlock.
+ */
+
+namespace Drupal\system\Plugin\Block;
+
+use Drupal\block\BlockBase;
+use Drupal\Core\Config\ConfigFactoryInterface;
+use Drupal\Core\Controller\TitleResolverInterface;
+use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Provides a block to display the page title.
+ *
+ * @Block(
+ *   id = "system_title_block",
+ *   admin_label = @Translation("Page title")
+ * )
+ */
+class SystemTitleBlock extends BlockBase implements ContainerFactoryPluginInterface {
+
+  /**
+   * Stores the configuration factory.
+   *
+   * @var \Drupal\Core\Config\ConfigFactoryInterface
+   */
+  protected $configFactory;
+
+  /**
+   * The title resolver.
+   *
+   * @var \Drupal\Core\Controller\TitleResolverInterface
+   */
+  protected $titleResolver;
+
+  /**
+   * A request stack object.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Creates a SystemBrandingBlock instance.
+   *
+   * @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\Core\Config\ConfigFactoryInterface $config_factory
+   *   The factory for configuration objects.
+   * @param \Drupal\Core\Controller\TitleResolverInterface $titleResolver
+   *   The title resolver.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $requestStack
+   *   The request stack object.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ConfigFactoryInterface $config_factory, TitleResolverInterface $titleResolver, RequestStack $requestStack) {
+      parent::__construct($configuration, $plugin_id, $plugin_definition);
+    $this->configFactory = $config_factory;
+    $this->titleResolver = $titleResolver;
+    $this->requestStack = $requestStack;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('config.factory'),
+      $container->get('title_resolver'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function defaultConfiguration() {
+    return array(
+      'label_display' => FALSE,
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $build = array();
+    $title = '';
+    $request = $this->requestStack->getCurrentRequest();
+    if ($route = $request->attributes->get(\Symfony\Cmf\Component\Routing\RouteObjectInterface::ROUTE_OBJECT)) {
+      $title = $this->titleResolver->getTitle($request, $route);
+    }
+
+    $build['title'] = array(
+      '#markup' => $title,
+    );
+
+    return $build;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function buildConfigurationForm(array $form, array &$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 ac44ab5..e8c733f 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -160,13 +160,17 @@ function system_help($route_name, Request $request) {
 function system_theme() {
   return array_merge(drupal_common_theme(), array(
     // Normally theme suggestion templates are only picked up when they are in
-    // themes. We explicitly define the block__system_branding_block theme
-    // suggestion here so that the template in core/modules/system/templates
-    // is picked up.
+    // themes. We explicitly define the block__system_branding_block and
+    // block__system_title_block theme suggestions here so that the templates in
+    // core/modules/system/templates are picked up.
     'block__system_branding_block' => array(
       'base hook' => 'block',
       'template' => 'block--system-branding-block',
     ),
+    'block__system_title_block' => array(
+      'base hook' => 'block',
+      'template' => 'block--system-title-block',
+    ),
     'system_themes_page' => array(
       'variables' => array(
         'theme_groups' => array(),
@@ -1072,6 +1076,13 @@ function system_preprocess_block(&$variables) {
       }
       break;
 
+    case 'system_title_block':
+      $variables['title'] = '';
+      if($variables['content']['title']['#markup']) {
+        $variables['title'] = $variables['content']['title']['#markup'];
+      }
+      break;
+
     case 'system_powered_by_block':
       $variables['attributes']['role'] = 'complementary';
       break;
diff --git a/core/modules/system/templates/block--system-title-block.html.twig b/core/modules/system/templates/block--system-title-block.html.twig
new file mode 100644
index 0000000..8ec31ff
--- /dev/null
+++ b/core/modules/system/templates/block--system-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/themes/bartik/templates/block--system-title-block.html.twig b/core/themes/bartik/templates/block--system-title-block.html.twig
new file mode 100644
index 0000000..09abdcf
--- /dev/null
+++ b/core/themes/bartik/templates/block--system-title-block.html.twig
@@ -0,0 +1,25 @@
+{% 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 class="title" id="page-title">
+            {{ title }}
+        </h1>
+    {% endif %}
+    {{ title_suffix }}
+{% endblock %}
