diff --git a/core/lib/Drupal/Core/ControllerResolver.php b/core/lib/Drupal/Core/ControllerResolver.php
index e442427..7ba3c85 100644
--- a/core/lib/Drupal/Core/ControllerResolver.php
+++ b/core/lib/Drupal/Core/ControllerResolver.php
@@ -8,7 +8,7 @@
 namespace Drupal\Core;
 
 use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
-use Symfony\Component\HttpKernel\Log\LoggerInterface;
+use Psr\Log\LoggerInterface;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -41,7 +41,7 @@ class ControllerResolver extends BaseControllerResolver {
    *
    * @param Symfony\Component\DependencyInjection\ContainerInterface $container
    *   A ContainerInterface instance.
-   * @param Symfony\Component\HttpKernel\Log\LoggerInterface $logger
+   * @param \Psr\Log\LoggerInterface $logger
    *   (optional) A LoggerInterface instance.
    */
   public function __construct(ContainerInterface $container, LoggerInterface $logger = NULL) {
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 35b1b6d..063fe15 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -163,7 +163,8 @@ public function build(ContainerBuilder $container) {
     $container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher')
       ->addArgument(new Reference('service_container'));
     $container->register('controller_resolver', 'Drupal\Core\ControllerResolver')
-      ->addArgument(new Reference('service_container'));
+      ->addArgument(new Reference('service_container'))
+      ->addArgument(new Reference('logger.watchdog'));
 
     $this->registerModuleHandler($container);
 
@@ -293,6 +294,8 @@ public function build(ContainerBuilder $container) {
     $container->register('flood', 'Drupal\Core\Flood\DatabaseBackend')
       ->addArgument(new Reference('database'));
 
+    $container->register('logger.watchdog', 'Drupal\Core\WatchdogLogger');
+
     $container->register('plugin.manager.condition', 'Drupal\Core\Condition\ConditionManager');
 
     $container->register('kernel_destruct_subscriber', 'Drupal\Core\EventSubscriber\KernelDestructionSubscriber')
@@ -363,7 +366,8 @@ protected function registerRouting(ContainerBuilder $container) {
       ->addMethodCall('setFinalMatcher', array(new Reference('router.matcher.final_matcher')));
     $container->register('router.generator', 'Drupal\Core\Routing\UrlGenerator')
       ->addArgument(new Reference('router.route_provider'))
-      ->addArgument(new Reference('path.alias_manager.cached'));
+      ->addArgument(new Reference('path.alias_manager.cached'))
+      ->addArgument(new Reference('logger.watchdog'));
     $container->register('router.dynamic', 'Symfony\Cmf\Component\Routing\DynamicRouter')
       ->addArgument(new Reference('router.request_context'))
       ->addArgument(new Reference('router.matcher'))
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
index 7b1e34a..71cbb96 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RouteProcessorSubscriber.php
@@ -12,7 +12,6 @@
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpKernel\Exception\MethodNotAllowedHttpException;
-use Symfony\Component\HttpKernel\Log\LoggerInterface;
 use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\Routing\Matcher\UrlMatcherInterface;
 use Symfony\Component\Routing\Exception\ResourceNotFoundException;
diff --git a/core/lib/Drupal/Core/Routing/UrlGenerator.php b/core/lib/Drupal/Core/Routing/UrlGenerator.php
index 75779a2..a501300 100644
--- a/core/lib/Drupal/Core/Routing/UrlGenerator.php
+++ b/core/lib/Drupal/Core/Routing/UrlGenerator.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\Core\Routing;
 
-use Symfony\Component\HttpKernel\Log\LoggerInterface;
+use Psr\Log\LoggerInterface;
 
 use Symfony\Cmf\Component\Routing\ProviderBasedGenerator;
 use Symfony\Cmf\Component\Routing\RouteProviderInterface;
@@ -33,7 +33,7 @@ class UrlGenerator extends ProviderBasedGenerator {
    *   The route provider to be searched for routes.
    * @param \Drupal\Core\Path\AliasManagerInterface $alias_manager
    *   The alias manager responsible for path aliasing.
-   * @param \Symfony\Component\HttpKernel\Log\LoggerInterface $logger
+   * @param \Psr\Log\LoggerInterface $logger
    *   An optional logger for recording errors.
    */
   public function __construct(RouteProviderInterface $provider, AliasManagerInterface $alias_manager, LoggerInterface $logger = NULL) {
diff --git a/core/lib/Drupal/Core/WatchdogLogger.php b/core/lib/Drupal/Core/WatchdogLogger.php
new file mode 100644
index 0000000..7b24e19
--- /dev/null
+++ b/core/lib/Drupal/Core/WatchdogLogger.php
@@ -0,0 +1,85 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\WatchdogLogger.
+ */
+
+namespace Drupal\Core;
+
+use Psr\Log\AbstractLogger;
+use Psr\Log\LogLevel;
+
+/**
+ * Watchdog-backed implementation of the PSR-3 Logger interface.
+ */
+class WatchdogLogger extends AbstractLogger {
+
+  /**
+   * Map of PSR Log constants to Watchdog log constants.
+   *
+   * @var array
+   */
+  protected $levelTranslation;
+
+  /**
+   * Logs with an arbitrary level.
+   *
+   * @param mixed $level
+   *   One of the log levels defined by \Psr\Log\LogLevel.
+   * @param string $message
+   *   The message to record.
+   * @param array $context
+   *   An array of additional information relevant to this message. These values
+   *   may be substitued into the message.
+   *
+   * @return null
+   */
+  public function log($level, $message, array $context = array()) {
+
+    $type = isset($context['type']) ? $context['type'] : 'system';
+    $link = isset($context['link']) ? $context['link'] : NULL;
+
+    unset($context['type'], $context['link']);
+
+    // Escape all values in the message, but convert them to watchdog format.
+    $message = preg_replace('/\{(.*)\}/', '@$1', $message);
+
+    // Translate the context into the variables key of watchdog messages.
+    $variables = array();
+    foreach ($context as $key => $element) {
+      if ($key != 'exception') {
+        $variables['@' . $key] = $element;
+      }
+    }
+
+    watchdog($type, $message, $variables, $this->mapLevel($level), $link);
+  }
+
+  /**
+   * Converts a PSR Log level to a Watchdog log level.
+   *
+   * @param string $level
+   *   A PSR-3 logging level string.
+   *
+   * @return int
+   *   The corresponding Watchdog constant.
+   */
+  protected function mapLevel($level) {
+    if (empty($this->levelTranslation)) {
+      $this->levelTranslation = array(
+        LogLevel::ALERT => WATCHDOG_ALERT,
+        LogLevel::CRITICAL => WATCHDOG_CRITICAL,
+        LogLevel::DEBUG => WATCHDOG_DEBUG,
+        LogLevel::EMERGENCY => WATCHDOG_EMERGENCY,
+        LogLevel::ERROR => WATCHDOG_ERROR,
+        LogLevel::INFO => WATCHDOG_INFO,
+        LogLevel::NOTICE => WATCHDOG_NOTICE,
+        LogLevel::WARNING => WATCHDOG_WARNING,
+      );
+    }
+
+    return $this->levelTranslation[$level];
+  }
+
+}
