diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 9424994..dd30b92 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -156,8 +156,9 @@ public function urlInfo($rel = 'canonical') {
     $link_templates = $this->linkTemplates();
 
     if (isset($link_templates[$rel])) {
-      // If there is a template for the given relationship type, generate the path.
-      $uri = new Url($link_templates[$rel], $this->urlRouteParameters($rel));
+      $route_parameters = $this->urlRouteParameters($rel);
+      $route_name = "entity.{$this->entityTypeId}." . str_replace(array('-', 'drupal:'), array('_', ''), $rel);
+      $uri = new Url($route_name, $route_parameters);
     }
     else {
       $bundle = $this->bundle();
@@ -215,7 +216,7 @@ public function hasLinkTemplate($rel) {
    * Returns an array link templates.
    *
    * @return array
-   *   An array of link templates containing route names.
+   *   An array of link templates containing route names (temporary) or paths.
    */
   protected function linkTemplates() {
     return $this->getEntityType()->getLinkTemplates();
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 79c092e..b104bba 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -533,8 +533,8 @@ public function hasLinkTemplate($key) {
   /**
    * {@inheritdoc}
    */
-  public function setLinkTemplate($key, $route_name) {
-    $this->links[$key] = $route_name;
+  public function setLinkTemplate($key, $path) {
+    $this->links[$key] = $path;
     return $this;
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
index 7e8662b..862c573 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -440,7 +440,8 @@ public function getLinkTemplates();
    *   The link type.
    *
    * @return string|bool
-   *   The route name for this link, or FALSE if it doesn't exist.
+   *   The route name (temporary) or path for this link, or FALSE if it doesn't
+   *   exist.
    */
   public function getLinkTemplate($key);
 
@@ -460,12 +461,12 @@ public function hasLinkTemplate($key);
    *
    * @param string $key
    *   The name of a link.
-   * @param string $route_name
-   *   The route name to use for the link.
+   * @param string $path
+   *   The route name (temporary) or path to use for the link.
    *
    * @return static
    */
-  public function setLinkTemplate($key, $route_name);
+  public function setLinkTemplate($key, $path);
 
   /**
    * Gets the callback for the label of the entity.
diff --git a/core/modules/block_content/block_content.routing.yml b/core/modules/block_content/block_content.routing.yml
index 1628b89..f13572a 100644
--- a/core/modules/block_content/block_content.routing.yml
+++ b/core/modules/block_content/block_content.routing.yml
@@ -45,6 +45,15 @@ entity.block_content.canonical:
   requirements:
     _entity_access: 'block_content.update'
 
+entity.block_content.edit_form:
+  path: '/block/{block_content}'
+  defaults:
+    _entity_form: 'block_content.edit'
+  options:
+    _admin_route: TRUE
+  requirements:
+    _entity_access: 'block_content.update'
+
 entity.block_content.delete_form:
   path: '/block/{block_content}/delete'
   defaults:
diff --git a/core/modules/book/book.links.task.yml b/core/modules/book/book.links.task.yml
index 2ce18c6..2f6765e 100644
--- a/core/modules/book/book.links.task.yml
+++ b/core/modules/book/book.links.task.yml
@@ -8,8 +8,8 @@ book.settings:
   base_route: book.admin
   weight: 100
 
-book.outline:
-  route_name: book.outline
+entity.node.book_outline_form:
+  route_name: entity.node.book_outline_form
   base_route: entity.node.canonical
   title: Outline
   weight: 2
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 861ed73..e4f6bea 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -42,7 +42,7 @@ function book_help($route_name, RouteMatchInterface $route_match) {
     case 'book.admin':
       return '<p>' . t('The book module offers a means to organize a collection of related content pages, collectively known as a book. When viewed, this content automatically displays links to adjacent book pages, providing a simple navigation system for creating and reviewing structured content.') . '</p>';
 
-    case 'book.outline':
+    case 'entity.node.book_outline_form':
       return '<p>' . t('The outline feature allows you to include pages in the <a href="!book">Book hierarchy</a>, as well as move them within the hierarchy or to <a href="!book-admin">reorder an entire book</a>.', array('!book' => \Drupal::url('book.render'), '!book-admin' => \Drupal::url('book.admin'))) . '</p>';
   }
 }
@@ -89,7 +89,7 @@ function book_entity_type_build(array &$entity_types) {
   /** @var $entity_types \Drupal\Core\Entity\EntityTypeInterface[] */
   $entity_types['node']
     ->setFormClass('book_outline', 'Drupal\book\Form\BookOutlineForm')
-    ->setLinkTemplate('book-outline-form', 'book.outline')
+    ->setLinkTemplate('book-outline-form', 'entity.node.book_outline_form')
     ->setLinkTemplate('book-remove-form', 'book.remove');
 }
 
diff --git a/core/modules/book/book.routing.yml b/core/modules/book/book.routing.yml
index c365d01..13c0f10 100644
--- a/core/modules/book/book.routing.yml
+++ b/core/modules/book/book.routing.yml
@@ -30,7 +30,7 @@ book.export:
     _permission: 'access printer-friendly version'
     _entity_access: 'node.view'
 
-book.outline:
+entity.node.book_outline_form:
   path: '/node/{node}/outline'
   defaults:
     _entity_form: 'node.book_outline'
@@ -51,7 +51,7 @@ book.admin_edit:
     _entity_access: 'node.view'
     node: \d+
 
-book.remove:
+entity.node.book_remove_form:
   path: '/node/{node}/outline/remove'
   defaults:
     _form: '\Drupal\book\Form\BookRemoveForm'
diff --git a/core/modules/book/tests/src/Unit/Menu/BookLocalTasksTest.php b/core/modules/book/tests/src/Unit/Menu/BookLocalTasksTest.php
index 2e58f85..1702855 100644
--- a/core/modules/book/tests/src/Unit/Menu/BookLocalTasksTest.php
+++ b/core/modules/book/tests/src/Unit/Menu/BookLocalTasksTest.php
@@ -53,7 +53,7 @@ public function getBookAdminRoutes() {
    */
   public function testBookNodeLocalTasks($route) {
     $this->assertLocalTasks($route, array(
-      0 => array('book.outline', 'entity.node.canonical', 'entity.node.edit_form', 'entity.node.delete_form', 'entity.node.version_history',),
+      0 => array('entity.node.book_outline_form', 'entity.node.canonical', 'entity.node.edit_form', 'entity.node.delete_form', 'entity.node.version_history',),
     ));
   }
 
@@ -63,7 +63,7 @@ public function testBookNodeLocalTasks($route) {
   public function getBookNodeRoutes() {
     return array(
       array('entity.node.canonical'),
-      array('book.outline'),
+      array('entity.node.book_outline_form'),
     );
   }
 
diff --git a/core/modules/comment/src/Form/CommentAdminOverview.php b/core/modules/comment/src/Form/CommentAdminOverview.php
index 723241a..f0f623c 100644
--- a/core/modules/comment/src/Form/CommentAdminOverview.php
+++ b/core/modules/comment/src/Form/CommentAdminOverview.php
@@ -224,7 +224,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $type = '
       if ($this->moduleHandler->moduleExists('content_translation') && $this->moduleHandler->invoke('content_translation', 'translate_access', array($comment))->isAllowed()) {
         $links['translate'] = array(
           'title' => $this->t('Translate'),
-          'route_name' => 'content_translation.translation_overview_comment',
+          'route_name' => 'entity.comment.content_translation_overview',
           'route_parameters' => array('comment' => $comment->id()),
           'options' => $comment_uri_options,
           'query' => $destination,
diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index fa5b183..e6f463b 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -83,7 +83,7 @@ function config_translation_entity_type_alter(array &$entity_types) {
       elseif ($entity_type_id == 'field_config') {
         $class = 'Drupal\config_translation\Controller\ConfigTranslationFieldListBuilder';
         // Will be filled in dynamically, see \Drupal\field\Entity\FieldConfig::linkTemplates().
-        $entity_type->setLinkTemplate('drupal:config-translation-overview', 'config_translation.item.overview.');
+        $entity_type->setLinkTemplate("config-translation-overview.field_ui-field-$entity_type_id-edit-form", "entity.config_translation_overview.field_ui_field_{$entity_type_id}_edit_form");
       }
       else {
         $class = 'Drupal\config_translation\Controller\ConfigTranslationEntityListBuilder';
@@ -91,7 +91,7 @@ function config_translation_entity_type_alter(array &$entity_types) {
       $entity_type->setHandlerClass('config_translation_list', $class);
 
       if ($entity_type->hasLinkTemplate('edit-form')) {
-        $entity_type->setLinkTemplate('drupal:config-translation-overview', 'config_translation.item.overview.' . $entity_type->getLinkTemplate('edit-form'));
+        $entity_type->setLinkTemplate('config-translation-overview', 'entity.' . $entity_type_id . '.config_translation_overview');
       }
     }
   }
@@ -150,9 +150,10 @@ function config_translation_config_translation_info(&$info) {
     }
 
     // Use the entity type as the plugin ID.
+    $base_route_name = "entity.$entity_type_id.edit_form";
     $info[$entity_type_id] = array(
       'class' => '\Drupal\config_translation\ConfigEntityMapper',
-      'base_route_name' => $entity_type->getLinkTemplate('edit-form'),
+      'base_route_name' => $base_route_name,
       'title' => '!label !entity_type',
       'names' => array(),
       'entity_type' => $entity_type_id,
diff --git a/core/modules/config_translation/src/ConfigEntityMapper.php b/core/modules/config_translation/src/ConfigEntityMapper.php
index ce66ff6..29770e3 100644
--- a/core/modules/config_translation/src/ConfigEntityMapper.php
+++ b/core/modules/config_translation/src/ConfigEntityMapper.php
@@ -241,6 +241,13 @@ public function getContextualLinkGroup() {
   /**
    * {@inheritdoc}
    */
+  public function getOverviewRouteName() {
+    return 'entity.' . $this->entityType . '.config_translation_overview';
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   protected function processRoute(Route $route) {
     // Add entity upcasting information.
     $parameters = $route->getOption('parameters') ?: array();
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 1119ab8..b7a4aa5 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -115,7 +115,7 @@ function content_translation_entity_type_alter(array &$entity_types) {
       if ($entity_type->hasLinkTemplate('canonical')) {
         // Provide default route names for the translation paths.
         if (!$entity_type->hasLinkTemplate('drupal:content-translation-overview')) {
-          $entity_type->setLinkTemplate('drupal:content-translation-overview', "content_translation.translation_overview_" . $entity_type->id());
+          $entity_type->setLinkTemplate('drupal:content-translation-overview', "entity.{$entity_type->id()}.content_translation_overview");
         }
         // @todo Remove this as soon as menu access checks rely on the
         //   controller. See https://drupal.org/node/2155787.
diff --git a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
index b1f424f..c484f3c 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
@@ -53,9 +53,10 @@ public function getDerivativeDefinitions($base_plugin_definition) {
     // Create contextual links for translatable entity types.
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       $this->derivatives[$entity_type_id]['title'] = t('Translate');
-      $this->derivatives[$entity_type_id]['route_name'] = $entity_type->getLinkTemplate('drupal:content-translation-overview');
+      $this->derivatives[$entity_type_id]['route_name'] = "entity.$entity_type_id.content_translation_overview";
       $this->derivatives[$entity_type_id]['group'] = $entity_type_id;
     }
+    debug($this->derivatives);
     return parent::getDerivativeDefinitions($base_plugin_definition);
   }
 
diff --git a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
index 8b060f2..995de59 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -61,13 +61,14 @@ public function getDerivativeDefinitions($base_plugin_definition) {
     // Create tabs for all possible entity types.
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       // Find the route name for the translation overview.
-      $translation_route_name = $entity_type->getLinkTemplate('drupal:content-translation-overview');
+      $translation_route_name = "entity.$entity_type_id.content_translation_overview";
 
+      $base_route_name = "entity.$entity_type_id.canonical";
       $this->derivatives[$translation_route_name] = array(
         'entity_type' => $entity_type_id,
         'title' => 'Translate',
         'route_name' => $translation_route_name,
-        'base_route' => $entity_type->getLinkTemplate('canonical'),
+        'base_route' => $base_route_name,
       ) + $base_plugin_definition;
     }
     return parent::getDerivativeDefinitions($base_plugin_definition);
diff --git a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
index ce8bd57..a33b07b 100644
--- a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
@@ -42,17 +42,26 @@ public function __construct(ContentTranslationManagerInterface $content_translat
   protected function alterRoutes(RouteCollection $collection) {
     foreach ($this->contentTranslationManager->getSupportedEntityTypes() as $entity_type_id => $entity_type) {
       // Try to get the route from the current collection.
-      if (!$entity_route = $collection->get($entity_type->getLinkTemplate('canonical'))) {
-        continue;
+      $link_template = $entity_type->getLinkTemplate('canonical');
+      if (strpos($link_template, '/') !== FALSE) {
+        $base_path = '/' . $link_template;
+      }
+      else {
+        if (!$entity_route = $collection->get("entity.$entity_type_id.canonical")) {
+          continue;
+        }
+        $base_path = $entity_route->getPath();
       }
-      $path = $entity_route->getPath() . '/translations';
 
       // Inherit admin route status from edit route, if exists.
       $is_admin = FALSE;
-      if ($edit_route = $collection->get($entity_type->getLinkTemplate('edit-form'))) {
+      $route_name = "entity.$entity_type_id.edit_form";
+      if ($edit_route = $collection->get($route_name)) {
         $is_admin = (bool) $edit_route->getOption('_admin_route');
       }
 
+      $path = $base_path . '/translations';
+
       $route = new Route(
         $path,
         array(
@@ -71,7 +80,8 @@ protected function alterRoutes(RouteCollection $collection) {
           '_admin_route' => $is_admin,
         )
       );
-      $collection->add($entity_type->getLinkTemplate('drupal:content-translation-overview'), $route);
+      $route_name = "entity.$entity_type_id.content_translation_overview";
+      $collection->add($route_name, $route);
 
       $route = new Route(
         $path . '/add/{source}/{target}',
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
index 0b8e128..ea925e4 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationContextualLinksTest.php
@@ -131,6 +131,7 @@ public function testContentTranslationContextualLinks() {
     $response = $this->renderContextualLinks(array('node:node=1:'), 'node/' . $node->id());
     $this->assertResponse(200);
     $json = Json::decode($response);
+    debug($json);
     $this->drupalSetContent($json['node:node=1:']);
     $this->assertLinkByHref($translate_link, 0, 'The contextual link to translate the node is shown.');
 
diff --git a/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php b/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
index b8d799a..1a58b31 100644
--- a/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
+++ b/core/modules/content_translation/tests/src/Unit/Menu/ContentTranslationLocalTasksTest.php
@@ -28,7 +28,7 @@ protected function setUp() {
       ->method('getLinkTemplate')
       ->will($this->returnValueMap(array(
         array('canonical', 'entity.node.canonical'),
-        array('drupal:content-translation-overview', 'content_translation.translation_overview_node'),
+        array('drupal:content-translation-overview', 'entity.node.content_translation_overview'),
       )));
     $content_translation_manager = $this->getMock('Drupal\content_translation\ContentTranslationManagerInterface');
     $content_translation_manager->expects($this->any())
@@ -54,14 +54,14 @@ public function testBlockAdminDisplay($route, $expected) {
   public function providerTestBlockAdminDisplay() {
     return array(
       array('entity.node.canonical', array(array(
-        'content_translation.local_tasks:content_translation.translation_overview_node',
+        'content_translation.local_tasks:entity.node.content_translation_overview',
         'entity.node.canonical',
         'entity.node.edit_form',
         'entity.node.delete_form',
         'entity.node.version_history',
       ))),
-      array('content_translation.translation_overview_node', array(array(
-        'content_translation.local_tasks:content_translation.translation_overview_node',
+      array('entity.node.content_translation_overview', array(array(
+        'content_translation.local_tasks:entity.node.content_translation_overview',
         'entity.node.canonical',
         'entity.node.edit_form',
         'entity.node.delete_form',
diff --git a/core/modules/field/src/Entity/FieldConfig.php b/core/modules/field/src/Entity/FieldConfig.php
index 2e5f329..a1a98db 100644
--- a/core/modules/field/src/Entity/FieldConfig.php
+++ b/core/modules/field/src/Entity/FieldConfig.php
@@ -258,12 +258,12 @@ public static function postDelete(EntityStorageInterface $storage, array $fields
   protected function linkTemplates() {
     $link_templates = parent::linkTemplates();
     if (\Drupal::moduleHandler()->moduleExists('field_ui')) {
-      $link_templates['edit-form'] = 'field_ui.field_edit_' . $this->entity_type;
-      $link_templates['storage-edit-form'] = 'field_ui.storage_edit_' . $this->entity_type;
-      $link_templates['delete-form'] = 'field_ui.delete_' . $this->entity_type;
+      $link_templates["field_ui.field-{$this->entity_type}-edit-form"] = 'field_ui.field_edit_' . $this->entity_type;
+      $link_templates["field_ui.storage-{$this->entity_type}-edit-form"] = 'field_ui.storage_edit_' . $this->entity_type;
+      $link_templates["field_ui.field-{$this->entity_type}-delete-form"] = 'field_ui.field_delete_' . $this->entity_type;
 
       if (isset($link_templates['drupal:config-translation-overview'])) {
-        $link_templates['drupal:config-translation-overview'] .= $link_templates['edit-form'];
+        $link_templates["config-translation-overview.field_ui-field-{$this->entity_type}-edit-form"] = "entity.config_translation_overview.field_ui_field_{$this->entity_type}_edit_form";
       }
     }
     return $link_templates;
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 7d75563..34fc982 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -94,9 +94,9 @@ function field_ui_entity_type_build(array &$entity_types) {
   foreach ($entity_types as $entity_type) {
     if ($bundle = $entity_type->getBundleOf()) {
       $entity_type
-        ->setLinkTemplate('field_ui-fields', "field_ui.overview_$bundle")
-        ->setLinkTemplate('field_ui-form-display', "field_ui.form_display_overview_$bundle")
-        ->setLinkTemplate('field_ui-display', "field_ui.display_overview_$bundle");
+        ->setLinkTemplate('field_ui-fields', "entity.{$entity_type->id()}.field_ui_fields")
+        ->setLinkTemplate('field_ui-form-display', "entity.{$entity_type->id()}.field_ui_form_display")
+        ->setLinkTemplate('field_ui-display', "entity.{$entity_type->id()}.field_ui_display");
     }
   }
 }
@@ -298,8 +298,8 @@ function field_ui_entity_type_alter(array &$entity_types) {
   $form_mode->setFormClass('edit', 'Drupal\field_ui\Form\EntityDisplayModeEditForm');
   $form_mode->setFormClass('delete', 'Drupal\field_ui\Form\EntityDisplayModeDeleteForm');
   $form_mode->set('admin_permission', 'administer display modes');
-  $form_mode->setLinkTemplate('delete-form', 'field_ui.entity_form_mode.delete_form');
-  $form_mode->setLinkTemplate('edit-form', 'field_ui.entity_form_mode.edit_form');
+  $form_mode->setLinkTemplate('delete-form', 'entity.entity_form_mode.delete_form');
+  $form_mode->setLinkTemplate('edit-form', 'entity.entity_form_mode.edit_form');
 
   $view_mode = $entity_types['entity_view_mode'];
   $view_mode->setListBuilderClass('Drupal\field_ui\EntityDisplayModeListBuilder');
@@ -307,6 +307,6 @@ function field_ui_entity_type_alter(array &$entity_types) {
   $view_mode->setFormClass('edit', 'Drupal\field_ui\Form\EntityDisplayModeEditForm');
   $view_mode->setFormClass('delete', 'Drupal\field_ui\Form\EntityDisplayModeDeleteForm');
   $view_mode->set('admin_permission', 'administer display modes');
-  $view_mode->setLinkTemplate('delete-form', 'field_ui.entity_view_mode.delete_form');
-  $view_mode->setLinkTemplate('edit-form', 'field_ui.entity_view_mode.edit_form');
+  $view_mode->setLinkTemplate('delete-form', 'entity.entity_view_mode.delete_form');
+  $view_mode->setLinkTemplate('edit-form', 'entity.entity_view_mode.edit_form');
 }
diff --git a/core/modules/field_ui/field_ui.routing.yml b/core/modules/field_ui/field_ui.routing.yml
index cc17e94..4e03cb2 100644
--- a/core/modules/field_ui/field_ui.routing.yml
+++ b/core/modules/field_ui/field_ui.routing.yml
@@ -38,7 +38,7 @@ field_ui.entity_view_mode_add_type:
   requirements:
     _permission: 'administer display modes'
 
-field_ui.entity_view_mode.edit_form:
+entity.entity_view_mode.edit_form:
   path: '/admin/structure/display-modes/view/manage/{entity_view_mode}'
   defaults:
     _entity_form: 'entity_view_mode.edit'
@@ -46,7 +46,7 @@ field_ui.entity_view_mode.edit_form:
   requirements:
     _entity_access: 'entity_view_mode.update'
 
-field_ui.entity_view_mode.delete_form:
+entity.entity_view_mode.delete_form:
   path: '/admin/structure/display-modes/view/manage/{entity_view_mode}/delete'
   defaults:
     _entity_form: 'entity_view_mode.delete'
@@ -78,7 +78,7 @@ field_ui.entity_form_mode_add_type:
   requirements:
     _permission: 'administer display modes'
 
-field_ui.entity_form_mode.edit_form:
+entity.entity_form_mode.edit_form:
   path: '/admin/structure/display-modes/form/manage/{entity_form_mode}'
   defaults:
     _entity_form: 'entity_form_mode.edit'
@@ -86,7 +86,7 @@ field_ui.entity_form_mode.edit_form:
   requirements:
     _entity_access: 'entity_form_mode.update'
 
-field_ui.entity_form_mode.delete_form:
+entity.entity_form_mode.delete_form:
   path: '/admin/structure/display-modes/form/manage/{entity_form_mode}/delete'
   defaults:
     _entity_form: 'entity_form_mode.delete'
diff --git a/core/modules/field_ui/src/DisplayOverview.php b/core/modules/field_ui/src/DisplayOverview.php
index 2bc07c1..7552154 100644
--- a/core/modules/field_ui/src/DisplayOverview.php
+++ b/core/modules/field_ui/src/DisplayOverview.php
@@ -207,7 +207,7 @@ protected function getTableHeader() {
    */
   protected function getOverviewRoute($mode) {
     return array(
-      'route_name' => 'field_ui.display_overview_view_mode_' . $this->entity_type,
+      'route_name' => 'field_ui.display_overview_view_mode_' . $this->bundleEntityType,
       'route_parameters' => array(
         $this->bundleEntityType => $this->bundle,
         'view_mode_name' => $mode,
diff --git a/core/modules/field_ui/src/FieldConfigListBuilder.php b/core/modules/field_ui/src/FieldConfigListBuilder.php
index f4f76b5..60e0048 100644
--- a/core/modules/field_ui/src/FieldConfigListBuilder.php
+++ b/core/modules/field_ui/src/FieldConfigListBuilder.php
@@ -62,13 +62,27 @@ public function getDefaultOperations(EntityInterface $entity) {
     /** @var \Drupal\field\FieldConfigInterface $entity */
     $operations = parent::getDefaultOperations($entity);
 
+    if ($entity->access('update') && $entity->hasLinkTemplate("field_ui.field-{$entity->entity_type}-edit-form")) {
+      $operations['edit'] = array(
+          'title' => $this->t('Edit'),
+          'weight' => 10,
+        ) + $entity->urlInfo("field_ui.field-{$entity->entity_type}-edit-form")->toArray();
+    }
+    if ($entity->access('delete') && $entity->hasLinkTemplate("field_ui.field-{$entity->entity_type}-delete-form")) {
+      $operations['delete'] = array(
+          'title' => $this->t('Delete'),
+          'weight' => 100,
+        ) + $entity->urlInfo("field_ui.field-{$entity->entity_type}-delete-form")->toArray();
+    }
+
+    $bundle = $this->entityManager->getDefinition($entity->entity_type)->getBundleEntityType();
     $operations['storage-settings'] = array(
-      'title' => $this->t('Storage settings'),
+      'title' => $this->t('Field settings'),
       'weight' => 20,
-      'attributes' => array('title' => $this->t('Edit storage settings.')),
-    ) + $entity->urlInfo('storage-edit-form')->toArray();
-    $operations['edit']['attributes']['title'] = $this->t('Edit field settings.');
-    $operations['delete']['attributes']['title'] = $this->t('Delete field.');
+      'attributes' => array('title' => $this->t('Edit field settings.')),
+    ) + $entity->urlInfo("field_ui.storage-{$entity->entity_type}-edit-form")->toArray();
+    $operations['edit']['attributes']['title'] = $this->t('Edit instance settings.');
+    $operations['delete']['attributes']['title'] = $this->t('Delete instance.');
 
     return $operations;
   }
diff --git a/core/modules/field_ui/src/FieldOverview.php b/core/modules/field_ui/src/FieldOverview.php
index 0af938c..30d6c18 100644
--- a/core/modules/field_ui/src/FieldOverview.php
+++ b/core/modules/field_ui/src/FieldOverview.php
@@ -135,7 +135,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $entity_t
         'type' => array(
           '#type' => 'link',
           '#title' => $field_types[$field_storage->getType()]['label'],
-          '#route_name' => 'field_ui.storage_edit_' . $this->entity_type,
+          '#route_name' => "entity.field_config.field_ui.storage_{$this->entity_type}_edit_form",
           '#route_parameters' => $route_parameters,
           '#options' => array('attributes' => array('title' => $this->t('Edit field settings.'))),
         ),
@@ -410,8 +410,8 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
           $this->bundleEntityType => $this->bundle,
           'field_config' => $new_field->id(),
         );
-        $destinations[] = array('route_name' => 'field_ui.storage_edit_' . $this->entity_type, 'route_parameters' => $route_parameters);
-        $destinations[] = array('route_name' => 'field_ui.field_edit_' . $this->entity_type, 'route_parameters' => $route_parameters);
+        $destinations[] = array('route_name' => "entity.field_config.field_ui.storage_{$this->entity_type}_edit_form", 'route_parameters' => $route_parameters);
+        $destinations[] = array('route_name' => "entity.field_config.field_ui.field_{$this->entity_type}_edit_form", 'route_parameters' => $route_parameters);
 
         // Store new field information for any additional submit handlers.
         $form_state->set(['fields_added', '_add_new_field'], $values['field_name']);
diff --git a/core/modules/field_ui/src/FieldUI.php b/core/modules/field_ui/src/FieldUI.php
index 77ec651..e3f557e 100644
--- a/core/modules/field_ui/src/FieldUI.php
+++ b/core/modules/field_ui/src/FieldUI.php
@@ -29,7 +29,7 @@ class FieldUI {
   public static function getOverviewRouteInfo($entity_type_id, $bundle) {
     $entity_type = \Drupal::entityManager()->getDefinition($entity_type_id);
     if ($entity_type->get('field_ui_base_route')) {
-      return new Url("field_ui.overview_$entity_type_id", array(
+      return new Url("entity.{$entity_type->getBundleEntityType()}.field_ui_fields", array(
         $entity_type->getBundleEntityType() => $bundle,
       ));
     }
diff --git a/core/modules/field_ui/src/FormDisplayOverview.php b/core/modules/field_ui/src/FormDisplayOverview.php
index aacd423..d383b06 100644
--- a/core/modules/field_ui/src/FormDisplayOverview.php
+++ b/core/modules/field_ui/src/FormDisplayOverview.php
@@ -172,7 +172,7 @@ protected function getTableHeader() {
    */
   protected function getOverviewRoute($mode) {
     return array(
-      'route_name' => 'field_ui.form_display_overview_form_mode_' . $this->entity_type,
+      'route_name' => 'field_ui.form_display_overview_form_mode_' . $this->bundleEntityType,
       'route_parameters' => array(
         $this->bundleEntityType => $this->bundle,
         'form_mode_name' => $mode,
diff --git a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
index 788392c..e31ac77 100644
--- a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
+++ b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
@@ -70,41 +70,46 @@ public function getDerivativeDefinitions($base_plugin_definition) {
 
     foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
       if ($entity_type->isFieldable() && $entity_type->get('field_ui_base_route')) {
-        $this->derivatives["overview_$entity_type_id"] = array(
-          'route_name' => "field_ui.overview_$entity_type_id",
+        $field_entity_type = $entity_type->getBundleEntityType() ?: $entity_type_id;
+        if ($field_entity_type == 'bundle') {
+          $field_entity_type = $entity_type_id;
+        }
+
+        $this->derivatives["overview_$field_entity_type"] = array(
+          'route_name' => "entity.$field_entity_type.field_ui_fields",
           'weight' => 1,
           'title' => $this->t('Manage fields'),
-          'base_route' => "field_ui.overview_$entity_type_id",
+          'base_route' => "entity.$field_entity_type.field_ui_fields",
         );
 
         // 'Manage form display' tab.
-        $this->derivatives["form_display_overview_$entity_type_id"] = array(
-          'route_name' => "field_ui.form_display_overview_$entity_type_id",
+        $this->derivatives["form_display_overview_$field_entity_type"] = array(
+          'route_name' => "entity.{$field_entity_type}.field_ui_form_display",
           'weight' => 2,
           'title' => $this->t('Manage form display'),
-          'base_route' => "field_ui.overview_$entity_type_id",
+          'base_route' => "entity.$field_entity_type.field_ui_fields",
         );
 
         // 'Manage display' tab.
-        $this->derivatives["display_overview_$entity_type_id"] = array(
-          'route_name' => "field_ui.display_overview_$entity_type_id",
+        $this->derivatives["display_overview_$field_entity_type"] = array(
+          'route_name' => "entity.{$field_entity_type}.field_ui_display",
           'weight' => 3,
           'title' => $this->t('Manage display'),
-          'base_route' => "field_ui.overview_$entity_type_id",
+          'base_route' => "entity.$field_entity_type.field_ui_fields",
         );
 
-        // Field edit tab.
-        $this->derivatives["field_edit_$entity_type_id"] = array(
-          'route_name' => "field_ui.field_edit_$entity_type_id",
+        // Field instance edit tab.
+        $this->derivatives["field_edit_$field_entity_type"] = array(
+          'route_name' => "field_ui.field_edit_$field_entity_type",
           'title' => $this->t('Edit'),
-          'base_route' => "field_ui.field_edit_$entity_type_id",
+          'base_route' => "field_ui.field_edit_$field_entity_type",
         );
 
         // Field settings tab.
-        $this->derivatives["field_edit_$entity_type_id"] = array(
-          'route_name' => "field_ui.storage_edit_$entity_type_id",
+        $this->derivatives["field_edit_$field_entity_type"] = array(
+          'route_name' => "field_ui.storage_edit_$field_entity_type",
           'title' => $this->t('Field settings'),
-          'base_route' => "field_ui.field_edit_$entity_type_id",
+          'base_route' => "field_ui.field_edit_$field_entity_type",
         );
 
         // View and form modes secondary tabs.
@@ -114,29 +119,29 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         // modes available for customisation. So we define menu items for all
         // view modes, and use a route requirement to determine which ones are
         // actually visible for a given bundle.
-        $this->derivatives['field_form_display_default_' . $entity_type_id] = array(
+        $this->derivatives['field_form_display_default_' . $field_entity_type] = array(
           'title' => 'Default',
-          'route_name' => "field_ui.form_display_overview_$entity_type_id",
-          'parent_id' => "field_ui.fields:form_display_overview_$entity_type_id",
+          'route_name' => "entity.{$field_entity_type}.field_ui_form_display",
+          'parent_id' => "field_ui.fields:form_display_overview_$field_entity_type",
           'weight' => -1,
         );
-        $this->derivatives['field_display_default_' . $entity_type_id] = array(
+        $this->derivatives['field_display_default_' . $field_entity_type] = array(
           'title' => 'Default',
-          'route_name' => "field_ui.display_overview_$entity_type_id",
-          'parent_id' => "field_ui.fields:display_overview_$entity_type_id",
+          'route_name' => "entity.{$field_entity_type}.field_ui_display",
+          'parent_id' => "field_ui.fields:display_overview_$field_entity_type",
           'weight' => -1,
         );
 
         // One local task for each form mode.
         $weight = 0;
         foreach ($this->entityManager->getFormModes($entity_type_id) as $form_mode => $form_mode_info) {
-          $this->derivatives['field_form_display_' . $form_mode . '_' . $entity_type_id] = array(
+          $this->derivatives['field_form_display_' . $form_mode . '_' . $field_entity_type] = array(
             'title' => $form_mode_info['label'],
-            'route_name' => "field_ui.form_display_overview_form_mode_$entity_type_id",
+            'route_name' => "field_ui.form_display_overview_form_mode_$field_entity_type",
             'route_parameters' => array(
               'form_mode_name' => $form_mode,
             ),
-            'parent_id' => "field_ui.fields:form_display_overview_$entity_type_id",
+            'parent_id' => "field_ui.fields:form_display_overview_$field_entity_type",
             'weight' => $weight++,
           );
         }
@@ -144,13 +149,13 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         // One local task for each view mode.
         $weight = 0;
         foreach ($this->entityManager->getViewModes($entity_type_id) as $view_mode => $form_mode_info) {
-          $this->derivatives['field_display_' . $view_mode . '_' . $entity_type_id] = array(
+          $this->derivatives['field_display_' . $view_mode . '_' . $field_entity_type] = array(
             'title' => $form_mode_info['label'],
-            'route_name' => "field_ui.display_overview_view_mode_$entity_type_id",
+            'route_name' => "field_ui.display_overview_view_mode_$field_entity_type",
             'route_parameters' => array(
               'view_mode_name' => $view_mode,
             ),
-            'parent_id' => "field_ui.fields:display_overview_$entity_type_id",
+            'parent_id' => "field_ui.fields:display_overview_$field_entity_type",
             'weight' => $weight++,
           );
         }
@@ -172,19 +177,24 @@ public function getDerivativeDefinitions($base_plugin_definition) {
    */
   public function alterLocalTasks(&$local_tasks) {
     foreach ($this->entityManager->getDefinitions() as $entity_type_id => $entity_type) {
+      $field_entity_type = $entity_type->getBundleEntityType() ?: $entity_type_id;
+      if ($field_entity_type == 'bundle') {
+        $field_entity_type = $entity_type_id;
+      }
+
       if ($entity_type->isFieldable() && $route_name = $entity_type->get('field_ui_base_route')) {
-        $local_tasks["field_ui.fields:overview_$entity_type_id"]['base_route'] = $route_name;
-        $local_tasks["field_ui.fields:form_display_overview_$entity_type_id"]['base_route'] = $route_name;
-        $local_tasks["field_ui.fields:display_overview_$entity_type_id"]['base_route'] = $route_name;
-        $local_tasks["field_ui.fields:field_form_display_default_$entity_type_id"]['base_route'] = $route_name;
-        $local_tasks["field_ui.fields:field_display_default_$entity_type_id"]['base_route'] = $route_name;
+        $local_tasks["field_ui.fields:overview_$field_entity_type"]['base_route'] = $route_name;
+        $local_tasks["field_ui.fields:form_display_overview_$field_entity_type"]['base_route'] = $route_name;
+        $local_tasks["field_ui.fields:display_overview_$field_entity_type"]['base_route'] = $route_name;
+        $local_tasks["field_ui.fields:field_form_display_default_$field_entity_type"]['base_route'] = $route_name;
+        $local_tasks["field_ui.fields:field_display_default_$field_entity_type"]['base_route'] = $route_name;
 
         foreach ($this->entityManager->getFormModes($entity_type_id) as $form_mode => $form_mode_info) {
-          $local_tasks['field_ui.fields:field_form_display_' . $form_mode . '_' . $entity_type_id]['base_route'] = $route_name;
+          $local_tasks['field_ui.fields:field_form_display_' . $form_mode . '_' . $field_entity_type]['base_route'] = $route_name;
         }
 
         foreach ($this->entityManager->getViewModes($entity_type_id) as $view_mode => $form_mode_info) {
-          $local_tasks['field_ui.fields:field_display_' . $view_mode . '_' . $entity_type_id]['base_route'] = $route_name;
+          $local_tasks['field_ui.fields:field_display_' . $view_mode . '_' . $field_entity_type]['base_route'] = $route_name;
         }
       }
     }
diff --git a/core/modules/field_ui/src/Routing/RouteSubscriber.php b/core/modules/field_ui/src/Routing/RouteSubscriber.php
index 5fe9f36..eed7239 100644
--- a/core/modules/field_ui/src/Routing/RouteSubscriber.php
+++ b/core/modules/field_ui/src/Routing/RouteSubscriber.php
@@ -54,6 +54,9 @@ protected function alterRoutes(RouteCollection $collection) {
             'type' => 'entity:' . $entity_type->getBundleEntityType(),
           );
         }
+        elseif ($bundle_entity_type == 'bundle') {
+          $bundle_entity_type = $entity_type_id;
+        }
 
         $route = new Route(
           "$path/fields/{field_config}",
@@ -64,7 +67,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_entity_access' => 'field_config.update'),
           $options
         );
-        $collection->add("field_ui.field_edit_$entity_type_id", $route);
+        $collection->add("entity.field_config.field_ui.field_{$entity_type_id}_edit_form", $route);
 
         $route = new Route(
           "$path/fields/{field_config}/storage",
@@ -72,7 +75,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_entity_access' => 'field_config.update'),
           $options
         );
-        $collection->add("field_ui.storage_edit_$entity_type_id", $route);
+        $collection->add("entity.field_config.field_ui.storage_{$entity_type_id}_edit_form", $route);
 
         $route = new Route(
           "$path/fields/{field_config}/delete",
@@ -80,7 +83,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_entity_access' => 'field_config.delete'),
           $options
         );
-        $collection->add("field_ui.delete_$entity_type_id", $route);
+        $collection->add("entity.field_config.field_ui.field_{$entity_type_id}_delete_form", $route);
 
         // If the entity type has no bundles, use the entity type.
         $defaults['entity_type_id'] = $entity_type_id;
@@ -96,7 +99,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_permission' => 'administer ' . $entity_type_id . ' fields'),
           $options
         );
-        $collection->add("field_ui.overview_$entity_type_id", $route);
+        $collection->add("entity.$bundle_entity_type.field_ui_fields", $route);
 
         $route = new Route(
           "$path/form-display",
@@ -107,7 +110,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_field_ui_form_mode_access' => 'administer ' . $entity_type_id . ' form display'),
           $options
         );
-        $collection->add("field_ui.form_display_overview_$entity_type_id", $route);
+        $collection->add("entity.{$bundle_entity_type}.field_ui_form_display", $route);
 
         $route = new Route(
           "$path/form-display/{form_mode_name}",
@@ -118,7 +121,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_field_ui_form_mode_access' => 'administer ' . $entity_type_id . ' form display'),
           $options
         );
-        $collection->add("field_ui.form_display_overview_form_mode_$entity_type_id", $route);
+        $collection->add("field_ui.form_display_overview_form_mode_$bundle_entity_type", $route);
 
         $route = new Route(
           "$path/display",
@@ -129,7 +132,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_field_ui_view_mode_access' => 'administer ' . $entity_type_id . ' display'),
           $options
         );
-        $collection->add("field_ui.display_overview_$entity_type_id", $route);
+        $collection->add("entity.{$bundle_entity_type}.field_ui_display", $route);
 
         $route = new Route(
           "$path/display/{view_mode_name}",
@@ -140,7 +143,7 @@ protected function alterRoutes(RouteCollection $collection) {
           array('_field_ui_view_mode_access' => 'administer ' . $entity_type_id . ' display'),
           $options
         );
-        $collection->add("field_ui.display_overview_view_mode_$entity_type_id", $route);
+        $collection->add("field_ui.display_overview_view_mode_$bundle_entity_type", $route);
       }
     }
   }
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 0e7087d..10c8de5 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -165,8 +165,8 @@ function forum_entity_type_build(array &$entity_types) {
   $entity_types['taxonomy_term']
     ->setFormClass('forum', 'Drupal\forum\Form\ForumForm')
     ->setFormClass('container', 'Drupal\forum\Form\ContainerForm')
-    ->setLinkTemplate('forum-delete-form', 'forum.delete')
-    ->setLinkTemplate('forum-edit-form', 'forum.edit_forum');
+    ->setLinkTemplate('forum-delete-form', 'entity.taxonomy_term.forum_delete_form')
+    ->setLinkTemplate('forum-edit-form', 'entity.taxonomy_term.forum_edit_form');
 }
 
 /**
diff --git a/core/modules/forum/forum.routing.yml b/core/modules/forum/forum.routing.yml
index aa21336..ac9d35d 100644
--- a/core/modules/forum/forum.routing.yml
+++ b/core/modules/forum/forum.routing.yml
@@ -1,4 +1,4 @@
-forum.delete:
+entity.taxonomy_term.forum_delete_form:
   path: '/admin/structure/forum/delete/forum/{taxonomy_term}'
   defaults:
     _form: '\Drupal\forum\Form\DeleteForm'
@@ -54,7 +54,7 @@ forum.edit_container:
   requirements:
     _permission: 'administer forums'
 
-forum.edit_forum:
+entity.taxonomy_term.forum_edit_form:
   path: '/admin/structure/forum/edit/forum/{taxonomy_term}'
   defaults:
     _entity_form: 'taxonomy_term.forum'
diff --git a/core/modules/forum/src/Form/Overview.php b/core/modules/forum/src/Form/Overview.php
index eb05b3a..a8dbdf3 100644
--- a/core/modules/forum/src/Form/Overview.php
+++ b/core/modules/forum/src/Form/Overview.php
@@ -76,7 +76,7 @@ public function buildForm(array $form, FormStateInterface $form_state) {
         }
         else {
           $form['terms'][$key]['operations']['#links']['edit']['title'] = $this->t('edit forum');
-          $form['terms'][$key]['operations']['#links']['edit']['route_name'] = 'forum.edit_forum';
+          $form['terms'][$key]['operations']['#links']['edit']['route_name'] = 'entity.taxonomy_term.forum_edit_form';
           // We don't want the redirect from the link so we can redirect the
           // delete action.
           unset($form['terms'][$key]['operations']['#links']['edit']['query']['destination']);
diff --git a/core/modules/menu_link_content/menu_link_content.routing.yml b/core/modules/menu_link_content/menu_link_content.routing.yml
index 20832e9..15516bd 100644
--- a/core/modules/menu_link_content/menu_link_content.routing.yml
+++ b/core/modules/menu_link_content/menu_link_content.routing.yml
@@ -14,6 +14,14 @@ entity.menu_link_content.canonical:
   requirements:
     _entity_access: 'menu_link_content.update'
 
+entity.menu_link_content.edit_form:
+  path: '/admin/structure/menu/item/{menu_link_content}/edit'
+  defaults:
+    _entity_form: 'menu_link_content.default'
+    _title: 'Edit menu link'
+  requirements:
+    _entity_access: 'menu_link_content.update'
+
 entity.menu_link_content.delete_form:
   path: '/admin/structure/menu/item/{menu_link_content}/delete'
   defaults:
diff --git a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
index c39d156..89f2195 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -41,7 +41,7 @@
  *   },
  *   links = {
  *     "canonical" = "entity.menu_link_content.canonical",
- *     "edit-form" = "entity.menu_link_content.canonical",
+ *     "edit-form" = "entity.menu_link_content.edit_form",
  *     "delete-form" = "entity.menu_link_content.delete_form",
  *   }
  * )
diff --git a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
index ea47019..2d218c5 100644
--- a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
@@ -202,7 +202,7 @@ public function getEditRoute() {
   public function getTranslateRoute() {
     $entity_type = 'menu_link_content';
     return array(
-      'route_name' => 'content_translation.translation_overview_' . $entity_type,
+      'route_name' => "entity.{$entity_type}.content_translation_overview",
       'route_parameters' => array( $entity_type => $this->getEntity()->id()),
     );
   }
diff --git a/core/modules/menu_ui/menu_ui.links.action.yml b/core/modules/menu_ui/menu_ui.links.action.yml
index 848bcbe..d2feee0 100644
--- a/core/modules/menu_ui/menu_ui.links.action.yml
+++ b/core/modules/menu_ui/menu_ui.links.action.yml
@@ -1,5 +1,5 @@
-entity.menu.add_link_form:
-  route_name: entity.menu.add_link_form
+entity.menu.add_form:
+  route_name: entity.menu.add_form
   title: 'Add link'
   class: \Drupal\menu_ui\Plugin\Menu\LocalAction\MenuLinkAdd
   appears_on:
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 159a230..065140d 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -104,12 +104,12 @@ function node_help($route_name, RouteMatchInterface $route_match) {
     case 'node.type_add':
       return '<p>' . t('Individual content types can have different fields, behaviors, and permissions assigned to them.') . '</p>';
 
-    case 'field_ui.form_display_overview_node':
+    case "entity.node.field_ui_form_display":
     case 'field_ui.form_display_overview_form_mode_node':
       $type = $route_match->getParameter('node_type');
       return '<p>' . t('Content items can be edited using different form modes. Here, you can define which fields are shown and hidden when %type content is edited in each form mode, and define how the field form widgets are displayed in each form mode.', array('%type' => $type->label())) . '</p>' ;
 
-    case 'field_ui.display_overview_node':
+    case 'entity.node.field_ui_display':
     case 'field_ui.display_overview_view_mode_node':
       $type = $route_match->getParameter('node_type');
       return '<p>' . t('Content items can be displayed using different view modes: Teaser, Full content, Print, RSS, etc. <em>Teaser</em> is a short format that is typically used in lists of multiple content items. <em>Full content</em> is typically used when the content is displayed on its own page.') . '</p>' .
diff --git a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
index 5b17bc6..bfb0e35 100644
--- a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
+++ b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
@@ -109,7 +109,11 @@ public function getDerivativeDefinitions($base_plugin_definition) {
         foreach ($default_uris as $link_relation => $default_uri) {
           // Check if there are link templates defined for the entity type and
           // use the path from the route instead of the default.
-          if ($route_name = $entity_type->getLinkTemplate($link_relation)) {
+          $link_template = $entity_type->getLinkTemplate($link_relation);
+          if (strpos($link_template, '/') !== FALSE) {
+            $this->derivatives[$entity_type_id]['uri_paths'][$link_relation] = '/' . $link_template;
+          }
+          elseif ($route_name = $link_template) {
             // @todo remove the try/catch as part of
             // http://drupal.org/node/2158571
             try {
diff --git a/core/modules/shortcut/shortcut.routing.yml b/core/modules/shortcut/shortcut.routing.yml
index 6a892bd..c3ce8ad 100644
--- a/core/modules/shortcut/shortcut.routing.yml
+++ b/core/modules/shortcut/shortcut.routing.yml
@@ -62,6 +62,14 @@ entity.shortcut.canonical:
   requirements:
     _entity_access: 'shortcut.update'
 
+entity.shortcut.edit_form:
+  path: '/admin/config/user-interface/shortcut/link/{shortcut}'
+  defaults:
+    _entity_form: 'shortcut.default'
+    _title: 'Edit'
+  requirements:
+    _entity_access: 'shortcut.update'
+
 entity.shortcut.link_delete_inline:
   path: '/admin/config/user-interface/shortcut/link/{shortcut}/delete-inline'
   defaults:
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
index 4e03fd1..9026fd9 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMul.php
@@ -38,7 +38,7 @@
  *     "label" = "name"
  *   },
  *   links = {
- *     "canonical" = "entity.entity_test_mul.edit_form",
+ *     "canonical" = "entity.entity_test_mul.canonical",
  *     "edit-form" = "entity.entity_test_mul.edit_form",
  *     "delete-form" = "entity.entity_test_mul.delete_form",
  *   },
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
index 13aca32..7fcb92c 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestMulRev.php
@@ -39,7 +39,7 @@
  *     "bundle" = "type"
  *   },
  *   links = {
- *     "canonical" = "entity.entity_test_mulrev.edit_form",
+ *     "canonical" = "entity.entity_test_mulrev.canonical",
  *     "delete-form" = "entity.entity_test_mulrev.delete_form",
  *     "edit-form" = "entity.entity_test_mulrev.edit_form"
  *   }
diff --git a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
index f97d2fd..1e8b9fa 100644
--- a/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
+++ b/core/modules/system/tests/modules/entity_test/src/Entity/EntityTestRev.php
@@ -37,7 +37,7 @@
  *     "label" = "name",
  *   },
  *   links = {
- *     "canonical" = "entity.entity_test_rev.edit_form",
+ *     "canonical" = "entity.entity_test_rev.canonical",
  *     "delete-form" = "entity.entity_test_rev.delete_form",
  *     "edit-form" = "entity.entity_test_rev.edit_form"
  *   }
diff --git a/core/modules/system/tests/modules/entity_test/src/Routing/EntityTestRoutes.php b/core/modules/system/tests/modules/entity_test/src/Routing/EntityTestRoutes.php
index 5902b09..8e4985d 100644
--- a/core/modules/system/tests/modules/entity_test/src/Routing/EntityTestRoutes.php
+++ b/core/modules/system/tests/modules/entity_test/src/Routing/EntityTestRoutes.php
@@ -33,6 +33,15 @@ public function routes() {
         array('_permission' => 'administer entity_test content')
       );
 
+      $routes["entity.$entity_type.canonical"] = new Route(
+        "$entity_type/manage/{" . $entity_type . '}',
+        array('_content' => '\Drupal\entity_test\Controller\EntityTestController::testEdit', '_entity_type' => $entity_type),
+        array('_permission' => 'administer entity_test content'),
+        array('parameters' => array(
+          $entity_type => array('type' => 'entity:' . $entity_type),
+        ))
+      );
+
       $routes["entity.$entity_type.edit_form"] = new Route(
         "$entity_type/manage/{" . $entity_type . '}',
         array('_content' => '\Drupal\entity_test\Controller\EntityTestController::testEdit', '_entity_type' => $entity_type),
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 9e52c20..3c5f1f0 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -81,13 +81,13 @@ function user_help($route_name, RouteMatchInterface $route_match) {
     case 'user.role_list':
       return '<p>' . t('A role defines a group of users that have certain privileges. These privileges are defined on the <a href="!permissions">Permissions page</a>. Here, you can define the names and the display sort order of the roles on your site. It is recommended to order roles from least permissive (for example, Anonymous user) to most permissive (for example, Administrator user). Users who are not logged in have the Anonymous user role. Users who are logged in have the Authenticated user role, plus any other roles granted to their user account.', array('!permissions' => \Drupal::url('user.admin_permissions'))) . '</p>';
 
-    case 'field_ui.overview_user':
+    case 'entity.user.field_ui_fields':
       return '<p>' . t('This form lets administrators add and edit fields for storing user data.') . '</p>';
 
-    case 'field_ui.form_display_overview_user':
+    case 'entity.user.field_ui_form_display':
       return '<p>' . t('This form lets administrators configure how form fields should be displayed when editing a user profile.') . '</p>';
 
-    case 'field_ui.display_overview_user':
+    case 'entity.node.field_ui_display':
       return '<p>' . t('This form lets administrators configure how fields should be displayed when rendering a user profile page.') . '</p>';
   }
 }
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php
index 4787e62..9091dd4 100644
--- a/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php
+++ b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php
@@ -65,10 +65,10 @@ public function testUrlInfo($entity_class, $link_template, $expected) {
    */
   public function providerTestUrlInfo() {
     return array(
-      array('Drupal\Core\Entity\Entity', 'edit-form', 'test_entity_type.edit'),
-      array('Drupal\Core\Config\Entity\ConfigEntityBase', 'edit-form', 'test_entity_type.edit'),
+      array('Drupal\Core\Entity\Entity', 'edit-form', 'entity.test_entity_type.edit_form'),
+      array('Drupal\Core\Config\Entity\ConfigEntityBase', 'edit-form', 'entity.test_entity_type.edit_form'),
       // Test that overriding the default $rel parameter works.
-      array('Drupal\Core\Config\Entity\ConfigEntityBase', FALSE, 'test_entity_type.edit'),
+      array('Drupal\Core\Config\Entity\ConfigEntityBase', FALSE, 'entity.test_entity_type.edit_form'),
     );
   }
 
@@ -181,13 +181,13 @@ public function testUrl() {
       ->method('generateFromRoute')
       ->will($this->returnValueMap(array(
         array(
-          'test_entity_type.view',
+          'entity.test_entity_type.canonical',
           array('test_entity_type' => 'test_entity_id'),
           array('entity_type' => 'test_entity_type', 'entity' => $valid_entity),
           '/entity/test_entity_type/test_entity_id',
         ),
         array(
-          'test_entity_type.view',
+          'entity.test_entity_type.canonical',
           array('test_entity_type' => 'test_entity_id'),
           array('absolute' => TRUE, 'entity_type' => 'test_entity_type', 'entity' => $valid_entity),
           'http://drupal/entity/test_entity_type/test_entity_id',
@@ -208,7 +208,7 @@ public function testGetSystemPath() {
     $entity_type->expects($this->exactly(3))
       ->method('getLinkTemplates')
       ->will($this->returnValue(array(
-        'canonical' => 'test_entity_type.view',
+        'canonical' => 'entity.test_entity_type.canonical',
       )));
 
     $this->entityManager
@@ -222,7 +222,7 @@ public function testGetSystemPath() {
 
     $this->urlGenerator->expects($this->once())
       ->method('getPathFromRoute')
-      ->with('test_entity_type.view', array('test_entity_type' => 'test_entity_id'))
+      ->with('entity.test_entity_type.canonical', array('test_entity_type' => 'test_entity_id'))
       ->will($this->returnValue('entity/test_entity_type/test_entity_id'));
 
     $valid_entity = $this->getMockForAbstractClass('Drupal\Core\Entity\Entity', array(array('id' => 'test_entity_id'), 'test_entity_type'));
