diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 558297b..1fed300 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -164,8 +164,9 @@ public function urlInfo($rel = 'canonical', array $options = []) {
     $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();
@@ -224,7 +225,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 5ea863d..b89a59f 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -531,8 +531,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 f8237a5..7c9b6e9 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -432,7 +432,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);
 
@@ -452,12 +453,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.module b/core/modules/book/book.module
index cea9627..dcf5bf4 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -89,7 +89,7 @@ function book_entity_type_build(array &$entity_types) {
   $entity_types['node']
     ->setFormClass('book_outline', 'Drupal\book\Form\BookOutlineForm')
     ->setLinkTemplate('book-outline-form', 'entity.node.book_outline_form')
-    ->setLinkTemplate('book-remove-form', 'entity.node.book_remove_form');
+    ->setLinkTemplate('book-remove-form', 'book.remove');
 }
 
 /**
diff --git a/core/modules/comment/src/Form/CommentAdminOverview.php b/core/modules/comment/src/Form/CommentAdminOverview.php
index 4abff68..c241841 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'),
-          'url' => Url::fromRoute('content_translation.translation_overview_comment', ['comment' => $comment->id()], $comment_uri_options + ['query' => $destination]),
+          'url' => Url::fromRoute('entity.comment.content_translation_overview', ['comment' => $comment->id()], $comment_uri_options + ['query' => $destination]),
         );
       }
       $options[$comment->id()]['operations']['data'] = array(
diff --git a/core/modules/comment/src/Tests/CommentTypeTest.php b/core/modules/comment/src/Tests/CommentTypeTest.php
index 4a6d1b1..6291a25 100644
--- a/core/modules/comment/src/Tests/CommentTypeTest.php
+++ b/core/modules/comment/src/Tests/CommentTypeTest.php
@@ -108,7 +108,8 @@ public function testCommentTypeEditing() {
     $this->drupalGet('admin/structure/comment');
     $this->assertRaw('Bar', 'New name was displayed.');
     $this->clickLink('Manage fields');
-    $this->assertUrl(\Drupal::url('field_ui.overview_comment', array('comment_type' => 'comment'), array('absolute' => TRUE)), [], 'Original machine name was used in URL.');
+
+    $this->assertUrl(\Drupal::url('entity.comment_type.field_ui_fields', array('comment_type' => 'comment'), array('absolute' => TRUE)), [], 'Original machine name was used in URL.');
 
     // Remove the body field.
     $this->drupalPostForm('admin/structure/comment/manage/comment/fields/comment.comment.comment_body/delete', array(), t('Delete'));
diff --git a/core/modules/config_translation/config_translation.api.php b/core/modules/config_translation/config_translation.api.php
index e44c168..f631655 100644
--- a/core/modules/config_translation/config_translation.api.php
+++ b/core/modules/config_translation/config_translation.api.php
@@ -36,13 +36,13 @@ function hook_config_translation_info(&$info) {
   $route_provider = \Drupal::service('router.route_provider');
 
   // If field UI is not enabled, the base routes of the type
-  // "field_ui.field_edit_$entity_type" are not defined.
+  // "entity.field_config.{$entity_type}_field_edit_form" are not defined.
   if (\Drupal::moduleHandler()->moduleExists('field_ui')) {
     // Add fields entity mappers to all fieldable entity types defined.
     foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) {
       $base_route = NULL;
       try {
-        $base_route = $route_provider->getRouteByName('field_ui.field_edit_' . $entity_type_id);
+        $base_route = $route_provider->getRouteByName('entity.field_config.' . $entity_type_id . '_field_edit_form');
       }
       catch (RouteNotFoundException $e) {
         // Ignore non-existent routes.
@@ -51,7 +51,7 @@ function hook_config_translation_info(&$info) {
       // Make sure entity type has field UI enabled and has a base route.
       if ($entity_type->get('field_ui_base_route') && !empty($base_route)) {
         $info[$entity_type_id . '_fields'] = array(
-          'base_route_name' => 'field_ui.field_edit_' . $entity_type_id,
+          'base_route_name' => 'entity.field_config.' . $entity_type_id . '_field_edit_form',
           'entity_type' => 'field_config',
           'title' => t('!label field'),
           'class' => '\Drupal\config_translation\ConfigFieldMapper',
diff --git a/core/modules/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index 32b3307..a4f1e85 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -8,6 +8,7 @@
 use Drupal\config_translation\Plugin\Derivative\ConfigTranslationLocalTasks;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\field\FieldConfigInterface;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 
 /**
@@ -83,7 +84,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', 'entity.' . $entity_type_id . '.config_translation_overview');
       }
       else {
         $class = 'Drupal\config_translation\Controller\ConfigTranslationEntityListBuilder';
@@ -91,7 +92,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');
       }
     }
   }
@@ -105,14 +106,14 @@ function config_translation_config_translation_info(&$info) {
   $route_provider = \Drupal::service('router.route_provider');
 
   // If field UI is not enabled, the base routes of the type
-  // "field_ui.field_edit_$entity_type" are not defined.
+  // "entity.field_config.{$entity_type}_field_edit_form" are not defined.
   if (\Drupal::moduleHandler()->moduleExists('field_ui')) {
     // Add fields entity mappers to all fieldable entity types defined.
     foreach ($entity_manager->getDefinitions() as $entity_type_id => $entity_type) {
       // Make sure entity type has field UI enabled and has a base route.
       if ($entity_type->get('field_ui_base_route')) {
         $info[$entity_type_id . '_fields'] = array(
-          'base_route_name' => 'field_ui.field_edit_' . $entity_type_id,
+          'base_route_name' => "entity.field_config.{$entity_type_id}_field_edit_form",
           'entity_type' => 'field_config',
           'title' => '!label field',
           'class' => '\Drupal\config_translation\ConfigFieldMapper',
@@ -139,9 +140,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,
@@ -157,12 +159,19 @@ function config_translation_entity_operation(EntityInterface $entity) {
   $operations = array();
   $entity_type = $entity->getEntityType();
   if ($entity_type->isSubclassOf('Drupal\Core\Config\Entity\ConfigEntityInterface') &&
-    $entity->hasLinkTemplate('drupal:config-translation-overview') &&
+    $entity->hasLinkTemplate('config-translation-overview') &&
     \Drupal::currentUser()->hasPermission('translate configuration')) {
+
+    $link_template = 'config-translation-overview';
+    // @todo Special case field UI.
+    if ($entity instanceof FieldConfigInterface) {
+      $link_template = "config-translation-overview.{$entity->getTargetEntityTypeId()}";
+    }
+
     $operations['translate'] = array(
       'title' => t('Translate'),
       'weight' => 50,
-      'url' => $entity->urlInfo('drupal:config-translation-overview'),
+      'url' => $entity->urlInfo($link_template),
     );
   }
 
diff --git a/core/modules/config_translation/src/ConfigEntityMapper.php b/core/modules/config_translation/src/ConfigEntityMapper.php
index 2cbc78e..f102492 100644
--- a/core/modules/config_translation/src/ConfigEntityMapper.php
+++ b/core/modules/config_translation/src/ConfigEntityMapper.php
@@ -244,6 +244,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/config_translation/src/ConfigFieldMapper.php b/core/modules/config_translation/src/ConfigFieldMapper.php
index 242e084..140cec8 100644
--- a/core/modules/config_translation/src/ConfigFieldMapper.php
+++ b/core/modules/config_translation/src/ConfigFieldMapper.php
@@ -37,6 +37,13 @@ public function getBaseRouteParameters() {
   /**
    * {@inheritdoc}
    */
+  public function getOverviewRouteName() {
+    return "entity.field_config.config_translation_overview.{$this->pluginDefinition['base_entity_type']}";
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getTypeLabel() {
     $base_entity_info = $this->entityManager->getDefinition($this->pluginDefinition['base_entity_type']);
     return $this->t('@label fields', array('@label' => $base_entity_info->getLabel()));
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index 01f4221..48a9a29 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..9acf394 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
@@ -53,7 +53,7 @@ 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;
     }
     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/ContentTranslationWorkflowsTest.php b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
index 1c6ff21..73dfe77 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationWorkflowsTest.php
@@ -62,6 +62,8 @@ protected function setupEntity() {
     // Create a translation.
     $this->drupalLogin($this->translator);
     $path = $this->entity->getSystemPath('drupal:content-translation-overview');
+    debug($path);
+
     $add_translation_path = $path . "/add/$default_langcode/{$this->langcodes[2]}";
     $this->drupalPostForm($add_translation_path, array(), t('Save'));
     $this->rebuildContainer();
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..e94c937 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["{$this->entity_type}-field-edit-form"] = 'entity.field_config.' . $this->entity_type . '_field_edit_form';
+      $link_templates["{$this->entity_type}-storage-edit-form"] = 'entity.field_config.' . $this->entity_type . '_storage_edit_form';
+      $link_templates["{$this->entity_type}-field-delete-form"] = 'entity.field_config.' . $this->entity_type . '_field_delete_form';
 
-      if (isset($link_templates['drupal:config-translation-overview'])) {
-        $link_templates['drupal:config-translation-overview'] .= $link_templates['edit-form'];
+      if (isset($link_templates['config-translation-overview'])) {
+        $link_templates["config-translation-overview.{$this->entity_type}"] = "entity.field_config.config_translation_overview.{$this->entity_type}";
       }
     }
     return $link_templates;
diff --git a/core/modules/field_ui/field_ui.module b/core/modules/field_ui/field_ui.module
index 8b5aaa3..b2f45f0 100644
--- a/core/modules/field_ui/field_ui.module
+++ b/core/modules/field_ui/field_ui.module
@@ -50,7 +50,7 @@ function field_ui_help($route_name, RouteMatchInterface $route_match) {
         $output .= '<dd>' . t('Fields on taxonomy terms are defined at the taxonomy vocabulary level, on the <em>Manage fields</em> tab of the vocabulary edit page (which you can reach from the <a href="@taxonomy">Taxonomy page</a>). When you define a field for a vocabulary, each term in that vocabulary will have that field added to it. For example, you could define an image field for a vocabulary to store an icon with each term.', array('@taxonomy' => \Drupal::url('taxonomy.vocabulary_list'))) . '</dd>';
       }
       $output .= '<dt>' . t('Fields on user accounts') . '</dt>';
-      $output .= '<dd>' . t('Fields on user accounts are defined on a site-wide basis on the <a href="@fields">Manage fields tab</a> of the <a href="@accounts">Account settings</a> page. When you define a field for user accounts, each user account will have that field added to it. For example, you could add a long text field to allow users to include a biography.', array('@fields' => \Drupal::url('field_ui.overview_user'), '@accounts' => \Drupal::url('entity.user.admin_form'))) . '</dd>';
+      $output .= '<dd>' . t('Fields on user accounts are defined on a site-wide basis on the <a href="@fields">Manage fields tab</a> of the <a href="@accounts">Account settings</a> page. When you define a field for user accounts, each user account will have that field added to it. For example, you could add a long text field to allow users to include a biography.', array('@fields' => \Drupal::url('entity.user.field_ui_fields'), '@accounts' => \Drupal::url('entity.user.admin_form'))) . '</dd>';
       if ($module_handler->moduleExists('comment')) {
         $output .= '<dt>' . t('Fields on comments') . '</dt>';
         $output .= '<dd>' . t('Fields on comments are defined at the comment entity level, on the <em>Manage fields</em> tab of the comment types edit page (which you can reach from the <a href="@types">Comment types page</a>). When you add a field for comments, each comment on an entity with that comment type will have that field added to it. For example, you could add a website field to the comments on forum posts, to allow forum commenters to add a link to their website.', array('@types' => \Drupal::url('comment.type_list'))) . '</dd>';
@@ -91,9 +91,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");
     }
   }
 }
@@ -299,8 +299,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');
@@ -308,6 +308,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 1374494..5c2a246 100644
--- a/core/modules/field_ui/src/DisplayOverview.php
+++ b/core/modules/field_ui/src/DisplayOverview.php
@@ -207,7 +207,10 @@ protected function getTableHeader() {
    * {@inheritdoc}
    */
   protected function getOverviewRoute($mode) {
-    return Url::fromRoute('field_ui.display_overview_view_mode_' . $this->entity_type, [
+    $entity_type = $this->entityManager->getDefinition($this->entity_type);
+    $field_entity_type = $entity_type->getBundleEntityType() != 'bundle'?  $entity_type->getBundleEntityType() : $entity_type->id();
+
+    return Url::fromRoute('field_ui.display_overview_view_mode_' . $field_entity_type, [
       $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 cae4250..ccd1abd 100644
--- a/core/modules/field_ui/src/FieldConfigListBuilder.php
+++ b/core/modules/field_ui/src/FieldConfigListBuilder.php
@@ -62,11 +62,24 @@ public function getDefaultOperations(EntityInterface $entity) {
     /** @var \Drupal\field\FieldConfigInterface $entity */
     $operations = parent::getDefaultOperations($entity);
 
+    if ($entity->access('update') && $entity->hasLinkTemplate("{$entity->entity_type}-field-edit-form")) {
+      $operations['edit'] = array(
+          'title' => $this->t('Edit'),
+          'weight' => 10,
+        ) + $entity->urlInfo("{$entity->entity_type}-field-edit-form")->toArray();
+    }
+    if ($entity->access('delete') && $entity->hasLinkTemplate("{$entity->entity_type}-field-delete-form")) {
+      $operations['delete'] = array(
+          'title' => $this->t('Delete'),
+          'weight' => 100,
+        ) + $entity->urlInfo("{$entity->entity_type}-field-delete-form")->toArray();
+    }
+
     $operations['storage-settings'] = array(
-      'title' => $this->t('Storage settings'),
+      'title' => $this->t('Field settings'),
       'weight' => 20,
-      'attributes' => array('title' => $this->t('Edit storage settings.')),
-      'url' => $entity->urlInfo('storage-edit-form'),
+      'attributes' => array('title' => $this->t('Edit field settings.')),
+      'url' => $entity->urlInfo("{$entity->entity_type}-storage-edit-form"),
     );
     $operations['edit']['attributes']['title'] = $this->t('Edit field settings.');
     $operations['delete']['attributes']['title'] = $this->t('Delete field.');
diff --git a/core/modules/field_ui/src/FieldOverview.php b/core/modules/field_ui/src/FieldOverview.php
index 838c116..f92d4c0 100644
--- a/core/modules/field_ui/src/FieldOverview.php
+++ b/core/modules/field_ui/src/FieldOverview.php
@@ -136,7 +136,7 @@ public function buildForm(array $form, FormStateInterface $form_state, $entity_t
         'type' => array(
           '#type' => 'link',
           '#title' => $field_types[$field_storage->getType()]['label'],
-          '#url' => Url::fromRoute('field_ui.storage_edit_' . $this->entity_type, $route_parameters),
+          '#url' => Url::fromRoute("entity.field_config.{$this->entity_type}_storage_edit_form", $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.{$this->entity_type}_storage_edit_form", 'route_parameters' => $route_parameters);
+        $destinations[] = array('route_name' => "entity.field_config.{$this->entity_type}_field_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']);
@@ -457,7 +457,7 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
             ->save();
 
           $destinations[] = array(
-            'route_name' => 'field_ui.field_edit_' . $this->entity_type,
+            'route_name' => 'entity.field_config.' . $this->entity_type . '_field_edit_form',
             'route_parameters' => array(
               $this->bundleEntityType => $this->bundle,
               'field_config' => $new_field->id(),
diff --git a/core/modules/field_ui/src/FieldUI.php b/core/modules/field_ui/src/FieldUI.php
index 1658c79..d751235a 100644
--- a/core/modules/field_ui/src/FieldUI.php
+++ b/core/modules/field_ui/src/FieldUI.php
@@ -29,7 +29,8 @@ 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(
+      $bundle_entity_type = $entity_type->getBundleEntityType() != 'bundle' ?  $entity_type->getBundleEntityType() : $entity_type->id();
+      return new Url("entity.{$bundle_entity_type}.field_ui_fields", array(
         $entity_type->getBundleEntityType() => $bundle,
       ));
     }
diff --git a/core/modules/field_ui/src/Form/FieldEditForm.php b/core/modules/field_ui/src/Form/FieldEditForm.php
index 9e23ee1..51cf8fe 100644
--- a/core/modules/field_ui/src/Form/FieldEditForm.php
+++ b/core/modules/field_ui/src/Form/FieldEditForm.php
@@ -222,7 +222,7 @@ public function delete(array &$form, FormStateInterface $form_state) {
     }
     $entity_type = $this->entityManager->getDefinition($this->field->entity_type);
     $form_state->setRedirect(
-      'field_ui.delete_' . $this->field->entity_type,
+      'entity.field_config.' . $this->field->entity_type . '_field_delete_form',
       array(
         $entity_type->getBundleEntityType() => $this->field->bundle,
         'field_config' => $this->field->id(),
diff --git a/core/modules/field_ui/src/FormDisplayOverview.php b/core/modules/field_ui/src/FormDisplayOverview.php
index c317fd5..358784a 100644
--- a/core/modules/field_ui/src/FormDisplayOverview.php
+++ b/core/modules/field_ui/src/FormDisplayOverview.php
@@ -172,7 +172,10 @@ protected function getTableHeader() {
    * {@inheritdoc}
    */
   protected function getOverviewRoute($mode) {
-    return Url::fromRoute('field_ui.form_display_overview_form_mode_' . $this->entity_type, [
+    $entity_type = $this->entityManager->getDefinition($this->entity_type);
+    $field_entity_type = $entity_type->getBundleEntityType() != 'bundle'?  $entity_type->getBundleEntityType() : $entity_type->id();
+
+    return Url::fromRoute('field_ui.form_display_overview_form_mode_' . $field_entity_type, [
       $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 ad1f7da..fa68862 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->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();
+        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",
+        $this->derivatives["field_edit_$field_entity_type"] = array(
+          'route_name' => "entity.field_config.{$field_entity_type}.field_edit_form",
           'title' => $this->t('Edit'),
-          'base_route' => "field_ui.field_edit_$entity_type_id",
+          'base_route' => "entity.field_config.{$field_entity_type}.field_edit_form",
         );
 
         // Field settings tab.
-        $this->derivatives["field_edit_$entity_type_id"] = array(
-          'route_name' => "field_ui.storage_edit_$entity_type_id",
+        $this->derivatives["field_storage_$field_entity_type"] = array(
+          'route_name' => "entity.field_config.$field_entity_type}.storage_edit_form",
           'title' => $this->t('Field settings'),
-          'base_route' => "field_ui.field_edit_$entity_type_id",
+          'base_route' => "entity.field_config.{$field_entity_type}.field_edit_form",
         );
 
         // 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();
+      if ($field_entity_type == 'bundle') {
+        $field_entity_type = $entity_type_id;
+      }
+
       if ($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 3abb6cf..a87c5cf 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.{$entity_type_id}_field_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.{$entity_type_id}_storage_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.{$entity_type_id}_field_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/field_ui/src/Tests/ManageDisplayTest.php b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
index 4839309..dc25502 100644
--- a/core/modules/field_ui/src/Tests/ManageDisplayTest.php
+++ b/core/modules/field_ui/src/Tests/ManageDisplayTest.php
@@ -371,7 +371,7 @@ function testNoFieldsDisplayOverview() {
     ));
 
     $this->drupalGet('admin/structure/types/manage/no_fields/display');
-    $this->assertRaw(t('There are no fields yet added. You can add new fields on the <a href="@link">Manage fields</a> page.', array('@link' => \Drupal::url('field_ui.overview_node', array('node_type' => 'no_fields')))));
+    $this->assertRaw(t('There are no fields yet added. You can add new fields on the <a href="@link">Manage fields</a> page.', array('@link' => \Drupal::url('entity.node_type.field_ui_fields', array('node_type' => 'no_fields')))));
   }
 
   /**
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 0d36992..6eaae2d 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -137,8 +137,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', 'entity.taxonomy_term.forum_delete_form')
     ->setLinkTemplate('forum-edit-container-form', 'entity.taxonomy_term.forum_edit_container_form')
+    ->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/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 e9aa9c0..373f3c0 100644
--- a/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Entity/MenuLinkContent.php
@@ -40,7 +40,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 8e3433b..34f38e2 100644
--- a/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
+++ b/core/modules/menu_link_content/src/Plugin/Menu/MenuLinkContent.php
@@ -194,7 +194,7 @@ public function getEditRoute() {
    * {@inheritdoc}
    */
   public function getTranslateRoute() {
-    return $this->getEntity()->urlInfo('drupal:content-translation-overview');
+    return $this->getEntity()->urlInfo('content-translation-overview');
   }
 
   /**
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 eacb7af..d03f641 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -105,12 +105,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/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 5948103..b72ff6a 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -53,10 +53,10 @@
  *   field_ui_base_route = "entity.node_type.edit_form",
  *   permission_granularity = "bundle",
  *   links = {
- *     "canonical" = "entity.node.canonical",
- *     "delete-form" = "entity.node.delete_form",
- *     "edit-form" = "entity.node.edit_form",
- *     "version-history" = "entity.node.version_history",
+ *     "canonical" = "/node/{node}",
+ *     "delete-form" = "/node/{node}/delete",
+ *     "edit-form" = "/node/{node}/edit",
+ *     "version-history" = "/node/{node}/revisions",
  *   }
  * )
  */
diff --git a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
index f80694f..d4a71c2 100644
--- a/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
+++ b/core/modules/rest/src/Plugin/Derivative/EntityDerivative.php
@@ -110,7 +110,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/2281645
             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/entity_test.module b/core/modules/system/tests/modules/entity_test/entity_test.module
index 12950bc..d730369 100644
--- a/core/modules/system/tests/modules/entity_test/entity_test.module
+++ b/core/modules/system/tests/modules/entity_test/entity_test.module
@@ -27,6 +27,11 @@
 const ENTITY_TEST_TYPES_MULTILINGUAL = 2;
 
 /**
+ * Filter that limits test entity list to routeable ones.
+ */
+const ENTITY_TEST_TYPES_ROUTING = 3;
+
+/**
  * Returns a list of test entity types.
  *
  * The returned entity types are one for each available entity storage type:
@@ -47,7 +52,7 @@
  */
 function entity_test_entity_types($filter = NULL) {
   $types = array();
-  if ($filter == NULL) {
+  if ($filter === NULL || $filter === ENTITY_TEST_TYPES_ROUTING) {
     $types[] = 'entity_test';
   }
   if ($filter != ENTITY_TEST_TYPES_REVISABLE) {
@@ -56,7 +61,11 @@ function entity_test_entity_types($filter = NULL) {
   if ($filter != ENTITY_TEST_TYPES_MULTILINGUAL) {
     $types[] = 'entity_test_rev';
   }
+  if ($filter === ENTITY_TEST_TYPES_ROUTING) {
+    $types[] = 'entity_test_base_field_display';
+  }
   $types[] = 'entity_test_mulrev';
+
   return array_combine($types, $types);
 }
 
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 402936f..9c1f51c 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
@@ -37,7 +37,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 b5fc86f..027df27 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
@@ -38,7 +38,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 3b40ed9..2a31fd9 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
@@ -36,7 +36,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/Plugin/Derivative/EntityTestLocalTasks.php b/core/modules/system/tests/modules/entity_test/src/Plugin/Derivative/EntityTestLocalTasks.php
index 7c7a90a..e4f8e49 100644
--- a/core/modules/system/tests/modules/entity_test/src/Plugin/Derivative/EntityTestLocalTasks.php
+++ b/core/modules/system/tests/modules/entity_test/src/Plugin/Derivative/EntityTestLocalTasks.php
@@ -19,13 +19,18 @@ class EntityTestLocalTasks extends DeriverBase {
    */
   public function getDerivativeDefinitions($base_plugin_definition) {
     $this->derivatives = array();
-    $types = entity_test_entity_types();
+    $types = entity_test_entity_types(ENTITY_TEST_TYPES_ROUTING);
 
     foreach($types as $entity_type) {
-      $this->derivatives[$entity_type] = array();
-      $this->derivatives[$entity_type]['base_route'] = "entity.$entity_type.edit_form";
-      $this->derivatives[$entity_type]['route_name'] = "entity.$entity_type.edit_form";
-      $this->derivatives[$entity_type]['title'] = 'Edit';
+      $this->derivatives[$entity_type . '.canonical'] = array();
+      $this->derivatives[$entity_type . '.canonical']['base_route'] = "entity.$entity_type.canonical";
+      $this->derivatives[$entity_type . '.canonical']['route_name'] = "entity.$entity_type.canonical";
+      $this->derivatives[$entity_type . '.canonical']['title'] = 'View';
+
+      $this->derivatives[$entity_type . '.edit'] = array();
+      $this->derivatives[$entity_type . '.edit']['base_route'] = "entity.$entity_type.canonical";
+      $this->derivatives[$entity_type . '.edit']['route_name'] = "entity.$entity_type.edit_form";
+      $this->derivatives[$entity_type . '.edit']['title'] = 'Edit';
     }
 
     return parent::getDerivativeDefinitions($base_plugin_definition);
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..042cca7 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
@@ -21,7 +21,7 @@ class EntityTestRoutes {
    *   An array of route objects.
    */
   public function routes() {
-    $types = entity_test_entity_types();
+    $types = entity_test_entity_types(ENTITY_TEST_TYPES_ROUTING);
     $types[] = 'entity_test_string_id';
     $types[] = 'entity_test_no_id';
 
@@ -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/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index f659d14..78baf85 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -47,9 +47,9 @@
  *     "uuid" = "uuid"
  *   },
  *   links = {
- *     "canonical" = "entity.user.canonical",
- *     "edit-form" = "entity.user.edit_form",
- *     "cancel-form" = "entity.user.cancel_form",
+ *     "canonical" = "/user/{user}",
+ *     "edit-form" = "/user/{user}/edit",
+ *     "cancel-form" = "/user/{user}/cancel",
  *   },
  *   field_ui_base_route = "entity.user.admin_form",
  * )
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 9146aac..e37a02a 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/modules/views_ui/views_ui.module b/core/modules/views_ui/views_ui.module
index 94b45ea..03a39e3 100644
--- a/core/modules/views_ui/views_ui.module
+++ b/core/modules/views_ui/views_ui.module
@@ -53,14 +53,14 @@ function views_ui_entity_type_build(array &$entity_types) {
     ->setFormClass('delete', 'Drupal\views_ui\ViewDeleteForm')
     ->setFormClass('break_lock', 'Drupal\views_ui\Form\BreakLockForm')
     ->setListBuilderClass('Drupal\views_ui\ViewListBuilder')
-    ->setLinkTemplate('edit-form', 'entity.view.edit_form')
-    ->setLinkTemplate('edit-display-form', 'entity.view.edit_display_form')
-    ->setLinkTemplate('preview-form', 'entity.view.preview_form')
-    ->setLinkTemplate('duplicate-form', 'entity.view.duplicate_form')
-    ->setLinkTemplate('delete-form', 'entity.view.delete_form')
-    ->setLinkTemplate('enable', 'entity.view.enable')
-    ->setLinkTemplate('disable', 'entity.view.disable')
-    ->setLinkTemplate('break-lock-form', 'entity.view.break_lock_form');
+    ->setLinkTemplate('edit-form', '/admin/structure/views/view/{view}')
+    ->setLinkTemplate('edit-display-form', '/admin/structure/views/view/{view}/edit/{display_id}')
+    ->setLinkTemplate('preview-form', '/admin/structure/views/view/{view}/preview/{display_id}')
+    ->setLinkTemplate('duplicate-form', '/admin/structure/views/view/{view}/duplicate')
+    ->setLinkTemplate('delete-form', '/admin/structure/views/view/{view}/delete')
+    ->setLinkTemplate('enable', '/admin/structure/views/view/{view}/enable')
+    ->setLinkTemplate('disable', '/admin/structure/views/view/{view}/disable')
+    ->setLinkTemplate('break-lock-form', '/admin/structure/views/view/{view}/break-lock');
 }
 
 /**
diff --git a/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php
index d1e8114..00b1515 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'));
