diff --git a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
index 23eccf2..8f85081 100644
--- a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
+++ b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
@@ -1369,6 +1369,43 @@ protected function renderAsLink($alter, $text, $tokens) {
     ];
 
     $path = $alter['path'];
+    // strip_tags() and viewsTokenReplace remove <front>, so check whether it's
+    // different to front.
+    if ($path != '<front>') {
+      // Use strip_tags as there should never be HTML in the path.
+      // However, we need to preserve special characters like " that were
+      // removed by SafeMarkup::checkPlain().
+      $path = Html::decodeEntities($this->viewsTokenReplace($alter['path'], $tokens));
+
+      // Tokens might contain <front>, so check for <front> again.
+      if ($path != '<front>') {
+        $path = strip_tags($path);
+      }
+
+      // Tokens might have resolved URL's, as is the case for tokens provided by
+      // Link fields, so all internal paths will be prefixed by base_path(). For
+      // proper further handling reset this to internal:/.
+      if (strpos($path, base_path()) === 0) {
+        $path = str_replace(base_path(), 'internal:/', $path);
+      }
+
+      // If we have no $path and no $alter['url'], we have nothing to work with,
+      // so we just return the text.
+      if (empty($path) && empty($alter['url'])) {
+        return $text;
+      }
+
+      // If no scheme is provided in the $path, assign the default 'http://'.
+      // This allows a url of 'www.example.com' to be converted to
+      // 'http://www.example.com'.
+      // Only do this when flag for external has been set, $path doesn't contain
+      // a scheme and $path doesn't have a leading /.
+      if ($alter['external'] && !parse_url($path, PHP_URL_SCHEME) && strpos($path, '/') !== 0) {
+        // There is no scheme, add the default 'http://' to the $path.
+        $path = "http://" . $path;
+      }
+    }
+
     if (empty($alter['url'])) {
       if (!parse_url($path, PHP_URL_SCHEME)) {
         // @todo Views should expect and store a leading /. See
@@ -1384,28 +1421,12 @@ protected function renderAsLink($alter, $text, $tokens) {
 
     $path = $alter['url']->setOptions($options)->toUriString();
 
-    // strip_tags() removes <front>, so check whether its different to front.
-    if ($path != 'route:<front>') {
-      // Unescape Twig delimiters that may have been escaped by the
-      // Url::toUriString() call above, because we support twig tokens in
-      // rewrite settings of views fields.
-      // In that case the original path looks like
-      // internal:/admin/content/files/usage/{{ fid }}, which will be escaped by
-      // the toUriString() call above.
-      $path = preg_replace(['/(\%7B){2}(\%20)*/', '/(\%20)*(\%7D){2}/'], ['{{','}}'], $path);
-
-      // Use strip tags as there should never be HTML in the path.
-      // However, we need to preserve special characters like " that are escaped
-      // by \Drupal\Component\Utility\Html::escape().
-      $path = strip_tags(Html::decodeEntities($this->viewsTokenReplace($path, $tokens)));
-
-      if (!empty($alter['path_case']) && $alter['path_case'] != 'none' && !$alter['url']->isRouted()) {
-        $path = str_replace($alter['path'], $this->caseTransform($alter['path'], $this->options['alter']['path_case']), $path);
-      }
+    if (!empty($alter['path_case']) && $alter['path_case'] != 'none' && !$alter['url']->isRouted()) {
+      $path = str_replace($alter['path'], $this->caseTransform($alter['path'], $this->options['alter']['path_case']), $path);
+    }
 
-      if (!empty($alter['replace_spaces'])) {
-        $path = str_replace(' ', '-', $path);
-      }
+    if (!empty($alter['replace_spaces'])) {
+      $path = str_replace(' ', '-', $path);
     }
 
     // Parse the URL and move any query and fragment parameters out of the path.
@@ -1427,19 +1448,6 @@ protected function renderAsLink($alter, $text, $tokens) {
     // $path now so we don't get query strings or fragments in the path.
     $path = $url['path'];
 
-    // If no scheme is provided in the $path, assign the default 'http://'.
-    // This allows a url of 'www.example.com' to be converted to 'http://www.example.com'.
-    // Only do this on for external URLs.
-    if ($alter['external']) {
-      if (!isset($url['scheme'])) {
-        // There is no scheme, add the default 'http://' to the $path.
-        // Use the original $alter['path'] instead of the parsed version.
-        $path = "http://" . $alter['path'];
-        // Reset the $url array to include the new scheme.
-        $url = UrlHelper::parse($path);
-      }
-    }
-
     if (isset($url['query'])) {
       // Remove query parameters that were assigned a query string replacement
       // token for which there is no value available.
diff --git a/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php b/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php
index 9dfbb06..3f100c6 100644
--- a/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php
+++ b/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php
@@ -5,7 +5,7 @@
  * Contains \Drupal\Tests\views\Unit\Plugin\field\FieldPluginBaseTest.
  */
 
-namespace Drupal\Tests\views\Unit\Plugin\field;
+namespace Drupal\Tests\views\Unit\Plugin\field {
 
 use Drupal\Core\GeneratedUrl;
 use Drupal\Core\Language\Language;
@@ -296,6 +296,10 @@ public function providerTestRenderAsLinkWithPathAndOptions() {
     // External URL.
     $data[] = ['https://www.drupal.org', [], [], '<a href="https://www.drupal.org">value</a>'];
 
+    $data[] = ['www.drupal.org', ['external' => TRUE], [], '<a href="http://www.drupal.org">value</a>'];
+
+    $data[] = ['', ['external' => TRUE], [], 'value'];
+
     return $data;
   }
 
@@ -451,7 +455,12 @@ public function testRenderAsLinkWithPathAndTokens($path, $tokens, $link_html) {
     $alter = [
       'make_link' => TRUE,
       'path' => $path,
+      'url' => '',
     ];
+    if ($link_html == 'external') {
+      $alter['external'] = TRUE;
+      $link_html = 'value';
+    }
 
     $this->setUpUrlIntegrationServices();
     $this->setupDisplayWithEmptyArgumentsAndFields();
@@ -460,17 +469,45 @@ public function testRenderAsLinkWithPathAndTokens($path, $tokens, $link_html) {
     $field->field_alias = 'key';
     $row = new ResultRow(['key' => 'value']);
 
-    $build =[
-      '#type' => 'inline_template',
-      '#template' => 'base:test-path/' . explode('/', $path)[1],
-      '#context' => ['foo' => 123],
-      '#post_render' => [function() {}],
-    ];
-
-    $this->renderer->expects($this->once())
-      ->method('renderPlain')
-      ->with($build)
-      ->willReturn('base:test-path/123');
+    if (!empty(explode('/', $path)[1])) {
+      $build = [
+        '#type' => 'inline_template',
+        '#template' => 'test-path/' . explode('/', $path)[1],
+        '#context' => ['foo' => 123],
+        '#post_render' => [function() {}],
+      ];
+
+      $this->renderer->expects($this->once())
+        ->method('renderPlain')
+        ->with($build)
+        ->willReturn('test-path/123');
+    }
+    elseif ($link_html == 'value') {
+      $build = [
+        '#type' => 'inline_template',
+        '#template' => $path,
+        '#context' => ['foo' => ''],
+        '#post_render' => [function() {}],
+      ];
+
+      $this->renderer->expects($this->once())
+        ->method('renderPlain')
+        ->with($build)
+        ->willReturn('');
+    }
+    else {
+      $build = [
+        '#type' => 'inline_template',
+        '#template' => $path,
+        '#context' => ['foo' => 'http://www.drupal.org'],
+        '#post_render' => [function() {}],
+      ];
+
+      $this->renderer->expects($this->once())
+        ->method('renderPlain')
+        ->with($build)
+        ->willReturn('http://www.drupal.org');
+    }
 
     $result = $field->advancedRender($row);
     $this->assertEquals($link_html, $result);
@@ -497,6 +534,9 @@ public function providerTestRenderAsLinkWithPathAndTokens() {
     $data[] = ['test-path/{{  foo }}', $tokens, $link_html];
     $data[] = ['test-path/{{ foo  }}', $tokens, $link_html];
     $data[] = ['test-path/{{  foo  }}', $tokens, $link_html];
+    $data[] = ['{{ foo }}', ['{{ foo }}' => 'http://www.drupal.org'], '<a href="http://www.drupal.org">value</a>'];
+    $data[] = ['{{ foo }}', ['{{ foo }}' => ''], 'value'];
+    $data[] = ['{{ foo }}', ['{{ foo }}' => ''], 'external'];
 
     return $data;
   }
@@ -586,3 +626,14 @@ public function setLinkGenerator(LinkGeneratorInterface $link_generator) {
   }
 
 }
+
+}
+
+// @todo Remove as part of https://www.drupal.org/node/2529170.
+namespace {
+  if (!function_exists('base_path')) {
+    function base_path() {
+      return '/';
+    }
+  }
+}
