diff --git a/core/lib/Drupal/Core/Controller/ControllerBase.php b/core/lib/Drupal/Core/Controller/ControllerBase.php
index 7eb368a..e08f88e 100644
--- a/core/lib/Drupal/Core/Controller/ControllerBase.php
+++ b/core/lib/Drupal/Core/Controller/ControllerBase.php
@@ -110,6 +110,11 @@
   protected $formBuilder;
 
   /**
+   * @var
+   */
+  protected $themeHandler;
+
+  /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandler.php b/core/lib/Drupal/Core/Extension/ThemeHandler.php
index 82ebad9..96990d2 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandler.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandler.php
@@ -443,6 +443,14 @@ protected function doGetBaseThemes(array $themes, $theme, $used_themes = array()
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getName($theme) {
+    $themes = $this->listInfo();
+    return String::checkPlain($themes[$theme]->info['name']);
+  }
+
+  /**
    * Returns a system listing info object.
    *
    * @return \Drupal\Core\SystemListingInfo
diff --git a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
index eef3381..7e1ddd4 100644
--- a/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
+++ b/core/lib/Drupal/Core/Extension/ThemeHandlerInterface.php
@@ -105,4 +105,15 @@ public function rebuildThemeData();
    */
   public function getBaseThemes(array $themes, $theme);
 
+  /**
+   * Gets the human readable name of a given theme.
+   *
+   * @param string $theme
+   *   The machine name of the theme which title should be shown.
+   *
+   * @return string
+   *   Returns the human readable name of the theme.
+   */
+  public function getName($theme);
+
 }
diff --git a/core/modules/action/action.routing.yml b/core/modules/action/action.routing.yml
index 09e1433..535830a 100644
--- a/core/modules/action/action.routing.yml
+++ b/core/modules/action/action.routing.yml
@@ -10,6 +10,7 @@ action.admin_add:
   path: '/admin/config/system/actions/add/{action_id}'
   defaults:
     _entity_form: 'action.add'
+    _title: 'Add'
   requirements:
     _permission: 'administer actions'
 
@@ -17,6 +18,7 @@ action.admin_configure:
   path: '/admin/config/system/actions/configure/{action}'
   defaults:
     _entity_form: 'action.edit'
+    _title: 'Edit'
   requirements:
     _permission: 'administer actions'
 
@@ -24,6 +26,7 @@ action.delete:
   path: '/admin/config/system/actions/configure/{action}/delete'
   defaults:
     _entity_form: 'action.delete'
+    _title: 'Delete'
   requirements:
     _permission: 'administer actions'
 
diff --git a/core/modules/block/block.routing.yml b/core/modules/block/block.routing.yml
index f4729cf..bd7b5d3 100644
--- a/core/modules/block/block.routing.yml
+++ b/core/modules/block/block.routing.yml
@@ -2,6 +2,7 @@ block.admin_demo:
   path: '/admin/structure/block/demo/{theme}'
   defaults:
     _content: '\Drupal\block\Controller\BlockController::demo'
+    _title_callback: 'theme_handler:getName'
   requirements:
     _access_theme: 'TRUE'
     _permission: 'administer blocks'
@@ -18,6 +19,7 @@ block.admin_edit:
   path: '/admin/structure/block/manage/{block}'
   defaults:
     _entity_form: 'block.default'
+    _title: 'Configure block'
   requirements:
     _entity_access: 'block.update'
 
@@ -33,7 +35,7 @@ block.admin_display_theme:
   path: 'admin/structure/block/list/{theme}'
   defaults:
     _content: '\Drupal\block\Controller\BlockListController::listing'
-    _title: 'Block layout'
+    _title_callback: 'theme_handler:getName'
   requirements:
     _access_theme: 'TRUE'
     _permission: 'administer blocks'
diff --git a/core/modules/block/custom_block/custom_block.routing.yml b/core/modules/block/custom_block/custom_block.routing.yml
index 622d08d..ba5b9ea 100644
--- a/core/modules/block/custom_block/custom_block.routing.yml
+++ b/core/modules/block/custom_block/custom_block.routing.yml
@@ -33,6 +33,7 @@ custom_block.edit:
   path: '/block/{custom_block}'
   defaults:
     _entity_form: 'custom_block.edit'
+    _title: 'Edit'
   requirements:
     _entity_access: 'custom_block.update'
 
@@ -40,6 +41,7 @@ custom_block.delete:
   path: '/block/{custom_block}/delete'
   defaults:
     _entity_form: 'custom_block.delete'
+    _title: 'Title'
   requirements:
     _entity_access: 'custom_block.delete'
 
@@ -47,6 +49,7 @@ custom_block.type_add:
   path: '/admin/structure/block/custom-blocks/types/add'
   defaults:
     _entity_form: 'custom_block_type.add'
+    _title: 'Add'
   requirements:
     _permission: 'administer blocks'
 
@@ -54,6 +57,7 @@ custom_block.type_edit:
   path: '/admin/structure/block/custom-blocks/manage/{custom_block_type}'
   defaults:
     _entity_form: 'custom_block_type.edit'
+    _title: 'Edit'
   requirements:
     _entity_access: 'custom_block_type.update'
 
diff --git a/core/modules/block/lib/Drupal/block/Controller/BlockController.php b/core/modules/block/lib/Drupal/block/Controller/BlockController.php
index f2ebb41..1acddb3 100644
--- a/core/modules/block/lib/Drupal/block/Controller/BlockController.php
+++ b/core/modules/block/lib/Drupal/block/Controller/BlockController.php
@@ -47,4 +47,18 @@ public function demo($theme) {
     );
   }
 
+  /**
+   * Get the title.
+   *
+   * @param string $theme
+   *   The configured theme.
+   *
+   * @return string
+   *   The human readable name of the theme.
+   */
+  public function getTitle($theme) {
+    $themes = $this->themeHandler->listInfo();
+    return String::checkPlain($themes[$theme]->info['name']);
+  }
+
 }
diff --git a/core/modules/editor/editor.routing.yml b/core/modules/editor/editor.routing.yml
index 2a753f5..d379456 100644
--- a/core/modules/editor/editor.routing.yml
+++ b/core/modules/editor/editor.routing.yml
@@ -19,6 +19,7 @@ editor.image_dialog:
   path: '/editor/dialog/image/{filter_format}'
   defaults:
     _form: '\Drupal\editor\Form\EditorImageDialog'
+    _title: 'Upload image'
   requirements:
     _entity_access: 'filter_format.view'
 
@@ -26,5 +27,6 @@ editor.link_dialog:
   path: '/editor/dialog/link/{filter_format}'
   defaults:
     _form: '\Drupal\editor\Form\EditorLinkDialog'
+    _title: 'Add link'
   requirements:
     _entity_access: 'filter_format.view'
diff --git a/core/modules/filter/filter.routing.yml b/core/modules/filter/filter.routing.yml
index 6dd8138..7ef9f43 100644
--- a/core/modules/filter/filter.routing.yml
+++ b/core/modules/filter/filter.routing.yml
@@ -35,6 +35,7 @@ filter.format_edit:
   path: '/admin/config/content/formats/manage/{filter_format}'
   defaults:
     _entity_form: filter_format.edit
+    _title_callback: '\Drupal\filter\Controller\FilterController::getLabel'
   requirements:
     _permission: 'administer filters'
 
diff --git a/core/modules/filter/lib/Drupal/filter/Controller/FilterController.php b/core/modules/filter/lib/Drupal/filter/Controller/FilterController.php
index ae8bc01..fe4d94f 100644
--- a/core/modules/filter/lib/Drupal/filter/Controller/FilterController.php
+++ b/core/modules/filter/lib/Drupal/filter/Controller/FilterController.php
@@ -37,4 +37,17 @@ function filterTips(FilterFormatInterface $filter_format = NULL) {
     return $build;
   }
 
+  /**
+   * Gets the label of a filter format.
+   *
+   * @param \Drupal\filter\FilterFormatInterface $filter_format
+   *   The filter format.
+   *
+   * @return string
+   *   The label of the filter format.
+   */
+  public function getLabel(FilterFormatInterface $filter_format) {
+    return $filter_format->label();
+  }
+
 }
diff --git a/core/modules/language/language.routing.yml b/core/modules/language/language.routing.yml
index cda5754..d3ad61c 100644
--- a/core/modules/language/language.routing.yml
+++ b/core/modules/language/language.routing.yml
@@ -2,6 +2,7 @@ language.negotiation_url:
   path: '/admin/config/regional/language/detection/url'
   defaults:
     _form: 'Drupal\language\Form\NegotiationUrlForm'
+    _title: 'Configure URL language negotiation'
   requirements:
     _permission: 'administer languages'
 
@@ -9,6 +10,7 @@ language.negotiation_session:
   path: '/admin/config/regional/language/detection/session'
   defaults:
     _form: 'Drupal\language\Form\NegotiationSessionForm'
+    _title: 'Configure session language negotiation'
   requirements:
     _permission: 'administer languages'
 
@@ -16,6 +18,7 @@ language.negotiation_selected:
   path: '/admin/config/regional/language/detection/selected'
   defaults:
     _form: 'Drupal\language\Form\NegotiationSelectedForm'
+    _title: 'Configure selection language negotiation'
   requirements:
     _permission: 'administer languages'
 
@@ -71,6 +74,7 @@ language.negotiation_browser_delete:
   path: '/admin/config/regional/language/detection/browser/delete/{browser_langcode}'
   defaults:
     _form: '\Drupal\language\Form\NegotiationBrowserDeleteForm'
+    _title: 'Delete'
   requirements:
     _permission: 'administer languages'
 
diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml
index b16080c..761662a 100644
--- a/core/modules/node/node.routing.yml
+++ b/core/modules/node/node.routing.yml
@@ -51,6 +51,7 @@ node.delete_confirm:
   path: '/node/{node}/delete'
   defaults:
     _entity_form: 'node.delete'
+    _title: 'Delete'
   requirements:
     _entity_access: 'node.delete'
 
diff --git a/core/modules/search/search.routing.yml b/core/modules/search/search.routing.yml
index 8cdec79..f53ccb8 100644
--- a/core/modules/search/search.routing.yml
+++ b/core/modules/search/search.routing.yml
@@ -57,6 +57,7 @@ search.delete:
   path: '/admin/config/search/settings/manage/{search_page}/delete'
   defaults:
     _entity_form: 'search_page.delete'
+    _title: 'Delete'
   requirements:
     _entity_access: 'search_page.delete'
 
diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml
index 9ec8d64..22dd0d1 100644
--- a/core/modules/shortcut/shortcut.routing.yml
+++ b/core/modules/shortcut/shortcut.routing.yml
@@ -50,6 +50,7 @@ shortcut.link_add:
   path: '/admin/config/user-interface/shortcut/manage/{shortcut_set}/add-link'
   defaults:
     _content: '\Drupal\shortcut\Controller\ShortcutController::addForm'
+    _title: 'Add link'
   requirements:
     _entity_create_access: 'shortcut:{shortcut_set}'
 
@@ -57,6 +58,7 @@ shortcut.link_edit:
   path: '/admin/config/user-interface/shortcut/link/{shortcut}'
   defaults:
     _entity_form: 'shortcut.default'
+    _title: 'Edit'
   requirements:
     _entity_access: 'shortcut.update'
 
@@ -64,6 +66,7 @@ shortcut.link_delete:
   path: '/admin/config/user-interface/shortcut/link/{shortcut}/delete'
   defaults:
     _entity_form: 'shortcut.delete'
+    _title: 'Delete'
   requirements:
     _entity_access: 'shortcut.delete'
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php b/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
index d7e51c4..d850818 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Menu/BreadcrumbTest.php
@@ -137,7 +137,7 @@ function testBreadCrumbs() {
     // @todo Remove this part once we have a _title_callback, see
     //   https://drupal.org/node/2076085.
     $trail += array(
-      "admin/config/content/formats/manage/$format_id" => Unicode::ucfirst(Unicode::strtolower($format->name)),
+      "admin/config/content/formats/manage/$format_id" => $format->label(),
     );
     $this->assertBreadcrumb("admin/config/content/formats/manage/$format_id/disable", $trail);
 
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 9be827e..652d912 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -337,6 +337,7 @@ system.theme_settings_theme:
   path: '/admin/appearance/settings/{theme}'
   defaults:
     _form: '\Drupal\system\Form\ThemeSettingsForm'
+    _title_callback: 'theme_handler:getName'
   requirements:
     _permission: 'administer themes'
 
@@ -351,6 +352,7 @@ system.modules_uninstall:
   path: '/admin/modules/uninstall'
   defaults:
     _form: 'Drupal\system\Form\ModulesUninstallForm'
+    _title: 'Uninstall'
   requirements:
     _permission: 'administer modules'
 
diff --git a/core/modules/taxonomy/taxonomy.routing.yml b/core/modules/taxonomy/taxonomy.routing.yml
index 63b374d..4839c35 100644
--- a/core/modules/taxonomy/taxonomy.routing.yml
+++ b/core/modules/taxonomy/taxonomy.routing.yml
@@ -58,6 +58,7 @@ taxonomy.vocabulary_reset:
   path: '/admin/structure/taxonomy/manage/{taxonomy_vocabulary}/reset'
   defaults:
     _entity_form: 'taxonomy_vocabulary.reset'
+    _title: 'Reset'
   requirements:
     _permission: 'administer taxonomy'
 
diff --git a/core/modules/user/user.routing.yml b/core/modules/user/user.routing.yml
index f59aabc..2ad06a8 100644
--- a/core/modules/user/user.routing.yml
+++ b/core/modules/user/user.routing.yml
@@ -103,6 +103,7 @@ user.role_edit:
   path: '/admin/people/roles/manage/{user_role}'
   defaults:
     _entity_form: user_role.default
+    _title: 'Edit role'
   requirements:
     _entity_access: user_role.update
 
@@ -110,7 +111,7 @@ user.role_delete:
   path: '/admin/people/roles/manage/{user_role}/delete'
   defaults:
     _entity_form: user_role.delete
-    _title: 'Edit role'
+    _title: 'Delete role'
   requirements:
     _entity_access: user_role.delete
 
diff --git a/core/modules/views_ui/views_ui.routing.yml b/core/modules/views_ui/views_ui.routing.yml
index ee6ad6c..d6b7ac1 100644
--- a/core/modules/views_ui/views_ui.routing.yml
+++ b/core/modules/views_ui/views_ui.routing.yml
@@ -126,6 +126,7 @@ views_ui.break_lock:
   path: '/admin/structure/views/view/{view}/break-lock'
   defaults:
     _entity_form: 'view.break_lock'
+    _title: 'Break lock'
   requirements:
     _permission: 'administer views'
 
