diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 48684e5..7082cfa 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -82,6 +82,11 @@ public function build(ContainerBuilder $container) {
     $container->register('nested_matcher', 'Drupal\Core\Routing\NestedMatcher')
       ->addTag('chained_matcher', array('priority' => 5));
 
+    $container->register('router.generator', 'Drupal\Core\Routing\UrlGenerator');
+    $container->register('router', 'Drupal\Core\Routing\Router')
+      ->addArgument(new Reference('matcher'))
+      ->addArgument(new Reference('router.generator'));
+
     // The following services are tagged as 'nested_matcher' services and are
     // processed in the RegisterNestedMatchersPass compiler pass. Each one
     // needs to be set on the matcher using a different method, so we use a
@@ -99,7 +104,7 @@ public function build(ContainerBuilder $container) {
     $container->register('router_processor_subscriber', 'Drupal\Core\EventSubscriber\RouteProcessorSubscriber')
       ->addTag('event_subscriber');
     $container->register('router_listener', 'Symfony\Component\HttpKernel\EventListener\RouterListener')
-      ->addArgument(new Reference('matcher'))
+      ->addArgument(new Reference('router'))
       ->addTag('event_subscriber');
     $container->register('content_negotiation', 'Drupal\Core\ContentNegotiation');
     $container->register('view_subscriber', 'Drupal\Core\EventSubscriber\ViewSubscriber')
diff --git a/core/lib/Drupal/Core/Routing/Router.php b/core/lib/Drupal/Core/Routing/Router.php
new file mode 100644
index 0000000..6baff8b
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Router.php
@@ -0,0 +1,139 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Routing\Router.
+ */
+namespace Drupal\Core\Routing;
+
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\Exception\RouteNotFoundException;
+
+/**
+ * A Symfony compatible implementation of a Router, i. e. something that
+ * conforms to the RouterInterface.
+ */
+class Router implements RouterInterface, RequestMatcherInterface {
+
+  /**
+   * The request context for this router.
+   *
+   * This is unused. It's just to satisfy the interface.
+   *
+   * @var \Symfony\Component\Routing\RequestContext
+   */
+  protected $context;
+
+  /**
+   * The matcher of this router.
+   *
+   * Something that implements the RequestMatcherInterface.
+   *
+   * @var \Symfony\Component\Routing\Matcher\RequestMatcherInterface
+   */
+  protected $matcher;
+
+  /**
+   * The matcher of this router.
+   *
+   * Something that implements the RequestMatcherInterface.
+   *
+   * @var \Symfony\Component\Routing\Matcher\RequestMatcherInterface
+   */
+  protected $generator;
+
+  public function __construct(RequestMatcherInterface $matcher, UrlGeneratorInterface $generator) {
+    $this->matcher = $matcher;
+    $this->generator = $generator;
+
+    $this->context = new RequestContext();
+  }
+
+  /**
+   * This method exists only for interface compatibility with
+   * UrlMatcherInterface, which is part of RouterInterface.
+   *
+   * However our matcher cannot derive enough information from path info
+   * to operate properly, so we disable this method here.
+   *
+   * Please use matchRequest(Request $request) instead.
+   *
+   * @see \Symfony\Component\Routing\Matcher\UrlMatcherInterface
+   * @see \Symfony\Component\Routing\RouterInterface
+   */
+  public function match($pathinfo) {
+    throw new \Exception('Method disabled. Use matchRequest() instead.');
+  }
+
+  /**
+   * Tries to match a request with a set of routes.
+   *
+   * If the matcher can not find information, it must throw one of the
+   * exceptions documented below.
+   *
+   * @param Request $request The request to match
+   *
+   * @return array An array of parameters
+   *
+   * @throws \Symfony\Component\Routing\Exception\ResourceNotFoundException
+   *   if no matching resource could be found
+   * @throws \Symfony\Component\Routing\Exception\MethodNotAllowedException
+   *   if a matching resource was found but the request method is not allowed
+   */
+  public function matchRequest(Request $request) {
+    return $this->matcher->matchRequest($request);
+  }
+
+  /**
+   * Generates a URL from the given parameters.
+   *
+   * If the generator is not able to generate the URL, it must throw the
+   * RouteNotFoundException as documented below.
+   *
+   * @param string  $name       The name of the route
+   * @param mixed   $parameters An array of parameters
+   * @param Boolean $absolute   Whether to generate an absolute URL
+   *
+   * @return string The generated URL
+   *
+   * @throws \Symfony\Component\Routing\Exception\RouteNotFoundException
+   *   if route doesn't exist
+   */
+  public function generate($name, $parameters = array(), $absolute = false) {
+    return $this->generator->generate($name, $parameters, $absolute);
+  }
+
+  /**
+   * This method exists only for interface compatibility with RouterInterface.
+   *
+   * However our collection of routes is far too big to be returned, so we
+   * disable it here.
+   *
+   * @see \Symfony\Component\Routing\RouterInterface
+   */
+  public function getRouteCollection() {
+    throw new \Exception('Method disabled. Our collection of routes is too big to be returned.');
+  }
+
+  /**
+   * Sets the request context.
+   *
+   * @param RequestContext $context The context
+   */
+  public function setContext(RequestContext $context) {
+    $this->context = $context;
+  }
+
+  /**
+   * Gets the request context.
+   *
+   * @return RequestContext The context
+   */
+  public function getContext() {
+    return $this->context;
+  }
+}
diff --git a/core/lib/Drupal/Core/Routing/UrlGenerator.php b/core/lib/Drupal/Core/Routing/UrlGenerator.php
new file mode 100644
index 0000000..af6345f
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/UrlGenerator.php
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Routing\UrlGenerator.
+ */
+
+namespace Drupal\Core\Routing;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+use Symfony\Component\Routing\RequestContext;
+
+/**
+ * This is a temporary noop implemenation while the development of
+ * the generator is postponed. Yet we need an object that implements
+ * UrlGeneratorInterface to be passed to the Router.
+ *
+ * See http://drupal.org/node/1830854
+ */
+class UrlGenerator implements UrlGeneratorInterface {
+
+  public function generate($name, $parameters = array(), $absolute = FALSE) {
+    throw new \Exception('Method disabled. This is a dummy implementation.');
+  }
+
+  public function setContext(RequestContext $context) {
+    throw new \Exception('Method disabled. This is a dummy implementation.');
+  }
+
+  public function getContext() {
+    throw new \Exception('Method disabled. This is a dummy implementation.');
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/MockGenerator.php b/core/modules/system/lib/Drupal/system/Tests/Routing/MockGenerator.php
new file mode 100644
index 0000000..b63915a
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/MockGenerator.php
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Routing\MockGenerator.
+ */
+
+namespace Drupal\system\Tests\Routing;
+
+use Symfony\Component\Routing\Generator\UrlGeneratorInterface;
+
+use Closure;
+
+/**
+ * A mock generator that can be configured with any 
+ * generation logic for testing.
+ *
+ */
+class MockGenerator implements UrlGeneratorInterface {
+
+  /**
+   * The generator being tested.
+   */
+  protected $generator;
+
+  public function __construct(Closure $generator) {
+    $this->generator = $generator;
+  }
+
+  public function generate($name, $parameters = array(), $absolute = false) {
+    $generator = $this->generator;
+    return $generator($name, $parameters, $absolute);
+  }
+  
+  /**
+   * These are here to satisfy RequestContextAwareInterface. They will hopefully
+   * go away once https://github.com/symfony/symfony/pull/5895 is merged into
+   * Symfony.
+   */
+  public function setContext(\Symfony\Component\Routing\RequestContext $context) {}
+  public function getContext() {}
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Routing/RouterUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Routing/RouterUnitTest.php
new file mode 100644
index 0000000..347eed4
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/RouterUnitTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Routing\RouterUnitTest.
+ */
+
+namespace Drupal\system\Tests\Routing;
+
+use Drupal\simpletest\UnitTestBase;
+use Drupal\Core\Routing\Router;
+use Drupal\Core\Routing\ChainMatcher;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\Exception\ResourceNotFoundException;
+
+/**
+ * Basic tests for the Router.
+ */
+class RouterUnitTest extends UnitTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Router unit tests',
+      'description' => 'Confirm that the router is working correctly.',
+      'group' => 'Routing',
+    );
+  }
+
+  /**
+   * Confirms that the Router can be instantiated and is functional.
+   */
+  public function testRouterObject() {
+    // Setup router with mocked up matcher and generator.
+    $matcher = new MockMatcher(function($request) { return "MockMatcher::matchRequest()"; });
+    $generator = new MockGenerator(function($arg) { return "MockGenerator::generate()"; });
+    $router = new Router($matcher, $generator);
+
+    // Test matcher functionality.
+    $request = Request::create("/foo");
+    
+    $this->assertEqual($router->matchRequest($request), "MockMatcher::matchRequest()", "Call to matchRequest() is passed to internal RequestMatcher object.");
+
+    $msg = "Call to match() yields an Exception.";
+
+    try {
+      $router->match('foo');
+      $this->fail($msg);
+    }
+    catch(\Exception $e) {
+      $this->assertEqual($e->getMessage(), "Method disabled. Use matchRequest() instead.", $msg);
+    }
+
+    //Test generator functionality.
+    $this->assertEqual($router->generate('bar'), "MockGenerator::generate()", "Call to generate() is passed to internal UrlGenerator object.");
+  }
+}
