diff --git a/core/core.services.yml b/core/core.services.yml
index 3f68677200..39d95f48de 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -713,7 +713,7 @@ services:
     class: Stack\StackedHttpKernel
   http_kernel.basic:
     class: Symfony\Component\HttpKernel\HttpKernel
-    arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack']
+    arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack', '@controller_resolver']
   http_middleware.negotiation:
     class: Drupal\Core\StackMiddleware\NegotiationMiddleware
     tags:
diff --git a/core/lib/Drupal/Core/Controller/ControllerResolver.php b/core/lib/Drupal/Core/Controller/ControllerResolver.php
index c16a087449..ca9d3fd687 100644
--- a/core/lib/Drupal/Core/Controller/ControllerResolver.php
+++ b/core/lib/Drupal/Core/Controller/ControllerResolver.php
@@ -8,6 +8,7 @@
 use Psr\Http\Message\ServerRequestInterface;
 use Symfony\Bridge\PsrHttpMessage\HttpMessageFactoryInterface;
 use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface;
 use Symfony\Component\HttpKernel\Controller\ControllerResolver as BaseControllerResolver;
 
 /**
@@ -25,7 +26,7 @@
  *    controller by using a service:method notation (Symfony uses the same
  *    convention).
  */
-class ControllerResolver extends BaseControllerResolver implements ControllerResolverInterface {
+class ControllerResolver extends BaseControllerResolver implements ControllerResolverInterface, ArgumentResolverInterface {
 
   /**
    * The class resolver.
@@ -168,4 +169,23 @@ protected function doGetArguments(Request $request, $controller, array $paramete
     return $arguments;
   }
 
+  /**
+   * {@inheritdoc}
+   *
+   * @todo Consider using \Symfony\Component\HttpKernel\Controller\ArgumentResolver instead.
+   */
+  public function getArguments(Request $request, $controller) {
+    if (is_array($controller)) {
+      $r = new \ReflectionMethod($controller[0], $controller[1]);
+    }
+    elseif (is_object($controller) && !$controller instanceof \Closure) {
+      $r = new \ReflectionObject($controller);
+      $r = $r->getMethod('__invoke');
+    }
+    else {
+      $r = new \ReflectionFunction($controller);
+    }
+
+    return $this->doGetArguments($request, $controller, $r->getParameters());
+  }
 }
diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
index d96193e455..bc23e30e9d 100644
--- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
+++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
@@ -99,8 +99,6 @@ private function willBeIsolated($test) {
    */
   public static function getSkippedDeprecations() {
     return [
-      'As of 3.1 an Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface is used to resolve arguments. In 4.0 the $argumentResolver becomes the Symfony\Component\HttpKernel\Controller\ArgumentResolver if no other is provided instead of using the $resolver argument.',
-      'Symfony\Component\HttpKernel\Controller\ControllerResolver::getArguments is deprecated as of 3.1 and will be removed in 4.0. Implement the Symfony\Component\HttpKernel\Controller\ArgumentResolverInterface and inject it in the HttpKernel instead.',
       'The Twig_Node::getLine method is deprecated since version 1.27 and will be removed in 2.0. Use getTemplateLine() instead.',
       'The Twig_Environment::getCacheFilename method is deprecated since version 1.22 and will be removed in Twig 2.0.',
       'Install profile will be a mandatory parameter in Drupal 9.0.',
