diff --git a/core/lib/Drupal/Core/Entity/ContentEntityConfirmFormBase.php b/core/lib/Drupal/Core/Entity/ContentEntityConfirmFormBase.php
index c20d0af..ec17336 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityConfirmFormBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityConfirmFormBase.php
@@ -118,4 +118,12 @@ public function save(array $form, FormStateInterface $form_state) {}
    */
   public function delete(array $form, FormStateInterface $form_state) {}
 
+  /**
+   * {@inheritdoc}
+   */
+  public function validate(array $form, array &$form_state) {
+    // Overwrite the default validation implementation as it is not necessary
+    // nor possible to validate an entity in a confirmation form.
+  }
+
 }
diff --git a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
index 37e40d4..d3ac060 100644
--- a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
+++ b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
@@ -9,6 +9,7 @@
 
 use Drupal\Component\Utility\Random;
 use Drupal\Core\Field\FieldDefinitionInterface;
+use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Field\FieldItemBase;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Form\FormStateInterface;
@@ -164,9 +165,36 @@ public static function generateSampleValue(FieldDefinitionInterface $field_defin
   /**
    * {@inheritdoc}
    */
+  public function preSave() {
+    // Trim any spaces around the link text.
+    $this->title = trim($this->title);
+
+    $parsed_url = UrlHelper::parse(trim($this->url));
+    $this->url = $parsed_url['path'];
+    $this->options = ($this->options) ?: array();
+
+    // The link 'query' and 'fragment' parts need to be split and updated only
+    // if they exist (e.g. when the 'url' property is new or updated).
+    $options = array();
+    if (!empty($parsed_url['query'])) {
+      $options['query'] = $parsed_url['query'];
+    }
+    if (!empty($parsed_url['fragment'])) {
+      $options['fragment'] = $parsed_url['fragment'];
+    }
+    $this->options = $options + $this->options;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function isEmpty() {
-    $value = $this->get('url')->getValue();
-    return $value === NULL || $value === '';
+    if ($this->isExternal()) {
+      return $this->url === NULL || $this->url === '';
+    }
+    else {
+      return $this->route_name === NULL || $this->route_name === '';
+    }
   }
 
   /**
@@ -183,4 +211,19 @@ public function isExternal() {
   public static function mainPropertyName() {
     return 'url';
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setValue($values, $notify = TRUE) {
+    // Unserialize the values.
+    // @todo The storage controller should take care of this.
+    foreach (array('route_parameters', 'options') as $property) {
+      if (isset($values[$property]) && is_string($values[$property])) {
+        $values[$property] = unserialize($values[$property]);
+      }
+    }
+    parent::setValue($values, $notify);
+  }
+
 }
diff --git a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
index 21e078f..ce2fe9f 100644
--- a/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
+++ b/core/modules/link/src/Plugin/Field/FieldWidget/LinkWidget.php
@@ -200,17 +200,30 @@ public function validateTitle(&$element, FormStateInterface $form_state, $form)
   public function massageFormValues(array $values, array $form, FormStateInterface $form_state) {
     foreach ($values as &$value) {
       if (!empty($value['url'])) {
-        $url = \Drupal::pathValidator()->getUrlIfValid($value['url']);
-        if (!$url) {
-          return $values;
-        }
+        try {
+          $parsed_url = UrlHelper::parse($value['url']);
 
-        $value += $url->toArray();
+          // If internal links are supported, look up whether the given value is
+          // a path alias and store the system path instead.
+          if ($this->supportsInternalLinks() && !UrlHelper::isExternal($value['url'])) {
+            $parsed_url['path'] = \Drupal::service('path.alias_manager')->getPathByAlias($parsed_url['path']);
+          }
 
-        // Reset the URL value to contain only the path.
-        if (!$url->isExternal() && $this->supportsInternalLinks()) {
-          $value['url'] = substr($url->toString(), strlen(\Drupal::request()->getBasePath() . '/'));
+          $url = Url::createFromPath($parsed_url['path']);
+          $url->setOption('query', $parsed_url['query']);
+          $url->setOption('fragment', $parsed_url['fragment']);
+          $url->setOption('attributes', $value['attributes']);
+
+          $value += $url->toArray();
+        }
+        catch (NotFoundHttpException $e) {
+          // Nothing to do here, LinkTypeConstraintValidator emits errors.
         }
+        catch (MatchingRouteNotFoundException $e) {
+          // Nothing to do here, LinkTypeConstraintValidator emits errors.
+        }
+
+        $value += $url->toArray();
       }
     }
     return $values;
diff --git a/core/modules/shortcut/shortcut.info.yml b/core/modules/shortcut/shortcut.info.yml
index dde0e9c..8293685 100644
--- a/core/modules/shortcut/shortcut.info.yml
+++ b/core/modules/shortcut/shortcut.info.yml
@@ -5,3 +5,5 @@ package: Core
 version: VERSION
 core: 8.x
 configure: shortcut.set_admin
+dependencies:
+  - link
diff --git a/core/modules/shortcut/shortcut.install b/core/modules/shortcut/shortcut.install
index be6f8b2..7f0c19d 100644
--- a/core/modules/shortcut/shortcut.install
+++ b/core/modules/shortcut/shortcut.install
@@ -5,14 +5,10 @@
  * Install, update and uninstall functions for the shortcut module.
  */
 
-use Drupal\Core\Database\Database;
-use Drupal\Core\Language\Language;
-
 /**
  * Implements hook_schema().
  */
 function shortcut_schema() {
-
   $schema['shortcut_set_users'] = array(
     'description' => 'Maps users to shortcut sets.',
     'fields' => array(
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index 2575128..206d1c9 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -256,11 +256,12 @@ function shortcut_renderable_links($shortcut_set = NULL) {
   $cache_tags = array();
   foreach ($shortcuts as $shortcut) {
     $shortcut = \Drupal::entityManager()->getTranslationFromContext($shortcut);
-    $links[] = array(
-      'title' => $shortcut->label(),
-      'href' => $shortcut->path->value,
-    );
     $cache_tags = Cache::mergeTags($cache_tags, $shortcut->getCacheTag());
+    $links[$shortcut->id()] = array(
+      'type' => 'link',
+      'title' => $shortcut->label(),
+    ) + $shortcut->getUrl()->toArray();
+    $cache_tags[] = $shortcut->getCacheTag();
   }
 
   if (!empty($links)) {
diff --git a/core/modules/shortcut/src/Controller/ShortcutSetController.php b/core/modules/shortcut/src/Controller/ShortcutSetController.php
index 729430f..b8a1b91 100644
--- a/core/modules/shortcut/src/Controller/ShortcutSetController.php
+++ b/core/modules/shortcut/src/Controller/ShortcutSetController.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Path\PathValidatorInterface;
+use Drupal\Core\Url;
 use Drupal\shortcut\ShortcutSetInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -64,7 +65,9 @@ public function addShortcutLinkInline(ShortcutSetInterface $shortcut_set, Reques
       $shortcut = $this->entityManager()->getStorage('shortcut')->create(array(
         'title' => $name,
         'shortcut_set' => $shortcut_set->id(),
-        'path' => $link,
+        'link' => array(
+          'url' => $link,
+        ) + Url::createFromPath($link)->toArray(),
       ));
 
       try {
diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index a3e15e7..28f20be 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -13,6 +13,7 @@
 use Drupal\Core\Entity\EntityTypeInterface;
 use Drupal\Core\Field\BaseFieldDefinition;
 use Drupal\Core\Url;
+use Drupal\link\LinkItemInterface;
 use Drupal\shortcut\ShortcutInterface;
 
 /**
@@ -63,7 +64,7 @@ public function getTitle() {
    */
   public function setTitle($link_title) {
     $this->set('title', $link_title);
-   return $this;
+    return $this;
   }
 
   /**
@@ -84,22 +85,15 @@ public function setWeight($weight) {
   /**
    * {@inheritdoc}
    */
-  public function getUrl() {
-    return new Url($this->getRouteName(), $this->getRouteParams());
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getRouteName() {
-    return $this->get('route_name')->value;
+    return $this->get('link')->route_name;
   }
 
   /**
    * {@inheritdoc}
    */
   public function setRouteName($route_name) {
-    $this->set('route_name', $route_name);
+    $this->get('link')->route_name = $route_name;
     return $this;
   }
 
@@ -107,37 +101,22 @@ public function setRouteName($route_name) {
    * {@inheritdoc}
    */
   public function getRouteParams() {
-    return $this->get('route_parameters')->first()->getValue();
+    return $this->get('link')->route_parameters;
   }
 
   /**
    * {@inheritdoc}
    */
   public function setRouteParams($route_parameters) {
-    $this->set('route_parameters', array($route_parameters));
+    $this->get('link')->route_parameters = $route_parameters;
     return $this;
   }
 
   /**
    * {@inheritdoc}
    */
-  public static function preCreate(EntityStorageInterface $storage, array &$values) {
-    parent::preCreate($storage, $values);
-
-    if (!isset($values['shortcut_set'])) {
-      $values['shortcut_set'] = 'default';
-    }
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function preSave(EntityStorageInterface $storage) {
-    parent::preSave($storage);
-
-    $url = Url::createFromPath($this->path->value);
-    $this->setRouteName($url->getRouteName());
-    $this->setRouteParams($url->getRouteParameters());
+  public function getUrl() {
+    return new Url($this->link->route_name, (array) $this->link->route_parameters, (array) $this->link->options);
   }
 
   /**
@@ -195,28 +174,27 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setLabel(t('Weight'))
       ->setDescription(t('Weight among shortcuts in the same shortcut set.'));
 
-    $fields['route_name'] = BaseFieldDefinition::create('string')
-      ->setLabel(t('Route name'))
-      ->setDescription(t('The machine name of a defined Route this shortcut represents.'));
-
-    $fields['route_parameters'] = BaseFieldDefinition::create('map')
-      ->setLabel(t('Route parameters'))
-      ->setDescription(t('A serialized array of route parameters of this shortcut.'));
+    $fields['link'] = FieldDefinition::create('link')
+      ->setLabel(t('Path'))
+      ->setDescription(t('The location this shortcut points to.'))
+      ->setRequired(TRUE)
+      ->setTranslatable(FALSE)
+      ->setSettings(array(
+        'default_value' => '',
+        'max_length' => 560,
+        'link_type' => LinkItemInterface::LINK_INTERNAL,
+        'title' => DRUPAL_DISABLED,
+      ))
+      ->setDisplayOptions('form', array(
+        'type' => 'link',
+        'weight' => 0,
+      ))
+      ->setDisplayConfigurable('form', TRUE);
 
     $fields['langcode'] = BaseFieldDefinition::create('language')
       ->setLabel(t('Language code'))
       ->setDescription(t('The language code of the shortcut.'));
 
-    $fields['path'] = BaseFieldDefinition::create('string')
-      ->setLabel(t('Path'))
-      ->setDescription(t('The computed shortcut path.'))
-      ->setComputed(TRUE)
-      ->setCustomStorage(TRUE);
-
-    $item_definition = $fields['path']->getItemDefinition();
-    $item_definition->setClass('\Drupal\shortcut\ShortcutPathItem');
-    $fields['path']->setItemDefinition($item_definition);
-
     return $fields;
   }
 
diff --git a/core/modules/shortcut/src/Form/SetCustomize.php b/core/modules/shortcut/src/Form/SetCustomize.php
index 89ddf4e..c8f25ba 100644
--- a/core/modules/shortcut/src/Form/SetCustomize.php
+++ b/core/modules/shortcut/src/Form/SetCustomize.php
@@ -52,7 +52,10 @@ public function form(array $form, FormStateInterface $form_state) {
     foreach ($this->entity->getShortcuts() as $shortcut) {
       $id = $shortcut->id();
       $form['shortcuts']['links'][$id]['#attributes']['class'][] = 'draggable';
-      $form['shortcuts']['links'][$id]['name']['#markup'] = $this->getLinkGenerator()->generateFromUrl($shortcut->getTitle(), $shortcut->getUrl());
+      $form['shortcuts']['links'][$id]['name'] = array(
+        '#type' => 'link',
+        '#title' => $shortcut->getTitle(),
+      ) + $shortcut->getUrl()->toRenderArray();
       $form['shortcuts']['links'][$id]['#weight'] = $shortcut->getWeight();
       $form['shortcuts']['links'][$id]['weight'] = array(
         '#type' => 'weight',
diff --git a/core/modules/shortcut/src/Form/ShortcutDeleteForm.php b/core/modules/shortcut/src/Form/ShortcutDeleteForm.php
index 6d8ec7c..21b74d9 100644
--- a/core/modules/shortcut/src/Form/ShortcutDeleteForm.php
+++ b/core/modules/shortcut/src/Form/ShortcutDeleteForm.php
@@ -27,7 +27,7 @@ public function getFormId() {
    * {@inheritdoc}
    */
   public function getQuestion() {
-    return $this->t('Are you sure you want to delete the shortcut %title?', array('%title' => $this->entity->title->value));
+    return $this->t('Are you sure you want to delete the shortcut %title?', array('%title' => $this->entity->getTitle()));
   }
 
   /**
diff --git a/core/modules/shortcut/src/ShortcutForm.php b/core/modules/shortcut/src/ShortcutForm.php
index c9f5d3d..df8f886 100644
--- a/core/modules/shortcut/src/ShortcutForm.php
+++ b/core/modules/shortcut/src/ShortcutForm.php
@@ -60,15 +60,6 @@ public static function create(ContainerInterface $container) {
   public function form(array $form, FormStateInterface $form_state) {
     $form = parent::form($form, $form_state);
 
-    $form['path'] = array(
-      '#type' => 'textfield',
-      '#title' => t('Path'),
-      '#size' => 40,
-      '#maxlength' => 255,
-      '#field_prefix' => $this->url('<front>', array(), array('absolute' => TRUE)),
-      '#default_value' => $this->entity->path->value,
-    );
-
     $form['langcode'] = array(
       '#title' => t('Language'),
       '#type' => 'language_select',
@@ -82,30 +73,6 @@ public function form(array $form, FormStateInterface $form_state) {
   /**
    * {@inheritdoc}
    */
-  public function buildEntity(array $form, FormStateInterface $form_state) {
-    $entity = parent::buildEntity($form, $form_state);
-
-    // Set the computed 'path' value so it can used in the preSave() method to
-    // derive the route name and parameters.
-    $entity->path->value = $form_state->getValue('path');
-
-    return $entity;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function validate(array $form, FormStateInterface $form_state) {
-    if (!$this->pathValidator->isValid($form_state->getValue('path'))) {
-      $form_state->setErrorByName('path', $this->t('The shortcut must correspond to a valid path on the site.'));
-    }
-
-    parent::validate($form, $form_state);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function save(array $form, FormStateInterface $form_state) {
     $entity = $this->entity;
     $entity->save();
diff --git a/core/modules/shortcut/src/ShortcutPathValue.php b/core/modules/shortcut/src/ShortcutPathValue.php
deleted file mode 100644
index 3d88d9b..0000000
--- a/core/modules/shortcut/src/ShortcutPathValue.php
+++ /dev/null
@@ -1,51 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\shortcut\ShortcutPathValue.
- */
-
-namespace Drupal\shortcut;
-
-use Drupal\Core\TypedData\TypedData;
-
-/**
- * A computed property for the string value of the path field.
- */
-class ShortcutPathValue extends TypedData {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getValue() {
-    if (!isset($this->value)) {
-      if (!isset($this->parent)) {
-        throw new \InvalidArgumentException('Computed properties require context for computation.');
-      }
-
-      $entity = $this->parent->getEntity();
-      if ($route_name = $entity->getRouteName()) {
-        $path = \Drupal::urlGenerator()->getPathFromRoute($route_name, $entity->getRouteParams());
-        $this->value = trim($path, '/');
-      }
-      else {
-        $this->value = NULL;
-      }
-    }
-    return $this->value;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function setValue($value, $notify = TRUE) {
-    // Normalize the path in case it is an alias.
-    $value = \Drupal::service('path.alias_manager')->getPathByAlias($value);
-    if (empty($value)) {
-      $value = '<front>';
-    }
-
-    parent::setValue($value, $notify);
-  }
-
-}
diff --git a/core/modules/shortcut/src/Tests/ShortcutLinksTest.php b/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
index 24c5550..4577bbe 100644
--- a/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
+++ b/core/modules/shortcut/src/Tests/ShortcutLinksTest.php
@@ -6,6 +6,7 @@
  */
 
 namespace Drupal\shortcut\Tests;
+
 use Drupal\shortcut\Entity\Shortcut;
 use Drupal\shortcut\Entity\ShortcutSet;
 
@@ -53,13 +54,14 @@ public function testShortcutLinkAdd() {
       $title = $this->randomMachineName();
       $form_data = array(
         'title[0][value]' => $title,
-        'path' => $test['path'],
+        'link[0][url]' => $test['path'],
       );
       $this->drupalPostForm('admin/config/user-interface/shortcut/manage/' . $set->id() . '/add-link', $form_data, t('Save'));
       $this->assertResponse(200);
       $saved_set = ShortcutSet::load($set->id());
-      $routes = $this->getShortcutInformation($saved_set, 'route_name');
-      $this->assertTrue(in_array($test['route_name'], $routes), 'Shortcut created: ' . $test['path']);
+      $paths = $this->getShortcutInformation($saved_set, 'link');
+      $test['path'] = $test['path'] != '<front>' ? $test['path'] : '';
+      $this->assertTrue(in_array($test['path'], $paths), 'Shortcut created: ' . $test['path']);
       $this->assertLink($title, 0, 'Shortcut link found on the page.');
     }
     $saved_set = ShortcutSet::load($set->id());
@@ -67,11 +69,11 @@ public function testShortcutLinkAdd() {
     $shortcuts = $saved_set->getShortcuts();
     foreach ($shortcuts as $entity) {
       // Test the node routes with parameters.
-      if (strpos($entity->route_name->value, 'node.') === 0) {
+      if (strpos($entity->link->route_name, 'node.') === 0) {
         $entity->save();
         $loaded = Shortcut::load($entity->id());
-        $this->assertEqual($entity->route_name->value, $loaded->route_name->value);
-        $this->assertEqual($entity->get('route_parameters')->first()->getValue(), $loaded->get('route_parameters')->first()->getValue());
+        $this->assertEqual($entity->link->route_name, $loaded->link->route_name);
+        $this->assertEqual($entity->link->route_parameters, $loaded->link->route_parameters);
       }
     }
 
@@ -136,7 +138,7 @@ public function testShortcutLinkRename() {
 
     $shortcuts = $set->getShortcuts();
     $shortcut = reset($shortcuts);
-    $this->drupalPostForm('admin/config/user-interface/shortcut/link/' . $shortcut->id(), array('title[0][value]' => $new_link_name, 'path' => $shortcut->path->value), t('Save'));
+    $this->drupalPostForm('admin/config/user-interface/shortcut/link/' . $shortcut->id(), array('title[0][value]' => $new_link_name, 'link[0][url]' => ltrim($shortcut->getUrl()->toString(), '/')), t('Save'));
     $saved_set = ShortcutSet::load($set->id());
     $titles = $this->getShortcutInformation($saved_set, 'title');
     $this->assertTrue(in_array($new_link_name, $titles), 'Shortcut renamed: ' . $new_link_name);
@@ -154,10 +156,10 @@ public function testShortcutLinkChangePath() {
 
     $shortcuts = $set->getShortcuts();
     $shortcut = reset($shortcuts);
-    $this->drupalPostForm('admin/config/user-interface/shortcut/link/' . $shortcut->id(), array('title[0][value]' => $shortcut->getTitle(), 'path' => $new_link_path), t('Save'));
+    $this->drupalPostForm('admin/config/user-interface/shortcut/link/' . $shortcut->id(), array('title[0][value]' => $shortcut->getTitle(), 'link[0][url]' => $new_link_path), t('Save'));
     $saved_set = ShortcutSet::load($set->id());
-    $routes = $this->getShortcutInformation($saved_set, 'route_name');
-    $this->assertTrue(in_array('system.admin_config', $routes), 'Shortcut path changed: ' . $new_link_path);
+    $paths = $this->getShortcutInformation($saved_set, 'link');
+    $this->assertTrue(in_array($new_link_path, $paths), 'Shortcut path changed: ' . $new_link_path);
     $this->assertLinkByHref($new_link_path, 0, 'Shortcut with new path appears on the page.');
   }
 
diff --git a/core/modules/shortcut/src/Tests/ShortcutTestBase.php b/core/modules/shortcut/src/Tests/ShortcutTestBase.php
index 388f5d2..739fcef 100644
--- a/core/modules/shortcut/src/Tests/ShortcutTestBase.php
+++ b/core/modules/shortcut/src/Tests/ShortcutTestBase.php
@@ -22,7 +22,7 @@
    *
    * @var array
    */
-  public static $modules = array('node', 'toolbar', 'shortcut');
+  public static $modules = array('node', 'toolbar', 'shortcut', 'views');
 
   /**
    * User with permission to administer shortcuts.
@@ -59,7 +59,10 @@ protected function setUp() {
         'set' => 'default',
         'title' => t('Add content'),
         'weight' => -20,
-        'path' => 'node/add',
+        'link' => array(
+          'url' => 'node/add',
+          'route_name' => 'node.add_page',
+        ),
       ));
       $shortcut->save();
 
@@ -67,7 +70,10 @@ protected function setUp() {
         'set' => 'default',
         'title' => t('All content'),
         'weight' => -19,
-        'path' => 'admin/content',
+        'link' => array(
+          'url' => 'admin/content',
+          'route_name' => 'view.content.page_1',
+        ),
       ));
       $shortcut->save();
     }
@@ -105,7 +111,7 @@ function generateShortcutSet($label = '', $id = NULL) {
    * @param string $key
    *   The array key indicating what information to extract from each link:
    *    - 'title': Extract shortcut titles.
-   *    - 'path': Extract shortcut paths.
+   *    - 'link': Extract shortcut paths.
    *    - 'id': Extract the shortcut ID.
    *
    * @return array
@@ -115,7 +121,12 @@ function getShortcutInformation(ShortcutSetInterface $set, $key) {
     $info = array();
     \Drupal::entityManager()->getStorage('shortcut')->resetCache();
     foreach ($set->getShortcuts() as $shortcut) {
-      $info[] = $shortcut->{$key}->value;
+      if ($key == 'link') {
+        $info[] = ltrim($shortcut->getUrl()->toString(), '/');
+      }
+      else {
+        $info[] = $shortcut->{$key}->value;
+      }
     }
     return $info;
   }
diff --git a/core/profiles/standard/standard.install b/core/profiles/standard/standard.install
index c2b5582..3525ccc 100644
--- a/core/profiles/standard/standard.install
+++ b/core/profiles/standard/standard.install
@@ -65,7 +65,9 @@ function standard_install() {
     'shortcut_set' => 'default',
     'title' => t('Add content'),
     'weight' => -20,
-    'path' => 'node/add',
+    'link' => array(
+      'route_name' => 'node.add_page',
+    ),
   ));
   $shortcut->save();
 
@@ -73,7 +75,9 @@ function standard_install() {
     'shortcut_set' => 'default',
     'title' => t('All content'),
     'weight' => -19,
-    'path' => 'admin/content',
+    'link' => array(
+      'route_name' => 'view.content.page_1',
+    ),
   ));
   $shortcut->save();
 
diff --git a/core/tests/Drupal/Tests/Core/UrlTest.php b/core/tests/Drupal/Tests/Core/UrlTest.php
index 133a73c..e2eaee0 100644
--- a/core/tests/Drupal/Tests/Core/UrlTest.php
+++ b/core/tests/Drupal/Tests/Core/UrlTest.php
@@ -35,6 +35,13 @@ class UrlTest extends UnitTestCase {
   protected $urlGenerator;
 
   /**
+   * The path alias manager.
+   *
+   * @var \Drupal\Core\Path\AliasManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $pathAliasManager;
+
+  /**
    * The router.
    *
    * @var \Drupal\Tests\Core\Routing\TestRouterInterface|\PHPUnit_Framework_MockObject_MockObject
@@ -60,15 +67,31 @@ protected function setUp() {
     $map[] = array('node_edit', array('node' => '2'), array(), '/node/2/edit');
     $this->map = $map;
 
+    $alias_map = array(
+      // Set up one proper alias that can be resolved to a system path.
+      array('node-alias-test', NULL, 'node'),
+      // Passing in anything else should return the same string.
+      array('node', NULL, 'node'),
+      array('node/1', NULL, 'node/1'),
+      array('node/2/edit', NULL, 'node/2/edit'),
+      array('non-existent', NULL, 'non-existent'),
+    );
+
     $this->urlGenerator = $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface');
     $this->urlGenerator->expects($this->any())
       ->method('generateFromRoute')
       ->will($this->returnValueMap($this->map));
 
+    $this->pathAliasManager = $this->getMock('Drupal\Core\Path\AliasManagerInterface');
+    $this->pathAliasManager->expects($this->any())
+      ->method('getPathByAlias')
+      ->will($this->returnValueMap($alias_map));
+
     $this->router = $this->getMock('Drupal\Tests\Core\Routing\TestRouterInterface');
     $this->container = new ContainerBuilder();
     $this->container->set('router.no_access_checks', $this->router);
     $this->container->set('url_generator', $this->urlGenerator);
+    $this->container->set('path.alias_manager', $this->pathAliasManager);
     \Drupal::setContainer($this->container);
   }
 
@@ -136,6 +159,27 @@ public function testCreateFromPathFront() {
   }
 
   /**
+   * Tests the createFromPath method with a path alias.
+   *
+   * @covers ::createFromPath()
+   */
+  public function testCreateFromPathAlias() {
+    $this->router->expects($this->any())
+      ->method('match')
+      ->will($this->returnValueMap(array(
+        array('/node', array(
+          RouteObjectInterface::ROUTE_NAME => 'view.frontpage.page_1',
+          '_raw_variables' => new ParameterBag(),
+        )),
+      )));
+
+    $values = $this->map[0];
+    array_pop($values);
+    $url = Url::createFromPath('node-alias-test');
+    $this->assertSame($values, array_values($url->toArray()));
+  }
+
+  /**
    * Tests that an invalid path will thrown an exception.
    *
    * @covers ::createFromPath()
