diff --git a/core/core.services.yml b/core/core.services.yml
index 6049d3b..4a2b7a8 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -448,7 +448,7 @@ services:
     arguments: ['@http_handler_stack']
   theme.negotiator:
     class: Drupal\Core\Theme\ThemeNegotiator
-    arguments: ['@access_check.theme']
+    arguments: ['@access_check.theme', '@current_route_match']
     tags:
       - { name: service_collector, tag: theme_negotiator, call: addNegotiator }
   theme.negotiator.default:
diff --git a/core/lib/Drupal/Core/Theme/ChainThemeNegotiatorInterface.php b/core/lib/Drupal/Core/Theme/ChainThemeNegotiatorInterface.php
new file mode 100644
index 0000000..d5e8734
--- /dev/null
+++ b/core/lib/Drupal/Core/Theme/ChainThemeNegotiatorInterface.php
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Theme\ChainThemeNegotiatorInterface.
+ */
+
+namespace Drupal\Core\Theme;
+
+/**
+ * Defines an interface for a chained service which determines the active theme.
+ */
+interface ChainThemeNegotiatorInterface extends ThemeNegotiatorInterface {
+
+  /**
+   * Adds a active theme negotiation service.
+   *
+   * @param \Drupal\Core\Theme\ThemeNegotiatorInterface $negotiator
+   *   The theme negotiator to add.
+   * @param int $priority
+   *   Priority of the theme negotiator.
+   */
+  public function addNegotiator(ThemeNegotiatorInterface $negotiator, $priority);
+
+  /**
+   * Determines the active theme.
+   *
+   * @return string|null
+   *   Returns the active theme name, else return NULL.
+   *
+   * @see \Drupal\Core\Theme\ThemeNegotiatorInterface::determineActiveTheme()
+   */
+  public function getActiveTheme();
+
+}
diff --git a/core/lib/Drupal/Core/Theme/ThemeNegotiator.php b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php
index 1d6b589..8cded99 100644
--- a/core/lib/Drupal/Core/Theme/ThemeNegotiator.php
+++ b/core/lib/Drupal/Core/Theme/ThemeNegotiator.php
@@ -10,7 +10,7 @@
  * It therefore uses ThemeNegotiatorInterface objects which are passed in
  * using the 'theme_negotiator' tag.
  */
-class ThemeNegotiator implements ThemeNegotiatorInterface {
+class ThemeNegotiator implements ChainThemeNegotiatorInterface {
 
   /**
    * Holds arrays of theme negotiators, keyed by priority.
@@ -36,22 +36,27 @@ class ThemeNegotiator implements ThemeNegotiatorInterface {
   protected $themeAccess;
 
   /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
    * Constructs a new ThemeNegotiator.
    *
    * @param \Drupal\Core\Theme\ThemeAccessCheck $theme_access
    *   The access checker for themes.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
    */
-  public function __construct(ThemeAccessCheck $theme_access) {
+  public function __construct(ThemeAccessCheck $theme_access, RouteMatchInterface $route_match) {
     $this->themeAccess = $theme_access;
+    $this->routeMatch = $route_match;
   }
 
   /**
-   * Adds a active theme negotiation service.
-   *
-   * @param \Drupal\Core\Theme\ThemeNegotiatorInterface $negotiator
-   *   The theme negotiator to add.
-   * @param int $priority
-   *   Priority of the theme negotiator.
+   * {@inheritdoc}
    */
   public function addNegotiator(ThemeNegotiatorInterface $negotiator, $priority) {
     $this->negotiators[$priority][] = $negotiator;
@@ -100,4 +105,11 @@ public function determineActiveTheme(RouteMatchInterface $route_match) {
     }
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getActiveTheme() {
+    return $this->determineActiveTheme($this->routeMatch);
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php
index 958a545..367740c 100644
--- a/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php
+++ b/core/tests/Drupal/Tests/Core/Theme/ThemeNegotiatorTest.php
@@ -34,11 +34,19 @@ class ThemeNegotiatorTest extends UnitTestCase {
    */
   protected $themeNegotiator;
 
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
   protected function setUp() {
     $this->themeAccessCheck = $this->getMockBuilder('\Drupal\Core\Theme\ThemeAccessCheck')
       ->disableOriginalConstructor()
       ->getMock();
-    $this->themeNegotiator = new ThemeNegotiator($this->themeAccessCheck);
+    $this->routeMatch = new RouteMatch('test_route', new Route('/test-route'), array(), array());
+    $this->themeNegotiator = new ThemeNegotiator($this->themeAccessCheck, $this->routeMatch);
   }
 
   /**
@@ -61,8 +69,7 @@ public function testDetermineActiveTheme() {
       ->method('checkAccess')
       ->will($this->returnValue(TRUE));
 
-    $route_match = new RouteMatch('test_route', new Route('/test-route'), array(), array());
-    $theme = $this->themeNegotiator->determineActiveTheme($route_match);
+    $theme = $this->themeNegotiator->determineActiveTheme($this->routeMatch);
 
     $this->assertEquals('example_test', $theme);
   }
@@ -95,8 +102,7 @@ public function testDetermineActiveThemeWithPriority() {
       ->method('checkAccess')
       ->will($this->returnValue(TRUE));
 
-    $route_match = new RouteMatch('test_route', new Route('/test-route'), array(), array());
-    $theme = $this->themeNegotiator->determineActiveTheme($route_match);
+    $theme = $this->themeNegotiator->determineActiveTheme($this->routeMatch);
 
     $this->assertEquals('example_test', $theme);
   }
@@ -137,8 +143,7 @@ public function testDetermineActiveThemeWithAccessCheck() {
       ->with('example_test2')
       ->will($this->returnValue(TRUE));
 
-    $route_match = new RouteMatch('test_route', new Route('/test-route'), array(), array());
-    $theme = $this->themeNegotiator->determineActiveTheme($route_match);
+    $theme = $this->themeNegotiator->determineActiveTheme($this->routeMatch);
 
     $this->assertEquals('example_test2', $theme);
   }
@@ -172,8 +177,7 @@ public function testDetermineActiveThemeWithNotApplyingNegotiator() {
       ->method('checkAccess')
       ->will($this->returnValue(TRUE));
 
-    $route_match = new RouteMatch('test_route', new Route('/test-route'), array(), array());
-    $theme = $this->themeNegotiator->determineActiveTheme($route_match);
+    $theme = $this->themeNegotiator->determineActiveTheme($this->routeMatch);
 
     $this->assertEquals('example_test2', $theme);
   }
