diff --git a/core/lib/Drupal/Core/Routing/Router.php b/core/lib/Drupal/Core/Routing/Router.php
new file mode 100644
index 0000000..3f0c3b1
--- /dev/null
+++ b/core/lib/Drupal/Core/Routing/Router.php
@@ -0,0 +1,135 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Routing\Router.
+ */
+namespace Drupal\Core\Routing;
+
+use Symfony\Component\Routing\RouterInterface;
+use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\Routing\RequestContext;
+use Symfony\Component\Routing\RouteCollection;
+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;
+
+  public function __construct(RequestMatcherInterface $matcher) {
+    $this->matcher = $matcher;
+
+    // The RequestContext is obsolete in this implementation. It's here to
+    // conform the interface, thus it's okay to reuse it from the matcher.
+    $this->context = $matcher->getContext();
+  }
+
+  /**
+   * 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) {
+    // This is a null implementation of the UrlGeneratorInterface which is
+    // part of the RouterInterface.
+    // @todo Write a fully functional UrlGenerator, take it in the constructor
+    // and pass this call to it.
+    throw new RouteNotFoundException('Method generate() is not implemented yet.');
+  }
+
+  /**
+   * 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/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..b010878
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Routing/RouterUnitTest.php
@@ -0,0 +1,48 @@
+<?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 instatiated and is functional.
+   */
+  public function testRouterObject() {
+    $matcher = new ChainMatcher();
+    $router = new Router($matcher);
+
+    $request = Request::create('/foo');
+    $msg = "Catch a ResourceNotFoundException when matching against an empty matcher.";
+
+    try {
+      $router->matchRequest($request);
+      $this->fail($msg);
+    }
+    catch(ResourceNotFoundException $e) {
+      $this->pass($msg);
+    }
+  }
+
+}
