diff --git a/core/modules/node/lib/Drupal/node/Controller/NodeController.php b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
index 8e56f588d633ec055806baca64a4b5b2bf992e5c..90e5899c86bf6f3e1e1c41a68c745d4937457ac6 100644
--- a/core/modules/node/lib/Drupal/node/Controller/NodeController.php
+++ b/core/modules/node/lib/Drupal/node/Controller/NodeController.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Utility\String;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Entity\EntityInterface;
+use Drupal\node\NodeTypeInterface;
 use Drupal\node\NodeInterface;
 
 /**
@@ -142,4 +143,17 @@ protected function buildPage(NodeInterface $node) {
     return array('nodes' => $this->entityManager()->getViewBuilder('node')->view($node));
   }
 
+  /**
+   * The _title_callback for the node.add route.
+   *
+   * @param \Drupal\node\NodeTypeInterface $node_type
+   *   The current node.
+   *
+   * @return string
+   *   The page title.
+   */
+  public function addPageTitle(NodeTypeInterface $node_type) {
+    return $this->t('Create @name', array('@name' => $node_type->type));
+  }
+
 }
diff --git a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
index 04a52c0800c8e38607cf5713cf650d55ff0bbf15..06c5766501f36b19f4f442f2de1d72b93ee39bc6 100644
--- a/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
+++ b/core/modules/node/lib/Drupal/node/Form/NodeTypeDeleteConfirm.php
@@ -71,8 +71,8 @@ public function getConfirmText() {
   public function buildForm(array $form, array &$form_state) {
     $num_nodes = $this->database->query("SELECT COUNT(*) FROM {node} WHERE type = :type", array(':type' => $this->entity->id()))->fetchField();
     if ($num_nodes) {
-      drupal_set_title($this->getQuestion(), PASS_THROUGH);
       $caption = '<p>' . format_plural($num_nodes, '%type is used by 1 piece of content on your site. You can not remove this content type until you have removed all of the %type content.', '%type is used by @count pieces of content on your site. You may not remove %type until you have removed all of the %type content.', array('%type' => $this->entity->label())) . '</p>';
+      $form['#title'] = $this->getQuestion();
       $form['description'] = array('#markup' => $caption);
       return $form;
     }
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index a78717534f371730304e3fec2e3bfa4c1a95ae77..e14a662394291954eb6552360003b1883169b119 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -11,6 +11,7 @@
 use Drupal\Core\Datetime\DrupalDateTime;
 use Drupal\Core\Entity\ContentEntityFormController;
 use Drupal\Core\Language\Language;
+use Drupal\Component\Utility\String;
 
 /**
  * Form controller for the node edit forms.
@@ -66,7 +67,7 @@ public function form(array $form, array &$form_state) {
     $node = $this->entity;
 
     if ($this->operation == 'edit') {
-      drupal_set_title(t('<em>Edit @type</em> @title', array('@type' => node_get_type_label($node), '@title' => $node->label())), PASS_THROUGH);
+      $form['#title'] = $this->t('<em>Edit @type</em> @title', array('@type' => node_get_type_label($node), '@title' => $node->label()));
     }
 
     $user_config = \Drupal::config('user.settings');
@@ -74,6 +75,7 @@ public function form(array $form, array &$form_state) {
     if (isset($form_state['node_preview'])) {
       $form['#prefix'] = $form_state['node_preview'];
       $node->in_preview = TRUE;
+      $form['#title'] = $this->t('Preview');
     }
     else {
       unset($node->in_preview);
diff --git a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
index d9d56660b3dccdb39be25fab27be77fb0b9a2864..a385b200b683e6c346fadff647ce0f347cfe398e 100644
--- a/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeTypeFormController.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Entity\EntityFormController;
 use Symfony\Component\DependencyInjection\ContainerInterface;
+use Drupal\Component\Utility\String;
 
 /**
  * Form controller for node type forms.
@@ -23,10 +24,10 @@ public function form(array $form, array &$form_state) {
 
     $type = $this->entity;
     if ($this->operation == 'add') {
-      drupal_set_title(t('Add content type'));
+      $form['#title'] = String::checkPlain($this->t('Add content type'));
     }
     elseif ($this->operation == 'edit') {
-      drupal_set_title(t('Edit %label content type', array('%label' => $type->label())), PASS_THROUGH);
+      $form['#title'] = $this->t('Edit %label content type', array('%label' => $type->label()));
     }
 
     $node_settings = $type->getModuleSettings('node');
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 5c10fbb6435a28d4d55f34835e3cbf2fa282f4d9..9a4f809bfc137377e6ca40c7fe7d35deae9288b4 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -971,8 +971,6 @@ function node_menu() {
     'route_name' => 'node.add_page',
   );
   $items['node/add/%node_type'] = array(
-    'title callback' => 'entity_page_label',
-    'title arguments' => array(2),
     'description callback' => 'node_type_get_description',
     'description arguments' => array(2),
     'route_name' => 'node.add',
diff --git a/core/modules/node/node.pages.inc b/core/modules/node/node.pages.inc
index 9783ed823179730f652e903a721127fc64c0d841..53dc99a66ae4d7085f3d32206b0910a26d6411f8 100644
--- a/core/modules/node/node.pages.inc
+++ b/core/modules/node/node.pages.inc
@@ -96,7 +96,6 @@ function node_add($node_type) {
     'type' => $type,
     'langcode' => $langcode ? $langcode : language_default()->id,
   ));
-  drupal_set_title(t('Create @name', array('@name' => $node_type->name)), PASS_THROUGH);
   return \Drupal::entityManager()->getForm($node);
 }
 
diff --git a/core/modules/node/node.routing.yml b/core/modules/node/node.routing.yml
index 8c922374134c0681826266c303f403c005960924..b87bb76bce76b6e49e82481cf68ba3268b845f82 100644
--- a/core/modules/node/node.routing.yml
+++ b/core/modules/node/node.routing.yml
@@ -35,6 +35,7 @@ node.add:
   path: '/node/add/{node_type}'
   defaults:
     _content: '\Drupal\node\Controller\NodeController::add'
+    _title_callback: '\Drupal\node\Controller\NodeController::addPageTitle'
   requirements:
     _node_add_access: 'node:{node_type}'