diff --git a/core/core.services.yml b/core/core.services.yml
index 49557b8..9b607cd 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -59,6 +59,8 @@ services:
   cache.backend.php:
     class: Drupal\Core\Cache\PhpBackendFactory
     arguments: ['@cache_tags.invalidator.checksum']
+  cache.backend.memory:
+    class: Drupal\Core\Cache\MemoryBackendFactory
   cache.bootstrap:
     class: Drupal\Core\Cache\CacheBackendInterface
     tags:
@@ -557,6 +559,12 @@ services:
     arguments: ['@state']
     tags:
       - { name: event_subscriber }
+  router.cached_url_matcher:
+    class: Drupal\Core\Routing\CachedUrlMatcher
+    arguments: ['@cache.menu']
+    calls:
+      - [setContext, ['@router.request_context']]
+      - [setUrlMatcher, ['@router.no_access_checks']]
   entity.query:
     class: Drupal\Core\Entity\Query\QueryFactory
     arguments: ['@entity.manager']
@@ -748,6 +756,8 @@ services:
   access_manager:
     class: Drupal\Core\Access\AccessManager
     arguments: ['@router.route_provider', '@paramconverter_manager', '@access_arguments_resolver_factory', '@current_user', '@access_manager.check_provider']
+    calls:
+      - [setUrlMatcher, ['@router.cached_url_matcher']]
   access_manager.check_provider:
     class: Drupal\Core\Access\CheckProvider
     calls:
diff --git a/core/lib/Drupal/Core/Access/AccessManager.php b/core/lib/Drupal/Core/Access/AccessManager.php
index 576ffb7..2c036ad 100644
--- a/core/lib/Drupal/Core/Access/AccessManager.php
+++ b/core/lib/Drupal/Core/Access/AccessManager.php
@@ -17,6 +17,7 @@
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\Routing\Exception\RouteNotFoundException;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
 
 /**
  * Attaches access check services to routes and runs them on request.
@@ -60,6 +61,13 @@ class AccessManager implements AccessManagerInterface {
   protected $checkProvider;
 
   /**
+   * The URL matcher.
+   *
+   * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface
+   */
+  protected $urlMatcher;
+
+  /**
    * Constructs a AccessManager instance.
    *
    * @param \Drupal\Core\Routing\RouteProviderInterface $route_provider
@@ -85,7 +93,7 @@ public function __construct(RouteProviderInterface $route_provider, ParamConvert
    */
   public function checkNamedRoute($route_name, array $parameters = array(), AccountInterface $account = NULL, $return_as_object = FALSE) {
     try {
-      $route = $this->routeProvider->getRouteByName($route_name, $parameters);
+      $route = $this->routeProvider->getRouteByName($route_name);
 
       // ParamConverterManager relies on the route object being available
       // from the parameters array.
@@ -221,5 +229,27 @@ protected function performCheck($service_id, ArgumentsResolverInterface $argumen
     return $service_access;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function checkPath($path, AccountInterface $account = NULL, $return_as_object = FALSE) {
+    $path = '/' . ltrim($path, '/');
+    $attributes = $this->urlMatcher->match($path);
+    return $this->checkNamedRoute($attributes[RouteObjectInterface::ROUTE_NAME], $attributes, $account, $return_as_object);
+  }
+
+  /**
+   * Sets the cached url matcher.
+   *
+   * @param \Symfony\Component\Routing\Matcher\UrlMatcherInterface $url_matcher
+   *   The url matcher.
+   *
+   * @return $this
+   */
+  public function setUrlMatcher(UrlMatcherInterface $url_matcher) {
+    $this->urlMatcher = $url_matcher;
+
+    return $this;
+  }
 
 }
diff --git a/core/lib/Drupal/Core/Access/AccessManagerInterface.php b/core/lib/Drupal/Core/Access/AccessManagerInterface.php
index 206a801..9dbabc1 100644
--- a/core/lib/Drupal/Core/Access/AccessManagerInterface.php
+++ b/core/lib/Drupal/Core/Access/AccessManagerInterface.php
@@ -100,4 +100,17 @@ public function checkRequest(Request $request, AccountInterface $account = NULL,
    */
   public function check(RouteMatchInterface $route_match, AccountInterface $account = NULL, Request $request = NULL, $return_as_object = FALSE);
 
+  /**
+   * Checks access for a given path.
+   *
+   * @param string $path
+   *   The path.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   (optional) Run access checks for this account. Defaults to the current
+   *   user.
+   * @param bool $return_as_object
+   *   (optional) Defaults to FALSE.
+   */
+  public function checkPath($path, AccountInterface $account = NULL, $return_as_object = FALSE);
+
 }
diff --git a/core/lib/Drupal/Core/Routing/CachedUrlMatcher.php b/core/lib/Drupal/Core/Routing/CachedUrlMatcher.php
new file mode 100644
index 0000000..aa9adf6
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/CachedUrlMatcher.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Routing\CachedUrlMatcher.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Drupal\Core\Cache\CacheBackendInterface;
+use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
+use Symfony\Component\Routing\RequestContext as BaseRequestContext;
+
+/**
+ * Provides a url matcher which is cacheable.
+ */
+class CachedUrlMatcher implements UrlMatcherInterface {
+
+  /**
+   * The request context.
+   *
+   * @var \Symfony\Component\Routing\RequestContext
+   */
+  protected $context;
+
+  /**
+   * The wrapped url matcher.
+   *
+   * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface
+   */
+  protected $urlMatcher;
+
+  /**
+   * Constructs a new CachedUrlMatcher instance.
+   *
+   * @param \Drupal\Core\Cache\CacheBackendInterface $cache_backend
+   *   The cache backend.
+   * @param \Symfony\Component\Routing\Matcher\UrlMatcherInterface $url_matcher
+   *   The URL matcher.
+   */
+  public function __construct(CacheBackendInterface $cache_backend) {
+    $this->cacheBackend = $cache_backend;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function __call($name, $arguments) {
+    return call_user_func_array($name, $arguments);
+  }
+
+  public function setUrlMatcher(UrlMatcherInterface $url_matcher) {
+    $this->urlMatcher = $url_matcher;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function match($pathinfo) {
+    if ($cache = $this->cacheBackend->get('cached_url_matcher.' . $pathinfo)) {
+      return $cache->data;
+    }
+    else {
+      $result = $this->urlMatcher->match($pathinfo);
+      $this->cacheBackend->set('cached_url_matcher.' . $pathinfo, $result);
+      return $result;
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setContext(BaseRequestContext $context) {
+    $this->context = $context;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getContext() {
+    return $this->context;
+  }
+
+}
diff --git a/core/modules/system/core.api.php b/core/modules/system/core.api.php
index 32800de..011bb19 100644
--- a/core/modules/system/core.api.php
+++ b/core/modules/system/core.api.php
@@ -522,18 +522,7 @@
  * different cache backend, such as APC or Memcache, for storage.
  *
  * In a settings.php file, you can override the service used for a particular
- * cache bin. For example, if your service implementation of
- * \Drupal\Core\Cache\CacheBackendInterface was called cache.custom, the
- * following line would make Drupal use it for the 'cache_render' bin:
- * @code
- *  $settings['cache']['bins']['render'] = 'cache.custom';
- * @endcode
- *
- * Additionally, you can register your cache implementation to be used by
- * default for all cache bins with:
- * @code
- *  $settings['cache']['default'] = 'cache.custom';
- * @endcode
+ * cache bin. See sites/default/default.settings.php.
  *
  * @see https://drupal.org/node/1884796
  * @}
diff --git a/core/modules/system/src/Tests/Common/FormatDateTest.php b/core/modules/system/src/Tests/Common/FormatDateTest.php
index 63576fe..fd39f9f 100644
--- a/core/modules/system/src/Tests/Common/FormatDateTest.php
+++ b/core/modules/system/src/Tests/Common/FormatDateTest.php
@@ -32,7 +32,7 @@ class FormatDateTest extends WebTestBase {
   protected function setUp() {
     parent::setUp('language');
 
-    $this->config('system.date')
+    \Drupal::config('system.date')
       ->set('timezone.user.configurable', 1)
       ->save();
     $formats = $this->container->get('entity.manager')
@@ -96,7 +96,8 @@ function testFormatDate() {
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'Europe/London', 'en'), 'Monday, 26-Mar-07 01:00:00 BST', 'Test a different time zone.');
 
     // Change the default language and timezone.
-    $this->config('system.site')->set('langcode', static::LANGCODE)->save();
+    \Drupal::config('system.site')->set('langcode', static::LANGCODE)->save();
+    \Drupal::service('language_manager')->reset();
     date_default_timezone_set('America/Los_Angeles');
 
     $this->assertIdentical(format_date($timestamp, 'custom', 'l, d-M-y H:i:s T', 'America/Los_Angeles', 'en'), 'Sunday, 25-Mar-07 17:00:00 PDT', 'Test a different language.');
diff --git a/core/modules/system/src/Tests/Routing/RouteProviderTest.php b/core/modules/system/src/Tests/Routing/RouteProviderTest.php
index be8862c..b9814dd 100644
--- a/core/modules/system/src/Tests/Routing/RouteProviderTest.php
+++ b/core/modules/system/src/Tests/Routing/RouteProviderTest.php
@@ -114,7 +114,7 @@ function testExactPathMatch() {
    */
   function testOutlinePathMatch() {
     $connection = Database::getConnection();
-    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, 'test_routes');
+    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, $this->cache, 'test_routes');
 
     $this->fixtures->createTables($connection);
 
@@ -172,7 +172,7 @@ function testOutlinePathMatchTrailingSlash() {
    */
   function testOutlinePathMatchDefaults() {
     $connection = Database::getConnection();
-    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, 'test_routes');
+    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, $this->cache, 'test_routes');
 
     $this->fixtures->createTables($connection);
 
@@ -249,7 +249,7 @@ function testOutlinePathMatchDefaultsCollision() {
    */
   function testOutlinePathMatchDefaultsCollision2() {
     $connection = Database::getConnection();
-    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, 'test_routes');
+    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, $this->cache, 'test_routes');
 
     $this->fixtures->createTables($connection);
 
@@ -323,7 +323,7 @@ public function testOutlinePathMatchZero() {
    */
   function testOutlinePathNoMatch() {
     $connection = Database::getConnection();
-    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, 'test_routes');
+    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, $this->cache, 'test_routes');
 
     $this->fixtures->createTables($connection);
 
@@ -373,7 +373,7 @@ function testSystemPathMatch() {
    */
   protected function testRouteByName() {
     $connection = Database::getConnection();
-    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, 'test_routes');
+    $provider = new RouteProvider($connection, $this->routeBuilder, $this->state, $this->cache, 'test_routes');
 
     $this->fixtures->createTables($connection);
 
diff --git a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
index 6066d9d..00a8aae 100644
--- a/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
+++ b/core/modules/views/src/Plugin/views/field/FieldPluginBase.php
@@ -18,6 +18,7 @@
 use Drupal\views\Plugin\views\display\DisplayPluginBase;
 use Drupal\views\ResultRow;
 use Drupal\views\ViewExecutable;
+use Drupal\Core\Url as CoreUrl;
 
 /**
  * @defgroup views_field_handlers Views field handler plugins
@@ -1249,7 +1250,7 @@ public function renderText($alter) {
     }
     $this->last_render_text = $value;
 
-    if (!empty($alter['make_link']) && !empty($alter['path'])) {
+    if (!empty($alter['make_link']) && (!empty($alter['path']) || !empty($alter['url']))) {
       if (!isset($tokens)) {
         $tokens = $this->getRenderTokens($alter);
       }
@@ -1320,6 +1321,10 @@ protected function renderAsLink($alter, $text, $tokens) {
       }
     }
 
+    if (isset($alter['url'])) {
+      $path = $alter['url']->toString();
+    }
+
     // Parse the URL and move any query and fragment parameters out of the path.
     $url = UrlHelper::parse($path);
 
@@ -1438,11 +1443,12 @@ protected function renderAsLink($alter, $text, $tokens) {
       $options['entity_type'] = $alter['entity_type'];
     }
 
-    if (isset($options['url']) && $options['url'] instanceof Url) {
-      $value .= $this->linkGenerator()->generate($text, $options['url']);
+    if (isset($alter['url']) && $alter['url'] instanceof CoreUrl) {
+      $alter['url']->setOptions($options);
+      $value .= $this->linkGenerator()->generate($text, $alter['url']);
     }
     else {
-      $value .= _l($text, $path, $options);
+      $value .= $this->l($text, $path, $options);
     }
 
     if (!empty($alter['suffix'])) {
@@ -1461,7 +1467,7 @@ public function getRenderTokens($item) {
       $tokens = $this->view->build_info['substitutions'];
     }
     $count = 0;
-    foreach ($this->view->display_handler->getHandlers('argument') as $arg => $handler) {
+    foreach ($this->displayHandler->getHandlers('argument') as $arg => $handler) {
       $token = '%' . ++$count;
       if (!isset($tokens[$token])) {
         $tokens[$token] = '';
@@ -1474,10 +1480,12 @@ public function getRenderTokens($item) {
     }
 
     // Get flattened set of tokens for any array depth in query parameters.
-    $tokens += $this->getTokenValuesRecursive($this->view->getRequest()->query->all());
+    if ($request = $this->view->getRequest()) {
+      $tokens += $this->getTokenValuesRecursive($request->query->all());
+    }
 
     // Now add replacements for our fields.
-    foreach ($this->view->display_handler->getHandlers('field') as $field => $handler) {
+    foreach ($this->displayHandler->getHandlers('field') as $field => $handler) {
       if (isset($handler->last_render)) {
         $tokens["{{ $field }}"] = $handler->last_render;
       }
@@ -1694,6 +1702,13 @@ protected function getRenderer() {
     return $this->renderer;
   }
 
+  /**
+   * Wraps the _l function.
+   */
+  protected function l($text, $path, array $options = array()) {
+    return _l($text, $path, $options);
+  }
+
 }
 
 /**
diff --git a/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php b/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php
new file mode 100644
index 0000000..528afaf
--- /dev/null
+++ b/core/modules/views/tests/src/Unit/Plugin/field/FieldPluginBaseTest.php
@@ -0,0 +1,286 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Tests\views\Unit\Plugin\field\FieldPluginBaseTest.
+ */
+
+namespace Drupal\Tests\views\Unit\Plugin\field;
+
+
+use Drupal\Core\Language\Language;
+use Drupal\Core\Routing\UrlGenerator;
+use Drupal\Core\Url;
+use Drupal\Core\Utility\LinkGeneratorInterface;
+use Drupal\Tests\UnitTestCase;
+use Drupal\views\Plugin\views\field\FieldPluginBase;
+use Drupal\views\ResultRow;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Symfony\Component\Routing\Route;
+
+/**
+ * @coversDefaultClass \Drupal\views\Plugin\views\field\FieldPluginBase
+ * @group views
+ */
+class FieldPluginBaseTest extends UnitTestCase {
+
+  protected $configuration = [];
+  protected $pluginId = 'field_test';
+  protected $pluginDefinition = [];
+
+  /**
+   * The mocked link generator.
+   *
+   * @var \Drupal\Core\Utility\LinkGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $linkGenerator;
+
+  /**
+   * The mocked view executable.
+   *
+   * @var \Drupal\views\ViewExecutable|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $executable;
+
+  /**
+   * The mocked display plugin instance.
+   *
+   * @var \Drupal\views\Plugin\views\display\DisplayPluginBase|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $display;
+
+  /**
+   * The mocked url generator.
+   *
+   * @var \Drupal\Core\Routing\UrlGeneratorInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $urlGenerator;
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->linkGenerator = $this->getMock('Drupal\Core\Utility\LinkGeneratorInterface');
+    $this->executable = $this->getMockBuilder('Drupal\views\ViewExecutable')
+      ->disableOriginalConstructor()
+      ->getMock();
+    $this->display = $this->getMockBuilder('Drupal\views\Plugin\views\display\DisplayPluginBase')
+      ->disableOriginalConstructor()
+      ->getMock();
+
+    // Mock a url generator to make it working properly.
+    $route_provider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
+    $route_provider->expects($this->any())
+      ->method('getRouteByName')
+      ->with('test_route')
+      ->willReturn(new Route('/test-path'));
+
+    $this->urlGenerator = $this->getMock('Drupal\Core\Routing\UrlGeneratorInterface');
+
+    $container_builder = new ContainerBuilder();
+    $container_builder->set('url_generator', $this->urlGenerator);
+    \Drupal::setContainer($container_builder);
+  }
+
+  protected function setupDisplayWithEmptyArgumentsAndFields() {
+    $this->display->expects($this->any())
+      ->method('getHandlers')
+      ->willReturnMap([
+        ['argument', []],
+        ['field', []],
+      ]);
+  }
+
+  public function testRenderAsLinkWithoutPath() {
+    $alter = [
+      'make_link' => TRUE,
+    ];
+
+    $field = $this->setupTestField(['alter' => $alter]);
+    $field->field_alias = 'key';
+    $row = new ResultRow(['key' => 'value']);
+
+    $expected_result = 'value';
+    $result = $field->advancedRender($row);
+    $this->assertEquals($expected_result, $result);
+  }
+
+  /**
+   * @dataProvider providerTestRenderAsLinkWithPathAndOptions
+   */
+  public function testRenderAsLinkWithPathAndOptions($path, $alter, $expected_options, $link_html, $final_html = NULL) {
+    $alter += [
+      'make_link' => TRUE,
+      'path' => $path,
+    ];
+
+    $final_html = isset($final_html) ? $final_html : $link_html;
+
+    $this->setupDisplayWithEmptyArgumentsAndFields();
+    $field = $this->setupTestField(['alter' => $alter]);
+    $field->field_alias = 'key';
+    $row = new ResultRow(['key' => 'value']);
+
+    $field->expects($this->once())
+      ->method('l')
+      ->with('value', 'test-path', $expected_options + ['html' => TRUE, 'absolute' => FALSE, 'fragment' => '', 'query' => []])
+      ->willReturn($link_html);
+
+    $result = $field->advancedRender($row);
+    $this->assertEquals($final_html, $result);
+  }
+
+  public function providerTestRenderAsLinkWithPathAndOptions() {
+    $data = [];
+    // Simple path with default options.
+    $data[] = ['test-path', [], [], '<a href="/test-path">value</a>'];
+    // Add a fragment.
+    $data[] = ['test-path', ['fragment' => 'test'], ['fragment' => 'test'], '<a href="/test-path">value</a>'];
+    // Rel attributes.
+    $data[] = ['test-path', ['rel' => 'up'], ['attributes' => ['rel' => 'up']], '<a rel="up" href="/test-path">value</a>'];
+    // Target attributes.
+    $data[] = ['test-path', ['target' => '_blank'], ['attributes' => ['target' => '_blank']], '<a target="_blank" href="/test-path">value</a>'];
+    // Link attributes.
+    $data[] = ['test-path', ['link_attributes' => ['foo' => 'bar']], ['attributes' => ['foo' => 'bar']], '<a foo="bar" href="/test-path">value</a>'];
+    // Manual specified query.
+    $data[] = ['test-path', ['query' => ['foo' => 'bar']], ['query' => ['foo' => 'bar']], '<a href="/test-path?foo=bar">value</a>'];
+    // Query specified as part of the path.
+    $data[] = ['test-path?foo=bar', [], ['query' => ['foo' => 'bar']], '<a href="/test-path?foo=bar">value</a>'];
+    // Query specified as option and path.
+    // @todo Do we expect that options override all existing ones?
+    $data[] = ['test-path?foo=bar', ['query' => ['key' => 'value']], ['query' => ['key' => 'value']], '<a href="/test-path?key=value">value</a>'];
+    // Alias flag.
+    $data[] = ['test-path', ['alias' => TRUE], ['alias' => TRUE], '<a href="/test-path">value</a>'];
+    // Language flag.
+    $language = new Language(['id' => 'fr']);
+    $data[] = ['test-path', ['language' => $language], ['language' => $language], '<a href="/fr/test-path">value</a>'];
+    // Entity flag.
+    $entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
+    $data[] = ['test-path', ['entity' => $entity], ['entity' => $entity], '<a href="/test-path">value</a>'];
+    // entity_type flag.
+    $entity_type_id = 'node';
+    $data[] = ['test-path', ['entity_type' => $entity_type_id], ['entity_type' => $entity_type_id], '<a href="/test-path">value</a>'];
+    // prefix
+    $data[] = ['test-path', ['prefix' => 'test_prefix'], [], '<a href="/test-path">value</a>', 'test_prefix<a href="/test-path">value</a>'];
+    // suffix.
+    $data[] = ['test-path', ['suffix' => 'test_suffix'], [], '<a href="/test-path">value</a>', '<a href="/test-path">value</a>test_suffix'];
+
+    return $data;
+  }
+
+  /**
+   * @dataProvider providerTestRenderAsLinkWithUrlAndOptions
+   */
+  public function testRenderAsLinkWithUrlAndOptions(Url $url, $alter, Url $expected_url, $url_path, Url $expected_link_url, $link_html, $final_html = NULL) {
+    $alter += [
+      'make_link' => TRUE,
+      'url' => $url,
+    ];
+
+    $final_html = isset($final_html) ? $final_html : $link_html;
+
+    $this->setupDisplayWithEmptyArgumentsAndFields();
+    $field = $this->setupTestField(['alter' => $alter]);
+    $field->field_alias = 'key';
+    $row = new ResultRow(['key' => 'value']);
+
+    $expected_url = clone $expected_url;
+    $expected_link_url->setUrlGenerator($this->urlGenerator);
+    $this->urlGenerator->expects($this->atLeastOnce())
+      ->method('generateFromRoute')
+      ->with($expected_url->getRouteName(), $expected_url->getRouteParameters(), $expected_url->getOptions())
+      ->willReturn($url_path);
+    $this->linkGenerator->expects($this->once())
+      ->method('generate')
+      ->with('value', clone $expected_link_url)
+      ->willReturn($link_html);
+
+    $result = $field->advancedRender($row);
+    $this->assertEquals($final_html, $result);
+  }
+
+  public function providerTestRenderAsLinkWithUrlAndOptions() {
+    $data = [];
+
+    $default_options = ['html' => TRUE, 'absolute' => FALSE, 'fragment' => '', 'query' => []];
+
+    $url = Url::fromRoute('test_route');
+    // Simple path with default options.
+    $data[] = [$url, [], $url, '/test-path', $url, '<a href="/test-path">value</a>'];
+
+    $url_parameters = Url::fromRoute('test_route', ['key' => 'value']);
+    // Simple url with parameters.
+    $data[] = [$url_parameters, [], $url_parameters, '/test-path/value', $url_parameters, '<a href="/test-path/value">value</a>'];
+
+    // Add a fragment.
+    $url_with_fragment = clone $url;
+    $options = ['fragment' => 'test'] + $default_options;
+    $url_with_fragment->setOptions($options);
+    $data[] = [$url, ['fragment' => 'test'], $url, '/test-path', $url_with_fragment, '<a href="/test-path#test">value</a>'];
+
+    // Rel attributes.
+    $url_with_rel = clone $url;
+    $options = ['attributes' => ['rel' => 'up']] + $default_options;
+    $url_with_rel->setOptions($options);
+    $data[] = [$url, ['rel' => 'up'], $url, '/test-path', $url_with_rel, '<a rel="up" href="/test-path">value</a>'];
+
+    // Target attributes.
+    $url_with_target = clone $url;
+    $options = ['attributes' => ['target' => '_blank']] + $default_options;
+    $url_with_target->setOptions($options);
+    $data[] = [$url, ['target' => '_blank'], $url, '/test-path', $url_with_target, '<a target="_blank" href="/test-path">value</a>'];
+
+    // Link attributes.
+    $url_with_link_attributes = clone $url;
+    $options = ['attributes' => ['foo' => 'bar']] + $default_options;
+    $url_with_link_attributes->setOptions($options);
+    $data[] = [$url, ['link_attributes' => ['foo' => 'bar']], $url, '/test-path', $url_with_link_attributes, '<a foo="bar" href="/test-path">value</a>'];
+
+    // Manual specified query.
+//    $data[] = [$url, ['query' => ['foo' => 'bar']], $url, '<a href="/test-path?foo=bar">value</a>'];
+    // Query specified as part of the path.
+    $clone_url = clone $url;
+//    $data[] = [$clone_url->setOption('query', ['foo' => 'bar']), [], $url, '<a href="/test-path?foo=bar">value</a>'];
+    // Query specified as option and path.
+    // @todo Do we expect that options override all existing ones?
+//    $data[] = [$clone_url->setOption('query', ['foo' => 'bar']), ['query' => ['key' => 'value']], $url, '<a href="/test-path?key=value">value</a>'];
+    // Alias flag.
+//    $data[] = ['test-path', ['alias' => TRUE], $url, '<a href="/test-path">value</a>'];
+    // Language flag.
+    $language = new Language(['id' => 'fr']);
+//    $data[] = ['test-path', ['language' => $language], $url, '<a href="/fr/test-path">value</a>'];
+    // Entity flag.
+    $entity = $this->getMock('Drupal\Core\Entity\EntityInterface');
+//    $data[] = ['test-path', ['entity' => $entity], $url, '<a href="/test-path">value</a>'];
+    // entity_type flag.
+    $entity_type_id = 'node';
+//    $data[] = ['test-path', ['entity_type' => $entity_type_id], $url, '<a href="/test-path">value</a>'];
+    // prefix
+//    $data[] = ['test-path', ['prefix' => 'test_prefix'], $url, '<a href="/test-path">value</a>', 'test_prefix<a href="/test-path">value</a>'];
+    // suffix.
+//    $data[] = ['test-path', ['suffix' => 'test_suffix'], $url, '<a href="/test-path">value</a>', '<a href="/test-path">value</a>test_suffix'];
+
+    return $data;
+  }
+
+  /**
+   * @return \Drupal\Tests\views\Unit\Plugin\field\TestField|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected function setupTestField(array $options = []) {
+    /** @var \Drupal\Tests\views\Unit\Plugin\field\TestField $field */
+    $field = $this->getMock('Drupal\Tests\views\Unit\Plugin\field\TestField', ['l'], [$this->configuration, $this->pluginId, $this->pluginDefinition]);
+    $field->init($this->executable, $this->display, $options);
+    $field->setLinkGenerator($this->linkGenerator);
+
+    return $field;
+  }
+
+}
+
+class TestField extends FieldPluginBase {
+
+  public function setLinkGenerator(LinkGeneratorInterface $link_generator) {
+    $this->linkGenerator = $link_generator;
+  }
+
+}
diff --git a/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php b/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php
index 98cffaf..8614ebd 100644
--- a/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Access/AccessManagerTest.php
@@ -88,6 +88,13 @@ class AccessManagerTest extends UnitTestCase {
   protected $checkProvider;
 
   /**
+   * The mocked URL matcher.
+   *
+   * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $urlMatcher;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
@@ -104,9 +111,9 @@ protected function setUp() {
     $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
     $map = array();
     foreach ($this->routeCollection->all() as $name => $route) {
-      $map[] = array($name, array(), $route);
+      $map[] = array($name, $route);
     }
-    $map[] = array('test_route_4', array('value' => 'example'), $this->routeCollection->get('test_route_4'));
+    $map[] = array('test_route_4', $this->routeCollection->get('test_route_4'));
     $this->routeProvider->expects($this->any())
       ->method('getRouteByName')
       ->will($this->returnValueMap($map));
@@ -125,7 +132,10 @@ protected function setUp() {
     $this->checkProvider = new CheckProvider();
     $this->checkProvider->setContainer($this->container);
 
+    $this->urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
+
     $this->accessManager = new AccessManager($this->routeProvider, $this->paramConverter, $this->argumentsResolverFactory, $this->currentUser, $this->checkProvider);
+    $this->accessManager->setUrlMatcher($this->urlMatcher);
   }
 
   /**
@@ -459,7 +469,7 @@ public function testCheckNamedRouteWithUpcastedValues() {
     $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
     $this->routeProvider->expects($this->any())
       ->method('getRouteByName')
-      ->with('test_route_1', array('value' => 'example'))
+      ->with('test_route_1')
       ->will($this->returnValue($route));
 
     $map = array();
@@ -508,7 +518,7 @@ public function testCheckNamedRouteWithDefaultValue() {
     $this->routeProvider = $this->getMock('Drupal\Core\Routing\RouteProviderInterface');
     $this->routeProvider->expects($this->any())
       ->method('getRouteByName')
-      ->with('test_route_1', array())
+      ->with('test_route_1')
       ->will($this->returnValue($route));
 
     $map = array();
@@ -656,6 +666,32 @@ protected function setupAccessArgumentsResolverFactory($constraint = NULL) {
       }));
   }
 
+  /**
+   * Tests checkPath().
+   *
+   * @covers ::checkPath
+   */
+  public function testCheckPath() {
+    $this->urlMatcher->expects($this->once())
+      ->method('match')
+      ->with('/test')
+      ->willReturn([
+        RouteObjectInterface::ROUTE_NAME => 'test_route_2',
+        RouteObjectInterface::ROUTE_OBJECT => $this->routeCollection->get('test_route_2'),
+      ]);
+    $this->setupAccessChecker();
+    $this->checkProvider->setChecks($this->routeCollection);
+    $this->setupAccessArgumentsResolverFactory();
+
+    $this->paramConverter->expects($this->at(0))
+      ->method('convert')
+      ->will($this->returnValue([]));
+
+    // Tests the access with routes with parameters without given request.
+    $this->assertTrue($this->accessManager->checkPath('test', $this->account));
+
+  }
+
 }
 
 /**
diff --git a/core/tests/Drupal/Tests/Core/Routing/CachedUrlMatcherTest.php b/core/tests/Drupal/Tests/Core/Routing/CachedUrlMatcherTest.php
new file mode 100644
index 0000000..39ea3d5
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/Routing/CachedUrlMatcherTest.php
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\Routing\CachedUrlMatcherTest.
+ */
+
+namespace Drupal\Tests\Core\Routing;
+
+use Drupal\Core\Routing\CachedUrlMatcher;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Cmf\Component\Routing\RouteObjectInterface;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * @coversDefaultClass \Drupal\Core\Routing\CachedUrlMatcher
+ * @group Routing
+ */
+class CachedUrlMatcherTest extends UnitTestCase {
+
+  /**
+   * The mocked cache backend.
+   *
+   * @var \Drupal\Core\Cache\CacheBackendInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $cache;
+
+  /**
+   * The mocked URL matcher.
+   *
+   * @var \Symfony\Component\Routing\Matcher\UrlMatcherInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $urlMatcher;
+
+  /**
+   * The tested cached URL matcher.
+   *
+   * @var \Drupal\Core\Routing\CachedUrlMatcher
+   */
+  protected $cachedUrlMatcher;
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->cache = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
+    $this->urlMatcher = $this->getMock('Symfony\Component\Routing\Matcher\UrlMatcherInterface');
+
+    $this->cachedUrlMatcher = new CachedUrlMatcher($this->cache);
+    $this->cachedUrlMatcher->setUrlMatcher($this->urlMatcher);
+  }
+
+  /**
+   * @covers ::setContext
+   * @covers ::getContext
+   */
+  public function testSetContext() {
+    $request_context = new RequestContext();
+    $this->assertSame($this->cachedUrlMatcher, $this->cachedUrlMatcher->setContext($request_context));
+    $this->assertSame($request_context, $this->cachedUrlMatcher->getContext());
+  }
+
+  /**
+   * @covers ::match
+   */
+  public function testMatchWithoutCachedMatching() {
+    $this->cache->expects($this->at(0))
+      ->method('get')
+      ->with('cached_url_matcher./test');
+    $attributes = [RouteObjectInterface::ROUTE_NAME => 'test_route'];
+    $this->cache->expects($this->at(1))
+      ->method('set')
+      ->with('cached_url_matcher./test', $attributes);
+
+    $this->urlMatcher->expects($this->once())
+      ->method('match')
+      ->with('/test')
+      ->willReturn($attributes);
+
+    $this->cachedUrlMatcher->match('/test');
+  }
+
+  /**
+   * @covers ::match
+   */
+  public function testMatchWithCachedMatching() {
+    $attributes = [RouteObjectInterface::ROUTE_NAME => 'test_route'];
+    $this->cache->expects($this->at(0))
+      ->method('get')
+      ->with('cached_url_matcher./test')
+      ->willReturn((object) ['data' => $attributes]);
+    $this->cache->expects($this->never())
+      ->method('set');
+
+    $this->urlMatcher->expects($this->never())
+      ->method('match');
+
+    $this->cachedUrlMatcher->match('/test');
+  }
+
+}
+
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index a435754..e8d08b2 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -390,6 +390,30 @@
 */
 
 /**
+ * Cache settings.
+ *
+ * You can configure cache settings per bin.
+ *
+ * For example, if your service implementation of
+ * \Drupal\Core\Cache\CacheBackendInterface was called cache.custom, the
+ * following line would make Drupal use it for the 'cache_render' bin:
+ * @code
+ *  $settings['cache']['bins']['render'] = 'cache.custom';
+ * @endcode
+ *
+ * Additionally, you can register your cache implementation to be used by
+ * default for all cache bins with:
+ * @code
+ *  $settings['cache']['default'] = 'cache.custom';
+ * @endcode
+ */
+// Per default cache the menu and routing just in memory. Given that there a lot
+// of possible allowed paths you should better use a cache backend, which has
+// a limited total size / limited amount of items. Database cache would
+// potentially fill up a lot.
+$settings['cache']['bins']['menu'] = 'cache.backend.memory';
+
+/**
  * Authorized file system operations:
  *
  * The Update Manager module included with Drupal provides a mechanism for
diff --git a/sites/development.services.yml b/sites/development.services.yml
index cc21211..73cc998 100644
--- a/sites/development.services.yml
+++ b/sites/development.services.yml
@@ -3,7 +3,5 @@
 # To activate this feature, follow the instructions at the top of the
 # 'example.settings.local.php' file, which sits next to this file.
 services:
-  cache.backend.memory:
-    class: Drupal\Core\Cache\MemoryBackendFactory
   cache.backend.null:
     class: Drupal\Core\Cache\NullBackendFactory
