diff --git a/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php b/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php
index 983eec8..a7b8142 100644
--- a/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php
+++ b/core/lib/Drupal/Core/Entity/Controller/EntityViewController.php
@@ -63,11 +63,10 @@ public static function create(ContainerInterface $container) {
   public function buildTitle(array $page) {
     $entity_type = $page['#entity_type'];
     $entity = $page['#' . $entity_type];
-    // If the entity's label is rendered using a field formatter, set the
-    // rendered title field formatter as the page title instead of the default
-    // plain text title. This allows attributes set on the field to propagate
-    // correctly (e.g. RDFa, in-place editing).
-    if ($entity instanceof FieldableEntityInterface) {
+    // If enabled, set the rendered title field formatter as the page title
+    // instead of the default plain text title. This allows attributes set on
+    // the field to propagate correctly (e.g. RDFa, in-place editing).
+    if ($page['#page_title']) {
       $label_field = $entity->getEntityType()->getKey('label');
       if (isset($page[$label_field])) {
         $page['#title'] = $this->renderer->render($page[$label_field]);
@@ -99,6 +98,10 @@ public function view(EntityInterface $_entity, $view_mode = 'full') {
     $page['#entity_type'] = $_entity->getEntityTypeId();
     $page['#' . $page['#entity_type']] = $_entity;
 
+    // By default use the label field for the page title. Modules can hook to
+    // change the behavior by unsetting the field.
+    $page['#page_title'] = ($_entity instanceof FieldableEntityInterface) && ($_entity->getEntityType()->getKey('label'));
+
     return $page;
   }
 
diff --git a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
index 7c7d62e..0915f8d 100644
--- a/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
+++ b/core/lib/Drupal/Core/Entity/Entity/EntityViewDisplay.php
@@ -63,6 +63,9 @@ class EntityViewDisplay extends EntityDisplayBase implements EntityViewDisplayIn
    *   The entities being rendered. They should all be of the same entity type.
    * @param string $view_mode
    *   The view mode being rendered.
+   * @param boolean $page_title
+   *   If true, adjust the label field display object for building the page
+   *   title.
    *
    * @return \Drupal\Core\Entity\Display\EntityViewDisplayInterface[]
    *   The display objects to use to render the entities, keyed by entity
@@ -71,7 +74,7 @@ class EntityViewDisplay extends EntityDisplayBase implements EntityViewDisplayIn
    * @see entity_get_display()
    * @see hook_entity_view_display_alter()
    */
-  public static function collectRenderDisplays($entities, $view_mode) {
+  public static function collectRenderDisplays($entities, $view_mode, $page_title = FALSE) {
     if (empty($entities)) {
       return [];
     }
@@ -129,6 +132,18 @@ public static function collectRenderDisplays($entities, $view_mode) {
         ]);
       }
 
+      if ($page_title) {
+        // The page title ignores the configured display settings.  It must
+        // shown even if the field would normally be hidden, and it must be
+        // inline markup for display inside a header tag.
+        $label_field = $entity->getEntityType()->getKey('label');
+        $options = [
+          'label' => 'hidden',
+          'type' => 'basic_string',
+        ];
+        $display->setComponent($label_field, $options);
+      }
+
       // Let the display know which view mode was originally requested.
       $display->originalMode = $view_mode;
 
@@ -137,6 +152,7 @@ public static function collectRenderDisplays($entities, $view_mode) {
         'entity_type' => $entity_type,
         'bundle' => $bundle,
         'view_mode' => $view_mode,
+        'page_title' => $page_title
       ];
       \Drupal::moduleHandler()->alter('entity_view_display', $display, $display_context);
 
diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index faeb147..757877e 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -245,11 +245,18 @@ public function buildMultiple(array $build_list) {
     $entity_type_key = "#{$this->entityTypeId}";
     $view_hook = "{$this->entityTypeId}_view";
 
+    // Alter the displays if the label field will be used for building the
+    // page title. This is indicated by the #title_page setting on the build
+    // array. This flag is only valid and meaningful when there is a single
+    // entity.
+    $page_title = FALSE;
+
     // Find the keys for the ContentEntities in the build; Store entities for
     // rendering by view_mode.
     $children = Element::children($build_list);
     foreach ($children as $key) {
       if (isset($build_list[$key][$entity_type_key])) {
+        if (isset($build_list[$key]['#page_title'])) $page_title = TRUE;
         $entity = $build_list[$key][$entity_type_key];
         if ($entity instanceof FieldableEntityInterface) {
           $view_modes[$build_list[$key]['#view_mode']][$key] = $entity;
@@ -259,7 +266,7 @@ public function buildMultiple(array $build_list) {
 
     // Build content for the displays represented by the entities.
     foreach ($view_modes as $view_mode => $view_mode_entities) {
-      $displays = EntityViewDisplay::collectRenderDisplays($view_mode_entities, $view_mode);
+      $displays = EntityViewDisplay::collectRenderDisplays($view_mode_entities, $view_mode, $page_title);
       $this->buildComponents($build_list, $view_mode_entities, $displays, $view_mode);
       foreach (array_keys($view_mode_entities) as $key) {
         // Allow for alterations while building, before rendering.
diff --git a/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php b/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php
index 47bcf28..1b4f6f3 100644
--- a/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php
+++ b/core/modules/media/tests/src/FunctionalJavascript/MediaDisplayTest.php
@@ -49,19 +49,21 @@ public function testMediaDisplay() {
     $media->save();
 
     $this->drupalGet('media/' . $media->id());
-    // Verify the "name" field is really not present.
-    $assert_session->elementNotExists('css', '.field--name-name');
+    // Verify the "name" field is really not present inside the entity output
+    // and is present in the title.
+    $assert_session->elementNotExists('css', 'article.media .field--name-name');
+    $assert_session->elementExists('css', '.page-title .field--name-name');
 
-    // Enable the field on the display and verify it becomes visible on the UI.
+    // Enable the field on the display and check again.
     $this->drupalGet("/admin/structure/media/manage/{$media_type->id()}/display");
     $page->selectFieldOption('fields[name][region]', 'content');
     $assert_session->waitForElementVisible('css', '#edit-fields-name-settings-edit');
     $page->pressButton('Save');
     $this->drupalGet('media/' . $media->id());
-    // Verify the name is present, and its text matches what is expected.
-    $assert_session->elementExists('css', '.field--name-name');
-    $name_field = $page->find('css', '.field--name-name .field__item');
-    $this->assertEquals($media->label(), $name_field->getText());
+    // The display settings should have no effect when the "name" field is in
+    // the title block.
+    $assert_session->elementNotExists('css', 'article.media .field--name-name');
+    $assert_session->elementExists('css', '.page-title .field--name-name');
 
     // In the standard profile, there are some pre-cooked types. Make sure the
     // elements configured on their displays are the expected ones.
