diff --git a/core/lib/Drupal/Core/Url.php b/core/lib/Drupal/Core/Url.php
index 999f447..8c79c4d 100644
--- a/core/lib/Drupal/Core/Url.php
+++ b/core/lib/Drupal/Core/Url.php
@@ -15,6 +15,7 @@
 use Drupal\Core\Utility\UnroutedUrlAssemblerInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
 
 /**
  * Defines an object that holds information about a URL.
@@ -196,9 +197,15 @@ public static function fromRouteMatch(RouteMatchInterface $route_match) {
    * base://robots.txt. For URLs that have Drupal routes (that is, most pages
    * generated by Drupal), use Url::fromRoute().
    *
+   * For resolving URLs to an entity, you may use the
+   * entity://{entity_type}/{entity_id} scheme. For example entity://node/1
+   * would resolve to the entity.node.canonical route with a node parameter of
+   * one.
+   *
    * @param string $uri
    *   The URI of the external resource including the scheme. For Drupal paths
    *   that are not handled by the routing system, use base:// for the scheme.
+   *   For entity URLs you may use entity://{entity_type}/{entity_id}
    * @param array $options
    *   (optional) An associative array of additional URL options, with the
    *   following elements:
@@ -217,7 +224,7 @@ public static function fromRouteMatch(RouteMatchInterface $route_match) {
    *     respectively. TRUE enforces HTTPS and FALSE enforces HTTP.
    *
    * @return \Drupal\Core\Url
-   *   A new Url object for an unrouted (non-Drupal) URL.
+   *   A new Url object for an unrouted (non-Drupal) URL or a routed entity URI.
    *
    * @throws \InvalidArgumentException
    *   Thrown when the passed in path has no scheme.
@@ -225,17 +232,51 @@ public static function fromRouteMatch(RouteMatchInterface $route_match) {
    * @see static::fromRoute()
    */
   public static function fromUri($uri, $options = array()) {
-    if (!parse_url($uri, PHP_URL_SCHEME)) {
+    if (!($scheme = parse_url($uri, PHP_URL_SCHEME))) {
       throw new \InvalidArgumentException(String::format('The URI "@uri" is invalid. You must use a valid URI scheme. Use base:// for a path, e.g., to a Drupal file that needs the base path. Do not use this for internal paths controlled by Drupal.', ['@uri' => $uri]));
     }
 
+    // Handle entity URL's specially. Convert these links to a canonical route
+    // for the entity and construct the Url object.
+    if ($scheme == 'entity') {
+      return self::fromEntityUri($uri);
+    }
+
     $url = new static($uri, array(), $options);
     $url->setUnrouted();
-
     return $url;
   }
 
   /**
+   * Create a new Url object for entity URL's.
+   *
+   * @param string $uri
+   *   URL's of format entity://{entity_type}/{entity_id}.
+   *
+   * @return \Drupal\Core\Url
+   *   A new Url object for an entity's canonical route.
+   */
+  protected static function fromEntityUri($uri) {
+    $uri_parts = parse_url($uri);
+    $entity_type_id = $uri_parts['host'];
+    $entity_id = trim($uri_parts['path'], '/');
+    if ($uri_parts['scheme'] != 'entity' || $entity_id === '') {
+      throw new \InvalidArgumentException(String::format('The entity URI "@uri" is invalid. You must specify the entity id in the URL. e.g., entity://node/1 for loading the canonical path to node entity with id 1.',
+        ['@uri' => $uri]));
+    }
+
+    $canonical_route = "entity.$entity_type_id.canonical";
+    $routes = \Drupal::service('router.route_provider')
+      ->getRoutesByNames([$canonical_route]);
+    if (empty($routes)) {
+      throw new RouteNotFoundException(String::format('Could not find the canonical route "@canonical_route" for entity URL "@uri".',
+        ['@uri' => $uri, '@canonical_route' => $canonical_route]));
+    }
+
+    return new static($canonical_route, [$entity_type_id => $entity_id]);
+  }
+
+  /**
    * Returns the Url object matching a request.
    *
    * SECURITY NOTE: The request path is not checked to be valid and accessible
diff --git a/core/tests/Drupal/Tests/Core/UrlTest.php b/core/tests/Drupal/Tests/Core/UrlTest.php
index a93226a..21540b7 100644
--- a/core/tests/Drupal/Tests/Core/UrlTest.php
+++ b/core/tests/Drupal/Tests/Core/UrlTest.php
@@ -44,6 +44,13 @@ class UrlTest extends UnitTestCase {
   protected $router;
 
   /**
+   * The route provider.
+   *
+   * @var \Drupal\Tests\Core\Routing\TestRouterInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $routeProvider;
+
+  /**
    * An array of values to use for the test.
    *
    * @var array
@@ -51,6 +58,13 @@ class UrlTest extends UnitTestCase {
   protected $map;
 
   /**
+   * The entity storage.
+   *
+   * @var \Drupal\Core\Entity\EntityStorageInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $entityStorage;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
@@ -68,8 +82,11 @@ protected function setUp() {
       ->will($this->returnValueMap($this->map));
 
     $this->router = $this->getMock('Drupal\Tests\Core\Routing\TestRouterInterface');
+    $this->routeProvider = $this->getMock('Symfony\Cmf\Component\Routing\RouteProviderInterface');
+
     $this->container = new ContainerBuilder();
     $this->container->set('router.no_access_checks', $this->router);
+    $this->container->set('router.route_provider', $this->routeProvider);
     $this->container->set('url_generator', $this->urlGenerator);
     \Drupal::setContainer($this->container);
   }
@@ -418,6 +435,36 @@ public function testFromRouteMatch() {
   }
 
   /**
+   * Tests the fromUri() method with an entity:// URI.
+   *
+   * @covers ::fromUri
+   */
+  public function testEntityUris() {
+    $map = [];
+    $map[] = [['entity.test_entity.canonical'], ['test_entity/1']];
+
+    $this->routeProvider->expects($this->any())
+      ->method('getRoutesByNames')
+      ->will($this->returnValueMap($map));
+
+    $uri = 'entity://test_entity/1';
+    $url = Url::fromUri($uri);
+    $this->assertSame('entity.test_entity.canonical', $url->getRouteName());
+    $this->assertEquals(['test_entity' => '1'], $url->getRouteParameters());
+  }
+
+  /**
+   * Tests the fromUri() method with an invalid entity:// URI.
+   *
+   * @covers ::fromUri
+   * @expectedException \Symfony\Component\Routing\Exception\RouteNotFoundException
+   */
+  public function testInvalidEntityUris() {
+    $uri = 'entity://invalid_entity/1';
+    Url::fromUri($uri);
+  }
+
+  /**
    * Creates a mock access manager for the access tests.
    *
    * @param bool $access
