diff --git a/core/core.services.yml b/core/core.services.yml
index 9dca742..63de7f7 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -96,6 +96,8 @@ services:
     factory_class: Drupal\Core\Database\Database
     factory_method: getConnection
     arguments: [default]
+  logger.watchdog:
+    class: Drupal\Core\WatchdogLogger
   keyvalue:
     class: Drupal\Core\KeyValueStore\KeyValueFactory
     arguments: ['@service_container']
@@ -161,7 +163,7 @@ services:
     arguments: ['@service_container']
   controller_resolver:
     class: Drupal\Core\ControllerResolver
-    arguments: ['@service_container']
+    arguments: ['@service_container', '@logger.watchdog']
   http_kernel:
     class: Drupal\Core\HttpKernel
     arguments: ['@event_dispatcher', '@service_container', '@controller_resolver']
@@ -200,7 +202,7 @@ services:
       - [setFinalMatcher, ['@router.matcher.final_matcher']]
   router.generator:
     class: Drupal\Core\Routing\UrlGenerator
-    arguments: ['@router.route_provider', '@path.alias_manager.cached']
+    arguments: ['@router.route_provider', '@path.alias_manager.cached', '@logger.watchdog']
   router.dynamic:
     class: Symfony\Cmf\Component\Routing\DynamicRouter
     arguments: ['@router.request_context', '@router.matcher', '@router.generator']
diff --git a/core/lib/Drupal/Core/ControllerResolver.php b/core/lib/Drupal/Core/ControllerResolver.php
index e442427..e9fc849 100644
--- a/core/lib/Drupal/Core/ControllerResolver.php
+++ b/core/lib/Drupal/Core/ControllerResolver.php
@@ -7,8 +7,8 @@
 
 namespace Drupal\Core;
 
+use Psr\Log\LoggerInterface;
 use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
-use Symfony\Component\HttpKernel\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/Routing/UrlGenerator.php b/core/lib/Drupal/Core/Routing/UrlGenerator.php
index 75779a2..f82c1ac 100644
--- a/core/lib/Drupal/Core/Routing/UrlGenerator.php
+++ b/core/lib/Drupal/Core/Routing/UrlGenerator.php
@@ -7,8 +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 +32,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];
+  }
+
+}
