diff --git a/core/lib/Drupal/Core/Url.php b/core/lib/Drupal/Core/Url.php
index 999f447..894c089 100644
--- a/core/lib/Drupal/Core/Url.php
+++ b/core/lib/Drupal/Core/Url.php
@@ -267,6 +267,32 @@ public static function createFromRequest(Request $request) {
   }
 
   /**
+   * Returns the Url object matching an entity URI.
+   *
+   * An entity URI is of the format entity://{entity_type}/{id}. It can be used
+   * to maintain a reference to an entity, regardless of route or path.
+   *
+   * @param string $uri
+   *   An entity URI in the format entity://{entity_type}/{id}
+   *
+   * @return \Drupal\Core\Url
+   *   A new Url object for a referenced entity.
+   *
+   * @throws \InvalidArgumentException
+   *   Thrown when the passed in URI is not a valid entity URI.
+   */
+  public static function fromEntityUri($uri) {
+    if (strpos($uri, 'entity://') === 0) {
+      list(, $entity_path) = explode('entity://', $uri, 2);
+      list($entity_type, $id) = explode('/', $entity_path);
+      return new Url("entity.{$entity_type}.canonical", [$entity_type => $id]);
+    }
+    else {
+      throw new \InvalidArgumentException(String::format('The URI "@uri" is an invalid entity uri. You must use the format entity://{entity_type}/{id}.', ['@uri' => $uri]));
+    }
+  }
+
+  /**
    * Sets this Url to encapsulate an unrouted URI.
    *
    * @return $this
diff --git a/core/tests/Drupal/Tests/Core/UrlTest.php b/core/tests/Drupal/Tests/Core/UrlTest.php
index a93226a..cfdf60d 100644
--- a/core/tests/Drupal/Tests/Core/UrlTest.php
+++ b/core/tests/Drupal/Tests/Core/UrlTest.php
@@ -444,6 +444,16 @@ public function accessProvider() {
     );
   }
 
+  /**
+   * Tests the fromEntityUri() method.
+   */
+  public function testFromEntityUri() {
+    $uri = 'entity://test_entity/1';
+    $url = Url::fromEntityUri($uri);
+    $this->assertSame('entity.test_entity.canonical', $url->getRouteName());
+    $this->assertEquals(['test_entity' => '1'] , $url->getRouteParameters());
+  }
+
 }
 
 class TestUrl extends Url {
