diff --git a/core/core.services.yml b/core/core.services.yml
index 0fe0a7f..e8c171f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1240,6 +1240,9 @@ services:
       - [setThemeManager, ['@theme.manager']]
   authentication:
     class: Drupal\Core\Authentication\AuthenticationManager
+    arguments: ['@authentication_collector']
+  authentication_collector:
+    class: Drupal\Core\Authentication\AuthenticationCollector
     tags:
       - { name: service_collector, tag: authentication_provider, call: addProvider }
   authentication_subscriber:
diff --git a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
index ac50ae3..455e5a6 100644
--- a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
+++ b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
@@ -58,30 +58,20 @@ class AuthenticationManager implements AuthenticationProviderInterface, Authenti
   protected $challengers;
 
   /**
-   * List of providers which are allowed on routes with no _auth option.
-   *
-   * @var string[]
+   * @var \Drupal\Core\Authentication\AuthenticationCollectorInterface
    */
-  protected $globalProviders;
+  protected $authCollector;
 
-  /**
-   * {@inheritdoc}
-   */
-  public function addProvider(AuthenticationProviderInterface $provider, $provider_id, $priority = 0, $global = FALSE) {
-    $this->providers[$provider_id] = $provider;
-    $this->providerOrders[$priority][$provider_id] = $provider;
-    // Force the builders to be re-sorted.
-    $this->sortedProviders = NULL;
-
-    if ($provider instanceof AuthenticationProviderFilterInterface) {
-      $this->filters[$provider_id] = $provider;
-    }
-    if ($provider instanceof AuthenticationProviderChallengeInterface) {
-      $this->challengers[$provider_id] = $provider;
-    }
+  public function __construct(AuthenticationCollectorInterface $auth_collector) {
+    $this->authCollector = $auth_collector;
 
-    if ($global) {
-      $this->globalProviders[$provider_id] = TRUE;
+    foreach ($this->authCollector->getSortedProviders() as $provider_id => $provider) {
+      if ($provider instanceof AuthenticationProviderFilterInterface) {
+        $this->filters[$provider_id] = $provider;
+      }
+      if ($provider instanceof AuthenticationProviderChallengeInterface) {
+        $this->challengers[$provider_id] = $provider;
+      }
     }
   }
 
@@ -97,7 +87,8 @@ public function applies(Request $request) {
    */
   public function authenticate(Request $request) {
     $provider_id = $this->getProvider($request);
-    return $this->providers[$provider_id]->authenticate($request);
+    $provider = $this->authCollector->getProvider($provider_id);
+    return $provider->authenticate($request);
   }
 
   /**
@@ -110,7 +101,7 @@ public function appliesToRoutedRequest(Request $request, $authenticated) {
       $result = $this->applyFilter($request, $authenticated, $this->getProvider($request));
     }
     else {
-      foreach ($this->getSortedProviders() as $provider_id => $provider) {
+      foreach ($this->authCollector->getSortedProviders() as $provider_id => $provider) {
         if ($this->applyFilter($request, $authenticated, $provider_id)) {
           $result = TRUE;
           break;
@@ -142,7 +133,7 @@ public function challengeException(Request $request, \Exception $previous) {
    *   If no application detects appropriate credentials, then NULL is returned.
    */
   protected function getProvider(Request $request) {
-    foreach ($this->getSortedProviders() as $provider_id => $provider) {
+    foreach ($this->authCollector->getSortedProviders() as $provider_id => $provider) {
       if ($provider->applies($request)) {
         return $provider_id;
       }
@@ -161,7 +152,7 @@ protected function getProvider(Request $request) {
    */
   protected function getChallenger(Request $request) {
     if (!empty($this->challengers)) {
-      foreach ($this->getSortedProviders($request, FALSE) as $provider_id => $provider) {
+      foreach ($this->authCollector->getSortedProviders() as $provider_id => $provider) {
         if (isset($this->challengers[$provider_id]) && !$provider->applies($request) && $this->applyFilter($request, FALSE, $provider_id)) {
           return $provider_id;
         }
@@ -222,27 +213,8 @@ protected function defaultFilter(Request $request, $provider_id) {
       return in_array($provider_id, $route->getOption('_auth'));
     }
     else {
-      return isset($this->globalProviders[$provider_id]);
-    }
-  }
-
-  /**
-   * Returns the sorted array of authentication providers.
-   *
-   * @return \Drupal\Core\Authentication\AuthenticationProviderInterface[]
-   *   An array of authentication provider objects.
-   */
-  protected function getSortedProviders() {
-    if (!isset($this->sortedProviders)) {
-      // Sort the builders according to priority.
-      krsort($this->providerOrders);
-      // Merge nested providers from $this->providers into $this->sortedProviders.
-      $this->sortedProviders = array();
-      foreach ($this->providerOrders as $providers) {
-        $this->sortedProviders = array_merge($this->sortedProviders, $providers);
-      }
+      return $this->authCollector->isGlobal($provider_id);
     }
-    return $this->sortedProviders;
   }
 
 }
diff --git a/core/lib/Drupal/Core/Authentication/AuthenticationManagerInterface.php b/core/lib/Drupal/Core/Authentication/AuthenticationManagerInterface.php
index 2b8317b..d17f2ff 100644
--- a/core/lib/Drupal/Core/Authentication/AuthenticationManagerInterface.php
+++ b/core/lib/Drupal/Core/Authentication/AuthenticationManagerInterface.php
@@ -12,19 +12,4 @@
  */
 interface AuthenticationManagerInterface {
 
-  /**
-   * Adds a provider to the array of registered providers.
-   *
-   * @param \Drupal\Core\Authentication\AuthenticationProviderInterface $provider
-   *   The provider object.
-   * @param string $provider_id
-   *   Identifier of the provider.
-   * @param int $priority
-   *   (optional) The provider's priority.
-   * @param bool $global
-   *   (optional) TRUE if the provider is to be applied globally on all routes.
-   *   Defaults to FALSE.
-   */
-  public function addProvider(AuthenticationProviderInterface $provider, $provider_id, $priority = 0, $global = FALSE);
-
 }
diff --git a/core/tests/Drupal/Tests/Core/Authentication/AuthenticationManagerTest.php b/core/tests/Drupal/Tests/Core/Authentication/AuthenticationManagerTest.php
index da7331d..59812c6 100644
--- a/core/tests/Drupal/Tests/Core/Authentication/AuthenticationManagerTest.php
+++ b/core/tests/Drupal/Tests/Core/Authentication/AuthenticationManagerTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Tests\Core\Authentication;
 
+use Drupal\Core\Authentication\AuthenticationCollector;
 use Drupal\Core\Authentication\AuthenticationManager;
 use Drupal\Core\Authentication\AuthenticationProviderFilterInterface;
 use Drupal\Core\Authentication\AuthenticationProviderInterface;
@@ -20,7 +21,6 @@
  * @group Authentication
  */
 class AuthenticationManagerTest extends UnitTestCase {
-
   /**
    * @covers ::defaultFilter
    * @covers ::applyFilter
@@ -28,9 +28,11 @@ class AuthenticationManagerTest extends UnitTestCase {
    * @dataProvider providerTestDefaultFilter
    */
   public function testDefaultFilter($applies, $has_route, $auth_option, $provider_id, $global) {
-    $authentication_manager = new AuthenticationManager();
+    $auth_collector = new AuthenticationCollector();
     $auth_provider = $this->getMock('Drupal\Core\Authentication\AuthenticationProviderInterface');
-    $authentication_manager->addProvider($auth_provider, $provider_id, 0, $global);
+
+    $auth_collector->addProvider($auth_provider, $provider_id, 0, $global);
+    $authentication_manager = new AuthenticationManager($auth_collector);
 
     $request = new Request();
     if ($has_route) {
@@ -48,14 +50,16 @@ public function testDefaultFilter($applies, $has_route, $auth_option, $provider_
    * @covers ::applyFilter
    */
   public function testApplyFilterWithFilterprovider() {
-    $authentication_manager = new AuthenticationManager();
+    $authentication_collector = new AuthenticationCollector()
     $auth_provider = $this->getMock('Drupal\Tests\Core\Authentication\TestAuthenticationProviderInterface');
-    $authentication_manager->addProvider($auth_provider, 'filtered', 0);
-
     $auth_provider->expects($this->once())
       ->method('appliesToRoutedRequest')
       ->willReturn(TRUE);
 
+    $authentication_collector->addProvider($auth_provider, 'filtered', 0);
+
+    $authentication_manager = new AuthenticationManager($authentication_collector);
+
     $request = new Request();
     $this->assertTrue($authentication_manager->appliesToRoutedRequest($request, FALSE));
   }
