diff --git a/core/core.services.yml b/core/core.services.yml
index 0ddf970ed4..45fca1de3b 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -723,7 +723,7 @@ services:
      class: Drupal\Core\Routing\CurrentRouteMatch
      arguments: ['@request_stack']
   event_dispatcher:
-    class: Drupal\Component\EventDispatcher\ContainerAwareEventDispatcher
+    class: Symfony\Component\EventDispatcher\EventDispatcher
     arguments: ['@service_container']
   app.root:
     class: \SplString
diff --git a/core/lib/Drupal/Component/DependencyInjection/Container.php b/core/lib/Drupal/Component/DependencyInjection/Container.php
index 127656539a..c3ddbebcee 100644
--- a/core/lib/Drupal/Component/DependencyInjection/Container.php
+++ b/core/lib/Drupal/Component/DependencyInjection/Container.php
@@ -456,6 +456,14 @@ protected function resolveServicesAndParameters($arguments) {
 
           continue;
         }
+        // Create service closure.
+        elseif ($type == 'service_closure') {
+          $arguments[$key] = function () use ($argument) {
+            return $this->get($argument->id, $argument->invalidBehavior);
+          };
+
+          continue;
+        }
         // Check for collection.
         elseif ($type == 'collection') {
           $value = $argument->value;
diff --git a/core/lib/Drupal/Component/DependencyInjection/Dumper/OptimizedPhpArrayDumper.php b/core/lib/Drupal/Component/DependencyInjection/Dumper/OptimizedPhpArrayDumper.php
index 889d266727..2931797ca0 100644
--- a/core/lib/Drupal/Component/DependencyInjection/Dumper/OptimizedPhpArrayDumper.php
+++ b/core/lib/Drupal/Component/DependencyInjection/Dumper/OptimizedPhpArrayDumper.php
@@ -3,6 +3,7 @@
 namespace Drupal\Component\DependencyInjection\Dumper;
 
 use Drupal\Component\Utility\Crypt;
+use Symfony\Component\DependencyInjection\Argument\ServiceClosureArgument;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Definition;
 use Symfony\Component\DependencyInjection\Parameter;
@@ -410,6 +411,9 @@ protected function dumpValue($value) {
     elseif ($value instanceof Parameter) {
       return $this->getParameterCall((string) $value);
     }
+    elseif ($value instanceof ServiceClosureArgument) {
+      return $this->getServiceClosure($value->getValues()[0]);
+    }
     elseif (is_string($value) && FALSE !== strpos($value, '%')) {
       if (preg_match('/^%([^%]+)%$/', $value, $matches)) {
         return $this->getParameterCall($matches[1]);
@@ -517,6 +521,23 @@ protected function getParameterCall($name) {
     ];
   }
 
+  /**
+   * Gets a service closure in a suitable PHP array format.
+   *
+   * @param \Symfony\Component\DependencyInjection\Reference $service
+   *   The service to get a reference for.
+   *
+   * @return object
+   *   A suitable representation of the parameter reference.
+   */
+  protected function getServiceClosure(Reference $service) {
+    return (object) [
+      'type' => 'service_closure',
+      'id' => (string) $service,
+      'invalidBehavior' => $service->getInvalidBehavior(),
+    ];
+  }
+
   /**
    * Whether this supports the machine-optimized format or not.
    *
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index 2c90f6fbc8..69c183759d 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -21,13 +21,13 @@
 use Drupal\Core\DependencyInjection\Compiler\ModifyServiceDefinitionsPass;
 use Drupal\Core\DependencyInjection\Compiler\MimeTypePass;
 use Drupal\Core\DependencyInjection\Compiler\TaggedHandlersPass;
-use Drupal\Core\DependencyInjection\Compiler\RegisterEventSubscribersPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterAccessChecksPass;
 use Drupal\Core\DependencyInjection\Compiler\RegisterServicesForDestructionPass;
 use Drupal\Core\Plugin\PluginManagerPass;
 use Drupal\Core\Render\MainContent\MainContentRenderersPass;
 use Drupal\Core\Site\Settings;
 use Symfony\Component\DependencyInjection\Compiler\PassConfig;
+use Symfony\Component\EventDispatcher\DependencyInjection\RegisterListenersPass;
 
 /**
  * ServiceProvider class for mandatory core services.
@@ -79,7 +79,7 @@ public function register(ContainerBuilder $container) {
     $container->addCompilerPass(new TwigExtensionPass());
 
     // Add a compiler pass for registering event subscribers.
-    $container->addCompilerPass(new RegisterEventSubscribersPass(), PassConfig::TYPE_AFTER_REMOVING);
+    $container->addCompilerPass(new RegisterListenersPass('event_dispatcher', 'event_listener', 'event_subscriber'), PassConfig::TYPE_AFTER_REMOVING);
 
     $container->addCompilerPass(new RegisterAccessChecksPass());
 
