diff --git a/core/modules/jsonapi/tests/src/Functional/MenuLinkContentTest.php b/core/modules/jsonapi/tests/src/Functional/MenuLinkContentTest.php
index 09935427d1..3b5a678405 100644
--- a/core/modules/jsonapi/tests/src/Functional/MenuLinkContentTest.php
+++ b/core/modules/jsonapi/tests/src/Functional/MenuLinkContentTest.php
@@ -95,6 +95,7 @@ protected function getExpectedDocument() {
           'bundle' => 'menu_link_content',
           'link' => [
             'uri' => 'https://nl.wikipedia.org/wiki/Llama',
+            'url' => 'https://nl.wikipedia.org/wiki/Llama',
             'title' => NULL,
             'options' => [],
           ],
diff --git a/core/modules/jsonapi/tests/src/Functional/ShortcutTest.php b/core/modules/jsonapi/tests/src/Functional/ShortcutTest.php
index 9fc53b988e..4bd8b17c8b 100644
--- a/core/modules/jsonapi/tests/src/Functional/ShortcutTest.php
+++ b/core/modules/jsonapi/tests/src/Functional/ShortcutTest.php
@@ -76,6 +76,8 @@ protected function createEntity() {
    */
   protected function getExpectedDocument() {
     $self_url = Url::fromUri('base:/jsonapi/shortcut/default/' . $this->entity->uuid())->setAbsolute()->toString(TRUE)->getGeneratedUrl();
+    $uri = 'internal:/user/logout';
+    $url = Url::fromUri($uri);
     return [
       'jsonapi' => [
         'meta' => [
@@ -97,7 +99,8 @@ protected function getExpectedDocument() {
         'attributes' => [
           'title' => 'Comments',
           'link' => [
-            'uri' => 'internal:/user/logout',
+            'uri' => $uri,
+            'url' => $url->toString(),
             'title' => NULL,
             'options' => [],
           ],
diff --git a/core/modules/link/src/Plugin/DataType/LinkUrlComputed.php b/core/modules/link/src/Plugin/DataType/LinkUrlComputed.php
new file mode 100644
index 0000000000..6f0063e009
--- /dev/null
+++ b/core/modules/link/src/Plugin/DataType/LinkUrlComputed.php
@@ -0,0 +1,37 @@
+<?php
+
+namespace Drupal\link\Plugin\DataType;
+
+use Drupal\Core\TypedData\Plugin\DataType\Uri;
+
+/**
+ * Defines a data type for a link URL.
+ *
+ * @DataType(
+ *   id = "link_url",
+ *   label = @Translation("Link URL")
+ * )
+ */
+class LinkUrlComputed extends Uri {
+
+  /**
+   * Cached generated URL.
+   *
+   * @var string|null
+   */
+  protected $processed = NULL;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getValue() {
+    if ($this->processed !== NULL) {
+      return $this->processed;
+    }
+    $item = $this->getParent();
+    $this->processed = $item->getUrl()->toString();
+
+    return $this->processed;
+  }
+
+}
diff --git a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
index 373c3f03ad..cb7155550d 100644
--- a/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
+++ b/core/modules/link/src/Plugin/Field/FieldType/LinkItem.php
@@ -43,6 +43,13 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
     $properties['uri'] = DataDefinition::create('uri')
       ->setLabel(t('URI'));
 
+    $properties['url'] = DataDefinition::create('link_url')
+      ->setLabel(t('URL'))
+      ->setDescription(t('The processed URL for this link that can e.g. be used in in href attributes.'))
+      ->setComputed(TRUE)
+      ->setInternal(FALSE)
+      ->setReadOnly(TRUE);
+
     $properties['title'] = DataDefinition::create('string')
       ->setLabel(t('Link text'));
 
diff --git a/core/modules/menu_link_content/tests/src/Functional/Rest/MenuLinkContentResourceTestBase.php b/core/modules/menu_link_content/tests/src/Functional/Rest/MenuLinkContentResourceTestBase.php
index 7e3a86ec20..039198c845 100644
--- a/core/modules/menu_link_content/tests/src/Functional/Rest/MenuLinkContentResourceTestBase.php
+++ b/core/modules/menu_link_content/tests/src/Functional/Rest/MenuLinkContentResourceTestBase.php
@@ -61,6 +61,7 @@ protected function createEntity() {
       'description' => 'Llama Gabilondo',
       'link' => [
         'uri' => 'https://nl.wikipedia.org/wiki/Llama',
+        'url' => 'https://nl.wikipedia.org/wiki/Llama#a-fragment',
         'options' => [
           'fragment' => 'a-fragment',
           'attributes' => [
@@ -89,6 +90,7 @@ protected function getNormalizedPostEntity() {
       'link' => [
         [
           'uri' => 'http://www.urbandictionary.com/define.php?term=drama%20llama',
+          'url' => 'http://www.urbandictionary.com/define.php?term=drama%20llama',
           'options' => [
             'fragment' => 'a-fragment',
             'attributes' => [
@@ -133,6 +135,7 @@ protected function getExpectedNormalizedEntity() {
       'link' => [
         [
           'uri' => 'https://nl.wikipedia.org/wiki/Llama',
+          'url' => 'https://nl.wikipedia.org/wiki/Llama#a-fragment',
           'title' => NULL,
           'options' => [
             'fragment' => 'a-fragment',
diff --git a/core/modules/shortcut/tests/src/Functional/Rest/ShortcutResourceTestBase.php b/core/modules/shortcut/tests/src/Functional/Rest/ShortcutResourceTestBase.php
index 1f588a2500..459295084f 100644
--- a/core/modules/shortcut/tests/src/Functional/Rest/ShortcutResourceTestBase.php
+++ b/core/modules/shortcut/tests/src/Functional/Rest/ShortcutResourceTestBase.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Tests\shortcut\Functional\Rest;
 
+use Drupal\Core\Url;
 use Drupal\shortcut\Entity\Shortcut;
 use Drupal\shortcut\Entity\ShortcutSet;
 use Drupal\Tests\rest\Functional\EntityResource\EntityResourceTestBase;
@@ -72,6 +73,11 @@ protected function createEntity() {
    * {@inheritdoc}
    */
   protected function getExpectedNormalizedEntity() {
+    $uri = 'internal:/admin/content/comment';
+    $uri_options = [
+      'fragment' => 'new',
+    ];
+    $url = Url::fromUri($uri, $uri_options);
     return [
       'uuid' => [
         [
@@ -97,11 +103,10 @@ protected function getExpectedNormalizedEntity() {
       ],
       'link' => [
         [
-          'uri' => 'internal:/admin/content/comment',
+          'uri' => $uri,
+          'url' => $url->toString(),
           'title' => NULL,
-          'options' => [
-            'fragment' => 'new',
-          ],
+          'options' => $uri_options,
         ],
       ],
       'weight' => [
