diff --git a/config/schema/page_manager.schema.yml b/config/schema/page_manager.schema.yml
index 0968f55..454bf91 100644
--- a/config/schema/page_manager.schema.yml
+++ b/config/schema/page_manager.schema.yml
@@ -67,6 +67,9 @@ display_variant.plugin.block_page:
       label: 'Blocks'
       sequence:
         - type: page_manager.block_plugin.[id]
+    page_title:
+      type: label
+      label: 'Page title'
 
 display_variant.plugin.http_status_code:
   type: display_variant.plugin
diff --git a/src/Form/DisplayVariantAddForm.php b/src/Form/DisplayVariantAddForm.php
index a418f3e..089a770 100644
--- a/src/Form/DisplayVariantAddForm.php
+++ b/src/Form/DisplayVariantAddForm.php
@@ -9,6 +9,7 @@ namespace Drupal\page_manager\Form;
 
 use Drupal\Core\Display\VariantManager;
 use Drupal\Core\Form\FormStateInterface;
+use Drupal\page_manager\Plugin\PageAwareVariantInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -79,7 +80,11 @@ class DisplayVariantAddForm extends DisplayVariantFormBase {
    */
   protected function prepareDisplayVariant($display_variant_id) {
     // Create a new display variant instance.
-    return $this->variantManager->createInstance($display_variant_id);
+    $variant = $this->variantManager->createInstance($display_variant_id);
+    if ($variant instanceof PageAwareVariantInterface) {
+      $variant->setExecutable($this->page->getExecutable());
+    }
+    return $variant;
   }
 
 }
diff --git a/src/Plugin/DisplayVariant/BlockDisplayVariant.php b/src/Plugin/DisplayVariant/BlockDisplayVariant.php
index e47bfb4..cf22605 100644
--- a/src/Plugin/DisplayVariant/BlockDisplayVariant.php
+++ b/src/Plugin/DisplayVariant/BlockDisplayVariant.php
@@ -17,6 +17,7 @@ use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContainerFactoryPluginInterface;
 use Drupal\Core\Plugin\Context\ContextHandlerInterface;
 use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Utility\Token;
 use Drupal\page_manager\PageExecutable;
 use Drupal\page_manager\Plugin\BlockVariantInterface;
 use Drupal\page_manager\Plugin\BlockVariantTrait;
@@ -70,6 +71,13 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
   protected $executable;
 
   /**
+   * The token service.
+   *
+   * @var \Drupal\Core\Utility\Token
+   */
+  protected $token;
+
+  /**
    * Constructs a new BlockDisplayVariant.
    *
    * @param array $configuration
@@ -84,13 +92,16 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
    *   The current user.
    * @param \Drupal\Component\Uuid\UuidInterface $uuid_generator
    *   The UUID generator.
+   * @param \Drupal\Core\Utility\Token $token
+   *   The token service.
    */
-  public function __construct(array $configuration, $plugin_id, $plugin_definition, ContextHandlerInterface $context_handler, AccountInterface $account, UuidInterface $uuid_generator) {
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, ContextHandlerInterface $context_handler, AccountInterface $account, UuidInterface $uuid_generator, Token $token) {
     parent::__construct($configuration, $plugin_id, $plugin_definition);
 
     $this->contextHandler = $context_handler;
     $this->account = $account;
     $this->uuidGenerator = $uuid_generator;
+    $this->token = $token;
   }
 
   /**
@@ -103,7 +114,8 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
       $plugin_definition,
       $container->get('context.handler'),
       $container->get('current_user'),
-      $container->get('uuid')
+      $container->get('uuid'),
+      $container->get('token')
     );
   }
 
@@ -145,6 +157,7 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
         }
       }
     }
+    $build['#title'] = $this->renderPageTitle($this->configuration['page_title']);
     return $build;
   }
 
@@ -154,6 +167,15 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
   public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
     $form = parent::buildConfigurationForm($form, $form_state);
 
+    // Allow to configure the page title, even when adding a new display.
+    // Default to the page label in that case.
+    $form['page_title'] = array(
+      '#type' => 'textfield',
+      '#title' => $this->t('Page title'),
+      '#description' => $this->t('Configure the page title that will be used for this display.'),
+      '#default_value' => !$this->id() ? $this->executable->getPage()->label() : $this->configuration['page_title'],
+    );
+
     // Do not allow blocks to be added until the display variant has been saved.
     if (!$this->id()) {
       return $form;
@@ -329,6 +351,10 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
   public function submitConfigurationForm(array &$form, FormStateInterface $form_state) {
     parent::submitConfigurationForm($form, $form_state);
 
+    if ($form_state->hasValue('page_title')) {
+      $this->configuration['page_title'] = $form_state->getValue('page_title');
+    }
+
     // If the blocks were rearranged, update their values.
     if (!$form_state->isValueEmpty('blocks')) {
       foreach ($form_state->getValue('blocks') as $block_id => $block_values) {
@@ -362,6 +388,7 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
       'blocks' => array(),
       'selection_conditions' => array(),
       'selection_logic' => 'and',
+      'page_title' => '',
     );
   }
 
@@ -396,6 +423,42 @@ class BlockDisplayVariant extends VariantBase implements ContextAwareVariantInte
   }
 
   /**
+   * Renders the page title and replaces tokens.
+   *
+   * @param string $page_title
+   *   The page title that should be rendered.
+   *
+   * @return string
+   *   The page title after replacing any tokens.
+   */
+  protected function renderPageTitle($page_title) {
+    $data = $this->getContextAsTokenData();
+    return $this->token->replace($page_title, $data);
+  }
+
+  /**
+   * Returns available context as token data.
+   *
+   * @return array
+   *   An array with token data values keyed by token type.
+   */
+  protected function getContextAsTokenData() {
+    $data = array();
+    foreach ($this->executable->getContexts() as $context) {
+      // @todo Simplify this when token and typed data types are unified in
+      //   https://drupal.org/node/2163027.
+      if (strpos($context->getContextDefinition()->getDataType(), 'entity:') === 0) {
+        $token_type = substr($context->getContextDefinition()->getDataType(), 7);
+        if ($token_type == 'taxonomy_term') {
+          $token_type = 'term';
+        }
+        $data[$token_type] = $context->getContextValue();
+      }
+    }
+    return $data;
+  }
+
+  /**
    * Wraps drupal_html_class().
    *
    * @return string
diff --git a/src/Routing/PageManagerRoutes.php b/src/Routing/PageManagerRoutes.php
index c81d35c..eb68f65 100644
--- a/src/Routing/PageManagerRoutes.php
+++ b/src/Routing/PageManagerRoutes.php
@@ -86,7 +86,6 @@ class PageManagerRoutes extends RouteSubscriberBase {
         array(
           '_entity_view' => 'page_manager_page',
           'page_manager_page' => $entity_id,
-          '_title' => $entity->label(),
         ),
         array(
           '_entity_access' => 'page_manager_page.view',
diff --git a/src/Tests/PageManagerAdminTest.php b/src/Tests/PageManagerAdminTest.php
index 0e66dc0..eedb9b0 100644
--- a/src/Tests/PageManagerAdminTest.php
+++ b/src/Tests/PageManagerAdminTest.php
@@ -88,7 +88,6 @@ class PageManagerAdminTest extends WebTestBase {
     $this->drupalPostForm(NULL, array('display_variant[status_code]' => 200), 'Update display variant');
     $this->drupalGet('admin/foo');
     $this->assertResponse(200);
-    $this->assertTitle('Foo | Drupal');
     $this->drupalGet('admin/structure/page_manager/manage/foo');
     $this->clickLink('Edit');
     $this->drupalPostForm(NULL, array('display_variant[status_code]' => 403), 'Update display variant');
@@ -127,8 +126,10 @@ class PageManagerAdminTest extends WebTestBase {
     // Add a new display variant.
     $this->clickLink('Add new display variant');
     $this->clickLink('Block page');
+    $this->assertFieldByName("display_variant[page_title]", 'Foo', 'Default page title "Foo" was taken from page label.');
     $edit = array(
       'display_variant[label]' => 'First',
+      'display_variant[page_title]' => 'Example title',
     );
     $this->drupalPostForm(NULL, $edit, 'Add display variant');
     $this->assertRaw(String::format('The %label display variant has been added.', array('%label' => 'First')));
@@ -156,6 +157,7 @@ class PageManagerAdminTest extends WebTestBase {
     $this->drupalGet('admin/foo');
     $this->assertResponse(200);
     $elements = $this->xpath('//div[@class="block-region-top"]/div/div/ul[@class="menu"]/li/a');
+    $this->assertTitle('Example title | Drupal');
     $expected = array('My account', 'Log out');
     $links = array();
     foreach ($elements as $element) {
diff --git a/src/Tests/PageNodeSelectionTest.php b/src/Tests/PageNodeSelectionTest.php
index d1ad864..f28fa31 100644
--- a/src/Tests/PageNodeSelectionTest.php
+++ b/src/Tests/PageNodeSelectionTest.php
@@ -51,9 +51,11 @@ class PageNodeSelectionTest extends WebTestBase {
     $this->drupalGet('node/' . $node1->id());
     $this->assertResponse(200);
     $this->assertText($node1->label());
+    $this->assertTitle($node1->label() . ' | Drupal');
     $this->drupalGet('node/' . $node2->id());
     $this->assertResponse(200);
     $this->assertText($node2->label());
+    $this->assertTitle($node2->label() . ' | Drupal');
 
     // Create a new page entity to take over node pages.
     $edit = array(
@@ -85,6 +87,7 @@ class PageNodeSelectionTest extends WebTestBase {
     $edit = array(
       'region' => 'top',
       'context_mapping[entity]' => 'node',
+      'settings[label_display]' => FALSE,
     );
     $this->drupalPostForm(NULL, $edit, 'Add block');
 
@@ -96,16 +99,23 @@ class PageNodeSelectionTest extends WebTestBase {
     );
     $this->drupalPostForm(NULL, $edit, 'Add selection condition');
 
-    // The page node will 404, but the article node will display the display variant.
+    // Set the page title to the node title.
+    $edit = array(
+      'display_variant[page_title]' => '[node:title]',
+    );
+    $this->drupalPostForm(NULL, $edit, 'Update display variant');
+
+    // The page node will 404, but the article node will display the display
+    // variant.
     $this->drupalGet('node/' . $node1->id());
     $this->assertResponse(404);
-    $this->assertNoText('Node View');
     $this->assertNoText($node1->label());
 
     $this->drupalGet('node/' . $node2->id());
     $this->assertResponse(200);
-    $this->assertText('Node View');
-    $this->assertText($node2->label());
+    $this->assertTitle($node2->label() . ' | Drupal');
+    $this->assertText($node2->body->value);
+
   }
 
 }
diff --git a/tests/src/Unit/BlockDisplayVariantTest.php b/tests/src/Unit/BlockDisplayVariantTest.php
index 3186642..9a84264 100644
--- a/tests/src/Unit/BlockDisplayVariantTest.php
+++ b/tests/src/Unit/BlockDisplayVariantTest.php
@@ -108,9 +108,13 @@ class BlockDisplayVariantTest extends UnitTestCase {
       ->with($block2, array());
     $account = $this->getMock('Drupal\Core\Session\AccountInterface');
     $uuid_generator = $this->getMock('Drupal\Component\Uuid\UuidInterface');
+    $page_title = 'Page title';
+    $token = $this->getMockBuilder('Drupal\Core\Utility\Token')
+      ->disableOriginalConstructor()
+      ->getMock();
     $display_variant = $this->getMockBuilder('Drupal\page_manager\Plugin\DisplayVariant\BlockDisplayVariant')
-      ->setConstructorArgs(array(array(), 'test', array(), $context_handler, $account, $uuid_generator))
-      ->setMethods(array('getBlockBag', 'drupalHtmlClass'))
+      ->setConstructorArgs(array(array('page_title' => $page_title), 'test', array(), $context_handler, $account, $uuid_generator, $token))
+      ->setMethods(array('getBlockBag', 'drupalHtmlClass', 'renderPageTitle'))
       ->getMock();
     $display_variant->expects($this->exactly(1))
       ->method('drupalHtmlClass')
@@ -118,6 +122,10 @@ class BlockDisplayVariantTest extends UnitTestCase {
     $display_variant->expects($this->once())
       ->method('getBlockBag')
       ->will($this->returnValue($block_bag));
+    $display_variant->expects($this->once())
+      ->method('renderPageTitle')
+      ->with($page_title)
+      ->will($this->returnValue($page_title));
 
     $expected_build = array(
       'top' => array(
@@ -138,6 +146,7 @@ class BlockDisplayVariantTest extends UnitTestCase {
           ),
         ),
       ),
+      '#title' => 'Page title',
     );
     $this->assertSame($expected_build, $display_variant->build());
   }
diff --git a/tests/src/Unit/PageManagerRoutesTest.php b/tests/src/Unit/PageManagerRoutesTest.php
index a7198a9..6c9b2cf 100644
--- a/tests/src/Unit/PageManagerRoutesTest.php
+++ b/tests/src/Unit/PageManagerRoutesTest.php
@@ -115,9 +115,6 @@ class PageManagerRoutesTest extends UnitTestCase {
       ->method('getPath')
       ->will($this->returnValue('/page1'));
     $page1->expects($this->once())
-      ->method('label')
-      ->will($this->returnValue('Page label'));
-    $page1->expects($this->once())
       ->method('usesAdminTheme')
       ->will($this->returnValue(TRUE));
     $pages['page1'] = $page1;
@@ -143,7 +140,6 @@ class PageManagerRoutesTest extends UnitTestCase {
     $expected_defaults = array(
       '_entity_view' => 'page_manager_page',
       'page_manager_page' => 'page1',
-      '_title' => 'Page label',
     );
     $expected_requirements = array(
       '_entity_access' => 'page_manager_page.view',
@@ -192,7 +188,6 @@ class PageManagerRoutesTest extends UnitTestCase {
     $expected_defaults = array(
       '_entity_view' => 'page_manager_page',
       'page_manager_page' => 'page1',
-      '_title' => NULL,
     );
     $expected_requirements = array(
       '_entity_access' => 'page_manager_page.view',
