diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index cf18d55..f6d322f 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -156,8 +156,16 @@ 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);
+      // @TODO Temporarily allow both route names and paths as link templates.
+      if (strpos($link_templates[$rel], '/') !== FALSE) {
+        $route_name = "entity.{$this->entityTypeId}." . str_replace(array('-', 'drupal:'), array('_', ''), $rel);
+        $uri = new Url($route_name, $route_parameters);
+      }
+      else {
+        // If there is a template for the given relationship type, generate the path.
+        $uri = new Url($link_templates[$rel], $route_parameters);
+      }
     }
     else {
       $bundle = $this->bundle();
@@ -215,7 +223,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/EntityManager.php b/core/lib/Drupal/Core/Entity/EntityManager.php
index 3fc38fd..1d0f339 100644
--- a/core/lib/Drupal/Core/Entity/EntityManager.php
+++ b/core/lib/Drupal/Core/Entity/EntityManager.php
@@ -314,12 +314,22 @@ public function getController($entity_type, $controller_type, $controller_class_
    */
   public function getAdminRouteInfo($entity_type_id, $bundle) {
     if (($entity_type = $this->getDefinition($entity_type_id, FALSE)) && $admin_form = $entity_type->getLinkTemplate('admin-form')) {
-      return array(
-        'route_name' => $admin_form,
-        'route_parameters' => array(
-          $entity_type->getBundleEntityType() => $bundle,
-        ),
-      );
+      if (strpos($admin_form, '/') !== FALSE) {
+        return array(
+          'route_name' => "entity.$entity_type_id.admin_form",
+          'route_parameters' => array(
+            $entity_type->getBundleEntityType() => $bundle,
+          ),
+        );
+      }
+      else {
+        return array(
+          'route_name' => $admin_form,
+          'route_parameters' => array(
+            $entity_type->getBundleEntityType() => $bundle,
+          ),
+        );
+      }
     }
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityType.php b/core/lib/Drupal/Core/Entity/EntityType.php
index 728b3ec..1a3222f 100644
--- a/core/lib/Drupal/Core/Entity/EntityType.php
+++ b/core/lib/Drupal/Core/Entity/EntityType.php
@@ -505,8 +505,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 a6e39aa..03ed7e4 100644
--- a/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityTypeInterface.php
@@ -429,7 +429,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);
 
@@ -449,12 +450,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/config_translation/config_translation.module b/core/modules/config_translation/config_translation.module
index b128931..ae64cc4 100644
--- a/core/modules/config_translation/config_translation.module
+++ b/core/modules/config_translation/config_translation.module
@@ -103,7 +103,14 @@ function config_translation_entity_type_alter(array &$entity_types) {
       $entity_type->setControllerClass('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'));
+        $edit_link_template = $entity_type->getLinkTemplate('edit-form');
+        if (strpos($edit_link_template, '/') !== FALSE) {
+          $route_name = "entity.$entity_type_id.edit_form";
+        }
+        else {
+          $route_name = $edit_link_template;
+        }
+        $entity_type->setLinkTemplate('drupal:config-translation-overview', 'config_translation.item.overview.' . $route_name);
       }
     }
   }
@@ -162,9 +169,16 @@ function config_translation_config_translation_info(&$info) {
     }
 
     // Use the entity type as the plugin ID.
+    $link_template = $entity_type->getLinkTemplate('edit-form');
+    if (strpos($link_template, '/') !== FALSE) {
+      $base_route_name = "entity.$entity_type_id.edit_form";
+    }
+    else {
+      $base_route_name = $link_template;
+    }
     $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/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
index b1f424f..9afcd5f 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationContextualLinks.php
@@ -53,7 +53,13 @@ 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');
+      // @TODO What to do with this once link templates are paths again?
+      if (($link_template = $entity_type->getLinkTemplate('drupal:content-translation-overview')) && strpos($link_template, '/') !== FALSE) {
+        $this->derivatives[$entity_type_id]['route_name'] = "entity.$entity_type_id.content_translation_overview";
+      }
+      else {
+        $this->derivatives[$entity_type_id]['route_name'] = $entity_type->getLinkTemplate('drupal: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..2f741dc 100644
--- a/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
+++ b/core/modules/content_translation/src/Plugin/Derivative/ContentTranslationLocalTasks.php
@@ -61,13 +61,28 @@ 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');
+      // @TODO What to do with this once link templates are paths again?
+      $translation_template = $entity_type->getLinkTemplate('drupal:content-translation-overview');
+      if (strpos($translation_template, '/') !== FALSE) {
+        $translation_route_name = "entity.$entity_type_id.content_translation_overview";
+      }
+      else {
+        $translation_route_name = $translation_template;
+      }
 
+      $link_template = $entity_type->getLinkTemplate('canonical');
+      if (strpos($link_template, '/') !== FALSE) {
+        $base_route_name = "entity.$entity_type_id.canonical";
+      }
+      else {
+        $base_route_name = $link_template;
+      }
       $this->derivatives[$translation_route_name] = array(
         'entity_type' => $entity_type_id,
         'title' => 'Translate',
         'route_name' => $translation_route_name,
-        'base_route' => $entity_type->getLinkTemplate('canonical'),
+        // @TODO What to do with this once link templates are paths again?
+        '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 62b81fd..0c05977 100644
--- a/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
+++ b/core/modules/content_translation/src/Routing/ContentTranslationRouteSubscriber.php
@@ -41,17 +41,32 @@ 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($link_template)) {
+          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'))) {
+      $edit_link_template = $entity_type->getLinkTemplate('edit-form');
+      if (strpos($edit_link_template, '/') !== FALSE) {
+        $route_name = "entity.$entity_type_id.edit_form";
+      }
+      else {
+        $route_name = $edit_link_template;
+      }
+      if ($edit_route = $collection->get($route_name)) {
         $is_admin = (bool) $edit_route->getOption('_admin_route');
       }
 
+      $path = $base_path . '/translations';
+
       $route = new Route(
         $path,
         array(
@@ -75,7 +90,14 @@ protected function alterRoutes(RouteCollection $collection) {
           '_admin_route' => $is_admin,
         )
       );
-      $collection->add($entity_type->getLinkTemplate('drupal:content-translation-overview'), $route);
+      $translation_link_template = $entity_type->getLinkTemplate('drupal:content-translation-overview');
+      if (strpos($translation_link_template, '/') !== FALSE) {
+        $route_name = "entity.$entity_type_id.content_translation_overview";
+      }
+      else {
+        $route_name = $translation_link_template;
+      }
+      $collection->add($route_name, $route);
 
       $route = new Route(
         $path . '/add/{source}/{target}',
diff --git a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
index 1238afd..cf757e2 100644
--- a/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
+++ b/core/modules/field_ui/src/Plugin/Derivative/FieldUiLocalTask.php
@@ -174,6 +174,9 @@ public function alterLocalTasks(&$local_tasks) {
     foreach ($this->entityManager->getDefinitions() as $entity_type => $entity_info) {
       if ($entity_info->isFieldable() && $entity_info->hasLinkTemplate('admin-form')) {
         $admin_form = $entity_info->getLinkTemplate('admin-form');
+        if (strpos($admin_form, '/') !== FALSE) {
+          $admin_form = "entity.$entity_type.admin_form";
+        }
         $local_tasks["field_ui.fields:overview_$entity_type"]['base_route'] = $admin_form;
         $local_tasks["field_ui.fields:form_display_overview_$entity_type"]['base_route'] = $admin_form;
         $local_tasks["field_ui.fields:display_overview_$entity_type"]['base_route'] = $admin_form;
diff --git a/core/modules/field_ui/src/Routing/RouteSubscriber.php b/core/modules/field_ui/src/Routing/RouteSubscriber.php
index 57f7efd..0a6d402 100644
--- a/core/modules/field_ui/src/Routing/RouteSubscriber.php
+++ b/core/modules/field_ui/src/Routing/RouteSubscriber.php
@@ -43,10 +43,16 @@ protected function alterRoutes(RouteCollection $collection) {
       $defaults = array();
       if ($entity_type->isFieldable() && $entity_type->hasLinkTemplate('admin-form')) {
         // Try to get the route from the current collection.
-        if (!$entity_route = $collection->get($entity_type->getLinkTemplate('admin-form'))) {
+        $link_template = $entity_type->getLinkTemplate('admin-form');
+        if (strpos($link_template, '/') !== FALSE) {
+          $path = '/' . $link_template;
+        }
+        elseif ($entity_route = $collection->get($link_template)) {
+          $path = $entity_route->getPath();
+        }
+        else {
           continue;
         }
-        $path = $entity_route->getPath();
 
         $options = array();
         if (($bundle_entity_type = $entity_type->getBundleEntityType()) && $bundle_entity_type !== 'bundle') {
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/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php b/core/tests/Drupal/Tests/Core/Entity/EntityUrlTest.php
index 7f6ff8f..762d813 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'),
     );
   }
 
@@ -117,7 +117,7 @@ protected function getTestUrlInfo(EntityInterface $entity, $link_template) {
     $entity_type->expects($this->once())
       ->method('getLinkTemplates')
       ->will($this->returnValue(array(
-        'edit-form' => 'test_entity_type.edit',
+        'edit-form' => '/test_entity/{test_entity}/edit',
       )));
 
     $this->entityManager
@@ -161,7 +161,7 @@ public function testUrl() {
     $entity_type->expects($this->exactly(5))
       ->method('getLinkTemplates')
       ->will($this->returnValue(array(
-        'canonical' => 'test_entity_type.view',
+        'canonical' => '/test_entity/{test_entity}/edit',
       )));
 
     $this->entityManager
@@ -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 testUrlForAdminForm() {
     $entity_type->expects($this->exactly(2))
       ->method('getLinkTemplates')
       ->will($this->returnValue(array(
-        'admin-form' => 'test_entity_type.admin_form',
+        'admin-form' => 'entity/test_entity_type/test_entity_bundle/test_entity_id',
       )));
     $entity_type->expects($this->exactly(2))
       ->method('getBundleEntityType')
@@ -222,7 +222,7 @@ public function testUrlForAdminForm() {
 
     $this->urlGenerator->expects($this->once())
       ->method('generateFromRoute')
-      ->with('test_entity_type.admin_form', array(
+      ->with('entity.test_entity_type.admin_form', array(
         'test_entity_type_bundle' => 'test_entity_bundle',
         'test_entity_type' => 'test_entity_id',
       ))
@@ -246,7 +246,7 @@ public function testGetSystemPath() {
     $entity_type->expects($this->exactly(3))
       ->method('getLinkTemplates')
       ->will($this->returnValue(array(
-        'canonical' => 'test_entity_type.view',
+        'canonical' => '/test_entity/{test_entity}',
       )));
 
     $this->entityManager
@@ -260,7 +260,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'));
