diff --git a/core/core.services.yml b/core/core.services.yml
index f5ed5db..81cd11f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -819,6 +819,16 @@ services:
       - { name: path_processor_inbound, priority: 200 }
       - { name: path_processor_outbound, priority: 200 }
     arguments: ['@config.factory']
+  path_processor_none:
+    class: Drupal\Core\PathProcessor\PathProcessorNone
+    tags:
+      - { name: path_processor_outbound, priority: 200 }
+    arguments: ['@config.factory']
+  path_processor_current:
+    class: Drupal\Core\PathProcessor\PathProcessorCurrent
+    tags:
+      - { name: path_processor_outbound, priority: 200 }
+    arguments: ['@config.factory']
   path_processor_alias:
     class: Drupal\Core\PathProcessor\PathProcessorAlias
     tags:
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index d102559..b39663c 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -188,6 +188,16 @@ public static function request() {
   }
 
   /**
+   * Retrives the request stack.
+   *
+   * @return \Symfony\Component\HttpFoundation\RequestStack
+   *   The request stack
+   */
+  public static function requestStack() {
+    return static::$container->get('request_stack');
+  }
+
+  /**
    * Retrieves the currently active route match object.
    *
    * @return \Drupal\Core\Routing\RouteMatchInterface
diff --git a/core/lib/Drupal/Core/PathProcessor/PathProcessorCurrent.php b/core/lib/Drupal/Core/PathProcessor/PathProcessorCurrent.php
new file mode 100644
index 0000000..8931462
--- /dev/null
+++ b/core/lib/Drupal/Core/PathProcessor/PathProcessorCurrent.php
@@ -0,0 +1,31 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\PathProcessor\PathProcessorCurrent.
+ */
+
+namespace Drupal\Core\PathProcessor;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Provides a path processor to replace <current>.
+ */
+class PathProcessorCurrent implements OutboundPathProcessorInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processOutbound($path, &$options = array(), Request $request = NULL) {
+    if ($path == '%3Ccurrent%3E' && $request) {
+      $request_uri = $request->getRequestUri();
+
+      $current_base_path = $request->getBasePath() . '/';
+      return substr($request_uri, strlen($current_base_path));
+    }
+    return $path;
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/PathProcessor/PathProcessorNone.php b/core/lib/Drupal/Core/PathProcessor/PathProcessorNone.php
new file mode 100644
index 0000000..2808ed1
--- /dev/null
+++ b/core/lib/Drupal/Core/PathProcessor/PathProcessorNone.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\PathProcessor\PathProcessorNone.
+ */
+
+namespace Drupal\Core\PathProcessor;
+
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Provides a path processor to replace <none>.
+ */
+class PathProcessorNone implements OutboundPathProcessorInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function processOutbound($path, &$options = array(), Request $request = NULL) {
+    if ($path == '%3Cnone%3E') {
+      return '';
+    }
+    return $path;
+  }
+
+}
diff --git a/core/modules/contact/contact.module b/core/modules/contact/contact.module
index f1dfca7..90fb153 100644
--- a/core/modules/contact/contact.module
+++ b/core/modules/contact/contact.module
@@ -97,7 +97,7 @@ function contact_mail($key, &$message, $params) {
     '!site-name' => \Drupal::config('system.site')->get('name'),
     '!subject' => $contact_message->getSubject(),
     '!form' => !empty($params['contact_form']) ? $params['contact_form']->label() : NULL,
-    '!form-url' => url(current_path(), array('absolute' => TRUE, 'language' => $language)),
+    '!form-url' => \Drupal::url('<current>', [], ['absolute' => TRUE, 'language' => $language]),
     '!sender-name' => user_format_name($sender),
   );
   if ($sender->isAuthenticated()) {
diff --git a/core/modules/locale/tests/modules/locale_test/locale_test.module b/core/modules/locale/tests/modules/locale_test/locale_test.module
index d9fd382..ee5e7bf 100644
--- a/core/modules/locale/tests/modules/locale_test/locale_test.module
+++ b/core/modules/locale/tests/modules/locale_test/locale_test.module
@@ -49,7 +49,7 @@ function locale_test_locale_translation_projects_alter(&$projects) {
 
     // Instead of the default ftp.drupal.org we use the file system of the test
     // instance to simulate a remote file location.
-    $url = url(NULL, array('absolute' => TRUE));
+    $url = \Drupal::url('<none>', [], ['absolute' => TRUE]);
     $remote_url = $url . PublicStream::basePath() . '/remote/';
 
     // Completely replace the project data with a set of test projects.
diff --git a/core/modules/node/src/Controller/NodeController.php b/core/modules/node/src/Controller/NodeController.php
index 2990324..bf3a7c7 100644
--- a/core/modules/node/src/Controller/NodeController.php
+++ b/core/modules/node/src/Controller/NodeController.php
@@ -62,6 +62,8 @@ public static function create(ContainerInterface $container) {
   public function addPage() {
     $content = array();
 
+    debug(\Drupal::url('<current>'));
+
     // Only use node types the user has access to.
     foreach ($this->entityManager()->getStorage('node_type')->loadMultiple() as $type) {
       if ($this->entityManager()->getAccessControlHandler('node')->createAccess($type->type)) {
diff --git a/core/modules/system/src/Tests/PathProcessor/PathProcessorCurrentIntegrationTest.php b/core/modules/system/src/Tests/PathProcessor/PathProcessorCurrentIntegrationTest.php
new file mode 100644
index 0000000..74388ed
--- /dev/null
+++ b/core/modules/system/src/Tests/PathProcessor/PathProcessorCurrentIntegrationTest.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\PathProcessor\PathProcessorIntegrationTest.
+ */
+
+namespace Drupal\system\Tests\PathProcessor;
+
+use Drupal\simpletest\KernelTestBase;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * @see \Drupal\Core\PathProcessor\PathProcessorCurrent
+ * @group path_processor
+ */
+class PathProcessorCurrentIntegrationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', ['router']);
+    \Drupal::service('router.builder')->rebuild();
+  }
+
+  /**
+   * Tests the output process.
+   */
+  public function testProcessOutbound() {
+    $request_stack = \Drupal::requestStack();
+    /** @var \Symfony\Component\Routing\RequestContext $request_context */
+    $request_context = \Drupal::service('router.request_context');
+
+    // Test request with subdir on homepage.
+    $server = [
+      'SCRIPT_NAME' => '/subdir/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/subdir', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/subdir/', \Drupal::url('<current>'));
+
+    // Test request with subdir on other page.
+    $server = [
+      'SCRIPT_NAME' => '/subdir/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/subdir/node/add', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/subdir/node/add', \Drupal::url('<current>'));
+
+    // Test request without subdir on the homepage.
+    $server = [
+      'SCRIPT_NAME' => '/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/', \Drupal::url('<current>'));
+
+    // Test request without subdir on other page.
+    $server = [
+      'SCRIPT_NAME' => '/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/node/add', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/node/add', \Drupal::url('<current>'));
+  }
+
+}
diff --git a/core/modules/system/src/Tests/PathProcessor/PathProcessorNoneIntegrationTest.php b/core/modules/system/src/Tests/PathProcessor/PathProcessorNoneIntegrationTest.php
new file mode 100644
index 0000000..354131a
--- /dev/null
+++ b/core/modules/system/src/Tests/PathProcessor/PathProcessorNoneIntegrationTest.php
@@ -0,0 +1,91 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\PathProcessor\PathProcessorNoneIntegrationTest.
+ */
+
+namespace Drupal\system\Tests\PathProcessor;
+
+use Drupal\simpletest\KernelTestBase;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * @see \Drupal\Core\PathProcessor\PathProcessorNone
+ * @group path_processor
+ */
+class PathProcessorNoneIntegrationTest extends KernelTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  public static $modules = ['system'];
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', ['router']);
+    \Drupal::service('router.builder')->rebuild();
+  }
+
+  /**
+   * Tests the output process.
+   */
+  public function testProcessOutbound() {
+    $request_stack = \Drupal::requestStack();
+    /** @var \Symfony\Component\Routing\RequestContext $request_context */
+    $request_context = \Drupal::service('router.request_context');
+
+    // Test request with subdir on homepage.
+    $server = [
+      'SCRIPT_NAME' => '/subdir/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/subdir', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/subdir/', \Drupal::url('<none>'));
+    $this->assertEqual('/subdir/#test-fragment', \Drupal::url('<none>', [], ['fragment' => 'test-fragment']));
+
+    // Test request with subdir on other page.
+    $server = [
+      'SCRIPT_NAME' => '/subdir/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/subdir/node/add', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/subdir/', \Drupal::url('<none>'));
+    $this->assertEqual('/subdir/#test-fragment', \Drupal::url('<none>', [], ['fragment' => 'test-fragment']));
+
+    // Test request without subdir on the homepage.
+    $server = [
+      'SCRIPT_NAME' => '/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/', \Drupal::url('<none>'));
+    $this->assertEqual('/#test-fragment', \Drupal::url('<none>', [], ['fragment' => 'test-fragment']));
+
+    // Test request without subdir on other page.
+    $server = [
+      'SCRIPT_NAME' => '/index.php',
+      'SCRIPT_FILENAME' => DRUPAL_ROOT . '/index.php',
+      'SERVER_NAME' => 'http://www.example.com',
+    ];
+    $request = Request::create('/node/add', 'GET', [], [], [], $server);
+    $request_stack->push($request);
+    $request_context->fromRequest($request);
+    $this->assertEqual('/', \Drupal::url('<none>'));
+    $this->assertEqual('/#test-fragment', \Drupal::url('<none>', [], ['fragment' => 'test-fragment']));
+  }
+
+}
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 6df0e0c..c2446d6 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -352,6 +352,12 @@ system.theme_settings_theme:
   requirements:
     _access: 'TRUE'
 
+'<none>':
+  path: '<none>'
+
+'<current>':
+  path: '<current>'
+
 system.modules_uninstall:
   path: '/admin/modules/uninstall'
   defaults:
diff --git a/core/tests/Drupal/Tests/Core/DrupalTest.php b/core/tests/Drupal/Tests/Core/DrupalTest.php
index 5af3c73..4ca6f09 100644
--- a/core/tests/Drupal/Tests/Core/DrupalTest.php
+++ b/core/tests/Drupal/Tests/Core/DrupalTest.php
@@ -8,6 +8,7 @@
 namespace Drupal\Tests\Core;
 
 use Drupal\Tests\UnitTestCase;
+use Symfony\Component\HttpFoundation\RequestStack;
 
 /**
  * Tests the Drupal class.
@@ -132,6 +133,18 @@ public function testQueue() {
   }
 
   /**
+   * Tests the testRequestStack() method.
+   *
+   * @covers ::requestStack
+   */
+  public function testRequestStack() {
+    $request_stack = new RequestStack();
+    $this->setMockContainerService('request_stack', $request_stack);
+
+    $this->assertSame($request_stack, \Drupal::requestStack());
+  }
+
+  /**
    * Tests the keyValue() method.
    */
   public function testKeyValue() {
