diff --git a/core/lib/Drupal/Core/GeneratedNoLink.php b/core/lib/Drupal/Core/GeneratedNoLink.php
new file mode 100644
index 0000000..550c904
--- /dev/null
+++ b/core/lib/Drupal/Core/GeneratedNoLink.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\GeneratedNoLink.
+ */
+
+namespace Drupal\Core;
+
+/**
+ * This class holds a <span> generated from the <nolink> route.
+ */
+class GeneratedNoLink extends GeneratedLink {
+
+}
diff --git a/core/lib/Drupal/Core/Utility/LinkGenerator.php b/core/lib/Drupal/Core/Utility/LinkGenerator.php
index bdf2607..3969f71 100644
--- a/core/lib/Drupal/Core/Utility/LinkGenerator.php
+++ b/core/lib/Drupal/Core/Utility/LinkGenerator.php
@@ -12,6 +12,7 @@
 use Drupal\Component\Render\MarkupInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\GeneratedLink;
+use Drupal\Core\GeneratedNoLink;
 use Drupal\Core\Link;
 use Drupal\Core\Render\RendererInterface;
 use Drupal\Core\Routing\UrlGeneratorInterface;
@@ -147,16 +148,22 @@ public function generate($text, Url $url) {
     $this->moduleHandler->alter('link', $variables);
 
     // Move attributes out of options since generateFromRoute() doesn't need
-    // them. Include a placeholder for the href.
+    // them. Make sure the "href" comes first for testing purposes.
     $attributes = array('href' => '') + $variables['options']['attributes'];
     unset($variables['options']['attributes']);
     $url->setOptions($variables['options']);
 
+    $tag = 'a';
     // External URLs can not have cacheable metadata.
     if ($url->isExternal()) {
       $generated_link = new GeneratedLink();
       $attributes['href'] = $url->toString(FALSE);
     }
+    elseif ($url->isRouted() && $url->getRouteName() === '<nolink>') {
+      $tag = 'span';
+      $generated_link = new GeneratedNoLink();
+      unset($attributes['href']);
+    }
     else {
       $generated_url = $url->toString(TRUE);
       $generated_link = GeneratedLink::createFromObject($generated_url);
@@ -171,7 +178,7 @@ public function generate($text, Url $url) {
     $attributes = new Attribute($attributes);
     // This is safe because Attribute does escaping and $variables['text'] is
     // either rendered or escaped.
-    return $generated_link->setGeneratedLink('<a' . $attributes . '>' . $variables['text'] . '</a>');
+    return $generated_link->setGeneratedLink('<' . $tag . $attributes . '>' . $variables['text'] . '</' . $tag . '>');
   }
 
 }
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index ed111f8..63c4868 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -397,6 +397,13 @@ system.theme_settings_theme:
   requirements:
     _access: 'TRUE'
 
+'<nolink>':
+  path: ''
+  options:
+    _no_path: TRUE
+  requirements:
+    _access: 'TRUE'
+
 '<current>':
   path: '<current>'
 
diff --git a/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php b/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php
index e2ffb80..e806191 100644
--- a/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php
+++ b/core/tests/Drupal/Tests/Core/Utility/LinkGeneratorTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\Tests\Core\Utility {
 
 use Drupal\Component\Render\MarkupInterface;
+use Drupal\Core\GeneratedNoLink;
 use Drupal\Core\GeneratedUrl;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Link;
@@ -152,6 +153,26 @@ public function testGenerate() {
   }
 
   /**
+   * Tests the generate() method with the <nolink> route.
+   *
+   * @covers ::generate
+   */
+  public function testGenerateNoLink() {
+    $this->urlGenerator->expects($this->never())
+      ->method('generateFromRoute');
+    $this->moduleHandler->expects($this->once())
+      ->method('alter')
+      ->with('link', $this->isType('array'));
+
+    $url = Url::fromRoute('<nolink>');
+    $url->setUrlGenerator($this->urlGenerator);
+
+    $result = $this->linkGenerator->generate('Test', $url);
+    $this->assertTrue($result instanceof GeneratedNoLink);
+    $this->assertSame('<span>Test</span>', (string) $result);
+  }
+
+  /**
    * Tests the generate() method with an external URL.
    *
    * The set_active_class option is set to TRUE to ensure this does not cause
