diff --git a/core/core.events.yml b/core/core.events.yml
new file mode 100644
index 0000000..7dcb4dc
--- /dev/null
+++ b/core/core.events.yml
@@ -0,0 +1,63 @@
+subscribers:
+  config.init:
+    - callback: Drupal\Core\EventSubscriber\ConfigGlobalOverrideSubscriber::configInit
+      priority: 30
+  config.importer.import:
+    - callback: Drupal\Core\EventSubscriber\ConfigSnapshotSubscriber::onConfigImporterImport
+      priority: 40
+  config.importer.validate:
+    - callback: Drupal\Core\EventSubscriber\ConfigImportSubscriber::onConfigImporterValidate
+      priority: 40
+  config.installer.validate:
+    - callback: Drupal\Core\EventSubscriber\ConfigImportSubscriber::onConfigImporterValidate
+      priority: 40
+  kernel.request:
+    # Priority must be higher than LanguageRequestSubscriber as LanguageManager
+    # access global $user in case language module enabled.
+    - callback: authentication_subscriber:onKernelRequestAuthenticate
+      priority: 300
+    - callback: language_request_subscriber:onKernelRequestLanguage
+      priority: 255
+    - callback: path_subscriber:onKernelRequestConvertPath
+      priority: 200
+    - callback: Drupal\Core\EventSubscriber\LegacyRequestSubscriber::onKernelRequestLegacy
+      priority: 90
+    - callback: Drupal\Core\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestDetermineSiteStatus
+      priority: 40
+    - callback: Drupal\Core\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestMaintenance
+      priority: 30
+    - callback: Drupal\Core\EventSubscriber\LegacyRequestSubscriber::onKernelRequestLegacyAfterRouting
+      priority: 30
+    - callback: access_subscriber:onKernelRequestAccessCheck
+      priority: 30
+    - callback: reverse_proxy_subscriber:onKernelRequestReverseProxyCheck
+      priority: 10
+    - Drupal\Core\Ajax\AjaxSubscriber::onKernelRequest
+    - slave_database_ignore__subscriber:checkSlaveServer
+  kernel.response:
+    - finish_response_subscriber:onRespond
+    - redirect_response_subscriber:checkRedirectUrl
+    - authentication_subscriber:onRespond
+    - callback: Drupal\Core\EventSubscriber\AjaxResponseSubscriber::onResponse
+      priority: -100
+  kernel.exception:
+    - authentication_subscriber:onException
+  kernel.view:
+    - view_subscriber:onView
+  kernel.terminate:
+    - callback: path_subscriber:onKernelTerminate
+      priority: 200
+    - callback: request_close_subscriber:onTerminate
+      priority: 100
+    - callback: kernel_destruct_subscriber:onKernelTerminate
+      priority: 100
+  routing.route_alter:
+    - route_subscriber.module:onAlterRoutes
+    - route_special_attributes_subscriber:onAlterRoutes
+    - callback: route_subscriber.entity:onRoutingRouteAlterSetType
+      priority: -150
+    - callback: paramconverter_subscriber:onRoutingRouteAlterSetParameterConverters
+      priority: -200
+    - callback: access_route_subscriber:onRoutingRouteAlterSetAccessCheck
+      # Setting very low priority to ensure access checks are run after alters.
+      priority: -1000
diff --git a/core/core.services.yml b/core/core.services.yml
index 8f2965a..5cf432d 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -341,8 +341,6 @@ services:
       - { name: route_enhancer }
   paramconverter_subscriber:
     class: Drupal\Core\EventSubscriber\ParamConverterSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@paramconverter_manager']
   paramconverter.entity:
     class: Drupal\Core\ParamConverter\EntityConverter
@@ -351,23 +349,13 @@ services:
     arguments: ['@entity.manager']
   route_subscriber.module:
     class: Drupal\Core\EventSubscriber\ModuleRouteSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@module_handler']
   route_subscriber.entity:
     class: Drupal\Core\EventSubscriber\EntityRouteAlterSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@entity.manager']
   reverse_proxy_subscriber:
     class: Drupal\Core\EventSubscriber\ReverseProxySubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@settings']
-  ajax_response_subscriber:
-    class: Drupal\Core\EventSubscriber\AjaxResponseSubscriber
-    tags:
-      - { name: event_subscriber }
   route_enhancer.authentication:
     class: Drupal\Core\Routing\Enhancer\AuthenticationEnhancer
     calls:
@@ -398,8 +386,6 @@ services:
       - { name: route_enhancer, priority: 10 }
   route_special_attributes_subscriber:
     class: Drupal\Core\EventSubscriber\SpecialAttributesRouteSubscriber
-    tags:
-      - { name: event_subscriber }
   controller.page:
     class: Drupal\Core\Controller\HtmlPageController
     arguments: ['@http_kernel', '@controller_resolver', '@string_translation', '@title_resolver']
@@ -415,8 +401,6 @@ services:
     class: Drupal\Core\ContentNegotiation
   view_subscriber:
     class: Drupal\Core\EventSubscriber\ViewSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@content_negotiation', '@title_resolver']
   private_key:
     class: Drupal\Core\PrivateKey
@@ -437,12 +421,8 @@ services:
     arguments: ['@access_manager', '@current_user']
     calls:
       - [setCurrentUser, ['@?current_user']]
-    tags:
-      - { name: event_subscriber }
   access_route_subscriber:
     class: Drupal\Core\EventSubscriber\AccessRouteSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@access_manager']
   access_check.default:
     class: Drupal\Core\Access\DefaultAccessCheck
@@ -471,53 +451,27 @@ services:
     tags:
       - { name: access_check }
     arguments: ['@csrf_token']
-  maintenance_mode_subscriber:
-    class: Drupal\Core\EventSubscriber\MaintenanceModeSubscriber
-    tags:
-      - { name: event_subscriber }
   path_subscriber:
     class: Drupal\Core\EventSubscriber\PathSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@path.alias_manager.cached', '@path_processor_manager']
   legacy_request_subscriber:
     class: Drupal\Core\EventSubscriber\LegacyRequestSubscriber
-    tags:
-      - { name: event_subscriber }
   finish_response_subscriber:
     class: Drupal\Core\EventSubscriber\FinishResponseSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@language_manager']
     scope: request
   redirect_response_subscriber:
     class: Drupal\Core\EventSubscriber\RedirectResponseSubscriber
     arguments: ['@url_generator']
-    tags:
-      - { name: event_subscriber }
     scope: request
   request_close_subscriber:
     class: Drupal\Core\EventSubscriber\RequestCloseSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@module_handler']
-  config_global_override_subscriber:
-    class: Drupal\Core\EventSubscriber\ConfigGlobalOverrideSubscriber
-    tags:
-      - { name: event_subscriber }
-  config_import_subscriber:
-    class: Drupal\Core\EventSubscriber\ConfigImportSubscriber
-    tags:
-      - { name: event_subscriber }
   config_snapshot_subscriber:
     class: Drupal\Core\EventSubscriber\ConfigSnapshotSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@config.storage', '@config.storage.snapshot']
   language_request_subscriber:
     class: Drupal\Core\EventSubscriber\LanguageRequestSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@language_manager', '@string_translation']
   exception_controller:
     class: Drupal\Core\Controller\ExceptionController
@@ -567,14 +521,8 @@ services:
     parent: default_plugin_manager
   kernel_destruct_subscriber:
     class: Drupal\Core\EventSubscriber\KernelDestructionSubscriber
-    tags:
-      - { name: event_subscriber }
     calls:
       - [setContainer, ['@service_container']]
-  ajax.subscriber:
-    class: Drupal\Core\Ajax\AjaxSubscriber
-    tags:
-      - { name: event_subscriber }
   image.toolkit.manager:
     class: Drupal\Core\ImageToolkit\ImageToolkitManager
     arguments: ['@container.namespaces', '@cache.cache', '@language_manager', '@config.factory']
@@ -596,8 +544,6 @@ services:
     arguments: ['@database']
   slave_database_ignore__subscriber:
     class: Drupal\Core\EventSubscriber\SlaveDatabaseIgnoreSubscriber
-    tags:
-      - {name: event_subscriber}
   country_manager:
     class: Drupal\Core\Locale\CountryManager
     arguments: ['@module_handler']
@@ -671,8 +617,6 @@ services:
       - { name: authentication_provider, priority: 0 }
   authentication_subscriber:
     class: Drupal\Core\EventSubscriber\AuthenticationSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@authentication']
   current_user:
     class: Drupal\Core\Session\AccountInterface
diff --git a/core/lib/Drupal/Core/Ajax/AjaxSubscriber.php b/core/lib/Drupal/Core/Ajax/AjaxSubscriber.php
index 595d64e..a08d639 100644
--- a/core/lib/Drupal/Core/Ajax/AjaxSubscriber.php
+++ b/core/lib/Drupal/Core/Ajax/AjaxSubscriber.php
@@ -7,9 +7,7 @@
 
 namespace Drupal\Core\Ajax;
 
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Subscribes to the kernel request event to add the Ajax media type.
@@ -17,7 +15,7 @@
  * @param \Symfont\Component\HttpKernel\Event\GetResponseEvent $event
  *   The event to process.
  */
-class AjaxSubscriber implements EventSubscriberInterface {
+class AjaxSubscriber {
 
   /**
    * Registers Ajax formats with the Request class.
@@ -29,15 +27,4 @@ public function onKernelRequest(GetResponseEvent $event) {
     $request->setFormat('drupal_modal', 'application/vnd.drupal-modal');
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents(){
-    $events[KernelEvents::REQUEST][] = array('onKernelRequest', 50);
-    return $events;
-  }
-
 }
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index 098b165..b9e42ef 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -8,6 +8,7 @@
 namespace Drupal\Core;
 
 use Drupal\Core\Cache\ListCacheBinsPass;
+use Drupal\Core\EventListenerPass;
 use Drupal\Core\DependencyInjection\ServiceProviderInterface;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\DependencyInjection\Compiler\ModifyServiceDefinitionsPass;
@@ -57,6 +58,7 @@ public function register(ContainerBuilder $container) {
     $container->addCompilerPass(new RegisterRouteFiltersPass());
     // Add a compiler pass for registering event subscribers.
     $container->addCompilerPass(new RegisterKernelListenersPass(), PassConfig::TYPE_AFTER_REMOVING);
+    $container->addCompilerPass(new EventListenerPass(), PassConfig::TYPE_AFTER_REMOVING);
     $container->addCompilerPass(new RegisterAccessChecksPass());
     // Add a compiler pass for upcasting route parameters.
     $container->addCompilerPass(new RegisterParamConvertersPass());
diff --git a/core/lib/Drupal/Core/EventListenerPass.php b/core/lib/Drupal/Core/EventListenerPass.php
new file mode 100644
index 0000000..21c97b9
--- /dev/null
+++ b/core/lib/Drupal/Core/EventListenerPass.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\EventListenerPass
+ */
+
+namespace Drupal\Core;
+
+use Drupal\Component\Discovery\YamlDiscovery;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Definition;
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+
+class EventListenerPass implements CompilerPassInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(ContainerBuilder $container) {
+    if (!$container->hasDefinition('event_dispatcher')) {
+      return;
+    }
+
+    $event_dispatcher_definition = $container->getDefinition('event_dispatcher');
+    $module_handler = $container->get('module_handler');
+
+    $this->findListeners($container, $event_dispatcher_definition, $module_handler);
+  }
+
+  /**
+   * Find the event listeners in event.yml files and add it to the container.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerBuilder $container
+   *   The container to add event services to.
+   * @param \Symfony\Component\DependencyInjection\Definition $event_dispatcher_definition
+   *   The event dispatcher service definition.
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler to get the module directories from.
+   */
+  protected function findListeners(ContainerBuilder $container, Definition $event_dispatcher_definition, ModuleHandlerInterface $module_handler) {
+    foreach ($this->getYamlDiscovery($module_handler)->findAll() as $info) {
+      foreach ($info['subscribers'] as $event_id => $listeners) {
+        foreach ($listeners as $listener) {
+          list($add_method, $args) = $this->prepareListener($container, $event_id, $listener);
+          $event_dispatcher_definition->addMethodCall($add_method, $args);
+        }
+      }
+    }
+  }
+
+  protected function prepareListener(ContainerBuilder $container, $event_id, $listener) {
+    if (is_array($listener)) {
+      $callback = $listener['callback'];
+      if (isset($listener['priority'])) {
+        $priority = $listener['priority'];
+      }
+    }
+    else {
+      $callback = $listener;
+    }
+
+    $callback_parts = $this->parseCallback($callback);
+    $method = $callback_parts['method'];
+    if (isset($callback_parts['class'])) {
+      $callback_parts['service'] = $this->defineService($container, $callback_parts['class']);
+    }
+    $args = array($event_id, array($callback_parts['service'], $method));
+    $add_method = 'addListenerService';
+
+    if (isset($priority)) {
+      $args[] = $priority;
+    }
+    return array($add_method, $args);
+  }
+
+  protected function defineService(ContainerBuilder $container, $class) {
+    $definition = new Definition();
+    $definition->setClass($class);
+    $name = 'event_listener.' . str_replace("\\", '.', $class);
+    $container->setDefinition($name, $definition);
+    return $name;
+  }
+
+  protected function parseCallback($callback) {
+    // TODO: This logic should abstracted somewhere.
+
+    // Callback in the service:method notation.
+    $count = substr_count($callback, ':');
+    if ($count == 1) {
+      list($service, $method) = explode(':', $callback, 2);
+      return array('service' => $service, 'method' => $method);
+    }
+
+    // Callback in the class::method notation.
+    if (strpos($callback, '::') !== FALSE) {
+      list($class, $method) = explode('::', $callback, 2);
+      if (!class_exists($class)) {
+        throw new \InvalidArgumentException(sprintf('Class "%s" does not exist.', $class));
+      }
+      return array('class' => $class, 'method' => $method);
+    }
+    else {
+      throw new \LogicException(sprintf('Unable to parse the callback name "%s".', $callback));
+    }
+  }
+
+  /**
+   * Returns the YAML discovery for getting all the .routing.yml files.
+   *
+   * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
+   *   The module handler.
+   *
+   * @return \Drupal\Component\Discovery\YamlDiscovery
+   *   The yaml discovery.
+   */
+  protected function getYamlDiscovery(ModuleHandlerInterface $module_handler) {
+    if (!isset($this->yamlDiscovery)) {
+      $this->yamlDiscovery = new YamlDiscovery('events', array('core' => DRUPAL_ROOT . '/core') + $module_handler->getModuleDirectories());
+    }
+    return $this->yamlDiscovery;
+  }
+
+}
+
diff --git a/core/lib/Drupal/Core/EventSubscriber/AccessRouteSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AccessRouteSubscriber.php
index dee7d32..61999a5 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AccessRouteSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AccessRouteSubscriber.php
@@ -9,13 +9,11 @@
 
 use Drupal\Core\Access\AccessManager;
 use Drupal\Core\Routing\RouteBuildEvent;
-use Drupal\Core\Routing\RoutingEvents;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Provides a subscriber to set access checkers on route building.
  */
-class AccessRouteSubscriber implements EventSubscriberInterface {
+class AccessRouteSubscriber {
 
   /**
    * The access manager.
@@ -45,17 +43,4 @@ public function onRoutingRouteAlterSetAccessCheck(RouteBuildEvent $event) {
     $this->accessManager->setChecks($event->getRouteCollection());
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    // Setting very low priority to ensure access checks are run after alters.
-    $events[RoutingEvents::ALTER][] = array('onRoutingRouteAlterSetAccessCheck', -1000);
-
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
index 0c31999..4f2aecb 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AccessSubscriber.php
@@ -10,16 +10,13 @@
 use Drupal\Core\Access\AccessManager;
 use Drupal\Core\Session\AccountInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
-use Symfony\Component\HttpKernel\HttpKernelInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 
 /**
  * Access subscriber for controller requests.
  */
-class AccessSubscriber implements EventSubscriberInterface {
+class AccessSubscriber {
 
   /**
    * The current user.
@@ -98,16 +95,4 @@ public function setCurrentUser(AccountInterface $current_user = NULL) {
     $this->currentUser = $current_user;
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestAccessCheck', 30);
-
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/AjaxResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AjaxResponseSubscriber.php
index cf4dca1..1fe3a6a 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AjaxResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AjaxResponseSubscriber.php
@@ -8,12 +8,9 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\Ajax\AjaxResponse;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
-use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
 
-class AjaxResponseSubscriber implements EventSubscriberInterface {
+class AjaxResponseSubscriber {
 
   /**
    * Renders the ajax commands right before preparing the result.
@@ -28,13 +25,4 @@ public function onResponse(FilterResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[KernelEvents::RESPONSE][] = array('onResponse', -100);
-
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/AuthenticationSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/AuthenticationSubscriber.php
index 5bdf61c..91041cf 100644
--- a/core/lib/Drupal/Core/EventSubscriber/AuthenticationSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/AuthenticationSubscriber.php
@@ -9,18 +9,16 @@
 
 use Drupal\Core\Authentication\AuthenticationProviderInterface;
 use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 use Symfony\Component\HttpKernel\Event\GetResponseForExceptionEvent;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Authentication subscriber.
  *
  * Trigger authentication and cleanup during the request.
  */
-class AuthenticationSubscriber implements EventSubscriberInterface {
+class AuthenticationSubscriber {
 
   /**
    * Authentication provider.
@@ -74,20 +72,4 @@ public function onException(GetResponseForExceptionEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   *
-   * The priority for request must be higher than the highest event subscriber
-   * accessing the global $user.
-   * The priority for the response must be as low as possible allowing e.g the
-   * Cookie provider to send all relevant session data to the user.
-   */
-  public static function getSubscribedEvents() {
-    // Priority must be higher than LanguageRequestSubscriber as LanguageManager
-    // access global $user in case language module enabled.
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestAuthenticate', 300);
-    $events[KernelEvents::RESPONSE][] = array('onRespond', 0);
-    $events[KernelEvents::EXCEPTION][] = array('onException', 0);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/ConfigGlobalOverrideSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ConfigGlobalOverrideSubscriber.php
index 02bf2cb..c3dee4e 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ConfigGlobalOverrideSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ConfigGlobalOverrideSubscriber.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\Core\EventSubscriber;
 
-use Drupal\Core\Config\Config;
 use Drupal\Core\Config\ConfigEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Defines a configuration global override for contexts.
  */
-class ConfigGlobalOverrideSubscriber implements EventSubscriberInterface {
+class ConfigGlobalOverrideSubscriber {
 
   /**
    * Overrides configuration values with values in global $conf variable.
@@ -31,12 +29,4 @@ public function configInit(ConfigEvent $event) {
     }
   }
 
-  /**
-   * Implements EventSubscriberInterface::getSubscribedEvents().
-   */
-  static function getSubscribedEvents() {
-    $events['config.init'][] = array('configInit', 30);
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
index 6283dae..dcefa99 100644
--- a/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/EntityRouteAlterSubscriber.php
@@ -8,7 +8,6 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\Entity\EntityManagerInterface;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Drupal\Core\Routing\RoutingEvents;
 use Drupal\Core\Routing\RouteBuildEvent;
 
@@ -23,7 +22,7 @@
  *   kind of PHP variable (e.g., a type hinted interface) the controller
  *   requires: https://drupal.org/node/2041907.
  */
-class EntityRouteAlterSubscriber implements EventSubscriberInterface {
+class EntityRouteAlterSubscriber {
 
   /**
    * Entity manager.
@@ -68,11 +67,4 @@ public function onRoutingRouteAlterSetType(RouteBuildEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[RoutingEvents::ALTER][] = array('onRoutingRouteAlterSetType', -150);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
index 112644f..61d2b76 100644
--- a/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/FinishResponseSubscriber.php
@@ -10,14 +10,12 @@
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageManager;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Response subscriber to handle finished responses.
  */
-class FinishResponseSubscriber implements EventSubscriberInterface {
+class FinishResponseSubscriber {
 
   /**
    * The LanguageManager object for retrieving the correct language code.
@@ -110,14 +108,4 @@ public function onRespond(FilterResponseEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::RESPONSE][] = array('onRespond');
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
index e71f5ca..240c8a8 100644
--- a/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/KernelDestructionSubscriber.php
@@ -8,14 +8,12 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Symfony\Component\DependencyInjection\ContainerAware;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
  * Destructs services that are initiated and tagged with "needs_destruction".
  */
-class KernelDestructionSubscriber extends ContainerAware implements EventSubscriberInterface {
+class KernelDestructionSubscriber extends ContainerAware {
 
   /**
    * Holds an array of service ID's that will require destruction.
@@ -54,14 +52,4 @@ public function onKernelTerminate(PostResponseEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::TERMINATE][] = array('onKernelTerminate', 100);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
index 39aad11..2117c78 100644
--- a/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/MaintenanceModeSubscriber.php
@@ -9,14 +9,12 @@
 
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Maintenance mode subscriber for controller requests.
  */
-class MaintenanceModeSubscriber implements EventSubscriberInterface {
+class MaintenanceModeSubscriber {
 
   /**
    * Determine whether the page is configured to be offline.
@@ -58,14 +56,4 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    // In order to change the maintenance status an event subscriber with a
-    // priority between 30 and 40 should be added.
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestDetermineSiteStatus', 40);
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestMaintenance', 30);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php
index 7d385f5..701c82b 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php
@@ -8,14 +8,13 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\ParamConverter\ParamConverterManager;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Drupal\Core\Routing\RoutingEvents;
 use Drupal\Core\Routing\RouteBuildEvent;
 
 /**
  * Event subscriber for registering parameter converters with routes.
  */
-class ParamConverterSubscriber implements EventSubscriberInterface {
+class ParamConverterSubscriber {
 
   /**
    * The parameter converter manager.
@@ -45,11 +44,4 @@ public function onRoutingRouteAlterSetParameterConverters(RouteBuildEvent $event
     $this->paramConverterManager->setRouteParameterConverters($event->getRouteCollection());
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[RoutingEvents::ALTER][] = array('onRoutingRouteAlterSetParameterConverters', -200);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php
index 5f4563e..c9753b9 100644
--- a/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/PathSubscriber.php
@@ -77,7 +77,6 @@ public function onKernelTerminate(PostResponseEvent $event) {
    *   An array of event listener definitions.
    */
   static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestConvertPath', 200);
     $events[KernelEvents::TERMINATE][] = array('onKernelTerminate', 200);
     return $events;
   }
diff --git a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
index 6cc7916..bfc20c0 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RedirectResponseSubscriber.php
@@ -8,16 +8,13 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\Routing\UrlGeneratorInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
-use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
 use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Allows manipulation of the response object when performing a redirect.
  */
-class RedirectResponseSubscriber implements EventSubscriberInterface {
+class RedirectResponseSubscriber {
 
   /**
    * The url generator service.
@@ -39,7 +36,7 @@ public function __construct(UrlGeneratorInterface $url_generator) {
   /**
    * Allows manipulation of the response object when performing a redirect.
    *
-   * @param Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
+   * @param \Symfony\Component\HttpKernel\Event\FilterResponseEvent $event
    *   The Event to process.
    */
   public function checkRedirectUrl(FilterResponseEvent $event) {
@@ -68,14 +65,4 @@ public function checkRedirectUrl(FilterResponseEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::RESPONSE][] = array('checkRedirectUrl');
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/RequestCloseSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RequestCloseSubscriber.php
index 764635e..8b57bb2 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RequestCloseSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RequestCloseSubscriber.php
@@ -9,14 +9,12 @@
 
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Extension\CachedModuleHandlerInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\PostResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Subscriber for all responses.
  */
-class RequestCloseSubscriber implements EventSubscriberInterface {
+class RequestCloseSubscriber {
 
   /**
    * @var \Drupal\Core\Extension\ModuleHandlerInterface
@@ -48,15 +46,4 @@ public function onTerminate(PostResponseEvent $event) {
     system_run_automated_cron();
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::TERMINATE][] = array('onTerminate', 100);
-
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/SlaveDatabaseIgnoreSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/SlaveDatabaseIgnoreSubscriber.php
index e10ce04..4568adc 100644
--- a/core/lib/Drupal/Core/EventSubscriber/SlaveDatabaseIgnoreSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/SlaveDatabaseIgnoreSubscriber.php
@@ -8,14 +8,12 @@
 namespace Drupal\Core\EventSubscriber;
 
 use Drupal\Core\Database\Database;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * System subscriber for controller requests.
  */
-class SlaveDatabaseIgnoreSubscriber implements EventSubscriberInterface {
+class SlaveDatabaseIgnoreSubscriber {
 
   /**
    * Checks and disables the slave database server if appropriate.
@@ -49,12 +47,4 @@ public function checkSlaveServer(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('checkSlaveServer');
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
index cad587b..0ed656e 100644
--- a/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
+++ b/core/lib/Drupal/Core/ParamConverter/ParamConverterManager.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\ParamConverter;
 
+use Drupal\Core\Routing\RouteBuildEvent;
 use Symfony\Component\DependencyInjection\ContainerAware;
 use Symfony\Cmf\Component\Routing\Enhancer\RouteEnhancerInterface;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@@ -193,5 +194,15 @@ public function enhance(array $defaults, Request $request) {
     return $defaults;
   }
 
+  /**
+   * Applies parameter converters to route parameters.
+   *
+   * @param \Drupal\Core\Routing\RouteBuildEvent $event
+   *   The event to process.
+   */
+  public function onRoutingRouteAlterSetParameterConverters(RouteBuildEvent $event) {
+    $this->setRouteParameterConverters($event->getRouteCollection());
+  }
+
 }
 
diff --git a/core/modules/ban/ban.events.yml b/core/modules/ban/ban.events.yml
new file mode 100644
index 0000000..16d75ab
--- /dev/null
+++ b/core/modules/ban/ban.events.yml
@@ -0,0 +1,4 @@
+subscribers:
+  kernel.request:
+    - callback: ban.subscriber:onKernelRequestBannedIpCheck
+      priority: 40
diff --git a/core/modules/ban/ban.services.yml b/core/modules/ban/ban.services.yml
index 7f55ae6..42dab8a 100644
--- a/core/modules/ban/ban.services.yml
+++ b/core/modules/ban/ban.services.yml
@@ -4,6 +4,4 @@ services:
     arguments: ['@database']
   ban.subscriber:
     class: Drupal\ban\EventSubscriber\BanSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@ban.ip_manager']
diff --git a/core/modules/ban/lib/Drupal/ban/EventSubscriber/BanSubscriber.php b/core/modules/ban/lib/Drupal/ban/EventSubscriber/BanSubscriber.php
index 6807cce..f1733af 100644
--- a/core/modules/ban/lib/Drupal/ban/EventSubscriber/BanSubscriber.php
+++ b/core/modules/ban/lib/Drupal/ban/EventSubscriber/BanSubscriber.php
@@ -8,16 +8,14 @@
 namespace Drupal\ban\EventSubscriber;
 
 use Symfony\Component\HttpFoundation\Response;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 use Drupal\ban\BanIpManager;
 
 /**
  * Ban subscriber for controller requests.
  */
-class BanSubscriber implements EventSubscriberInterface {
+class BanSubscriber {
 
   /**
    * The manager used to check the IP against.
@@ -50,15 +48,4 @@ public function onKernelRequestBannedIpCheck(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestBannedIpCheck', 40);
-    return $events;
-  }
-
 }
diff --git a/core/modules/hal/hal.events.yml b/core/modules/hal/hal.events.yml
new file mode 100644
index 0000000..8e820f1
--- /dev/null
+++ b/core/modules/hal/hal.events.yml
@@ -0,0 +1,4 @@
+subscribers:
+  kernel.request:
+    - callback: Drupal\hal\HalSubscriber::onKernelRequest
+      priority: 40
diff --git a/core/modules/hal/hal.services.yml b/core/modules/hal/hal.services.yml
index 7f3e405..45b06a7 100644
--- a/core/modules/hal/hal.services.yml
+++ b/core/modules/hal/hal.services.yml
@@ -28,7 +28,3 @@ services:
     class: Drupal\hal\Encoder\JsonEncoder
     tags:
       - { name: encoder, priority: 10, format: hal_json }
-  hal.subscriber:
-    class: Drupal\hal\HalSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/hal/lib/Drupal/hal/HalSubscriber.php b/core/modules/hal/lib/Drupal/hal/HalSubscriber.php
index 93a70bb..40f8760 100644
--- a/core/modules/hal/lib/Drupal/hal/HalSubscriber.php
+++ b/core/modules/hal/lib/Drupal/hal/HalSubscriber.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\hal;
 
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Subscribes to the kernel request event to add HAL media types.
  */
-class HalSubscriber implements EventSubscriberInterface {
+class HalSubscriber {
 
   /**
    * Registers HAL formats with the Request class.
@@ -27,15 +25,4 @@ public function onKernelRequest(GetResponseEvent $event) {
     $request->setFormat('hal_json', 'application/hal+json');
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequest', 40);
-    return $events;
-  }
-
 }
diff --git a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
index 11fa899..9b64b99 100644
--- a/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
+++ b/core/modules/locale/lib/Drupal/locale/LocaleConfigSubscriber.php
@@ -13,10 +13,7 @@
 use Drupal\Core\Config\StorageDispatcher;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Language\LanguageManager;
-use Symfony\Component\HttpKernel\HttpKernelInterface;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 
 /**
@@ -24,7 +21,7 @@
  *
  * $config is always a DrupalConfig object.
  */
-class LocaleConfigSubscriber implements EventSubscriberInterface {
+class LocaleConfigSubscriber {
 
   /**
    * The language manager.
@@ -128,15 +125,4 @@ public function getLocaleConfigName($name, Language $language) {
     return 'locale.config.' . $language->id . '.' . $name;
   }
 
-  /**
-   * Implements EventSubscriberInterface::getSubscribedEvents().
-   */
-  static function getSubscribedEvents() {
-    $events['config.context'][] = array('configContext', 20);
-    $events['config.load'][] = array('configLoad', 20);
-    // Set the priority above the one from the RouteListener (priority 32)
-    // so ensure that the context is cleared before the routing system steps in.
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestSetDefaultConfigContextLocale', 48);
-    return $events;
-  }
 }
diff --git a/core/modules/locale/locale.events.yml b/core/modules/locale/locale.events.yml
new file mode 100644
index 0000000..54d5279
--- /dev/null
+++ b/core/modules/locale/locale.events.yml
@@ -0,0 +1,12 @@
+subscribers:
+  config.context:
+    - callback: locale_config_subscriber:configContext
+      priority: 20
+  config.load:
+    - callback: locale_config_subscriber:configLoad
+      priority: 20
+  kernel.request:
+    # Set the priority above the one from the RouteListener (priority 32)
+    # so ensure that the context is cleared before the routing system steps in.
+    - callback: locale_config_subscriber:onKernelRequestSetDefaultConfigContextLocale
+      priority: 48
diff --git a/core/modules/locale/locale.services.yml b/core/modules/locale/locale.services.yml
index f831989..223fc29 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -1,8 +1,6 @@
 services:
   locale_config_subscriber:
     class: Drupal\locale\LocaleConfigSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@language_manager', '@config.context']
   paramconverter.configentity_admin:
     class: Drupal\locale\ParamConverter\LocaleAdminPathConfigEntityConverter
diff --git a/core/modules/system/tests/modules/form_test/form_test.events.yml b/core/modules/system/tests/modules/form_test/form_test.events.yml
new file mode 100644
index 0000000..56967e1
--- /dev/null
+++ b/core/modules/system/tests/modules/form_test/form_test.events.yml
@@ -0,0 +1,3 @@
+subscribers:
+  kernel.request:
+    - Drupal\form_test\EventSubscriber\FormTestEventSubscriber::onKernelRequest
diff --git a/core/modules/system/tests/modules/form_test/form_test.services.yml b/core/modules/system/tests/modules/form_test/form_test.services.yml
index 0201650..42ae7a6 100644
--- a/core/modules/system/tests/modules/form_test/form_test.services.yml
+++ b/core/modules/system/tests/modules/form_test/form_test.services.yml
@@ -1,7 +1,3 @@
 services:
   form_test.form.serviceform:
     class: Drupal\form_test\FormTestServiceObject
-  form_test.event_subscriber:
-    class: Drupal\form_test\EventSubscriber\FormTestEventSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/EventSubscriber/FormTestEventSubscriber.php b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/EventSubscriber/FormTestEventSubscriber.php
index d560f18..d6319ce 100644
--- a/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/EventSubscriber/FormTestEventSubscriber.php
+++ b/core/modules/system/tests/modules/form_test/lib/Drupal/form_test/EventSubscriber/FormTestEventSubscriber.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\form_test\EventSubscriber;
 
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
  * Test event subscriber to add new attributes to the request.
  */
-class FormTestEventSubscriber implements EventSubscriberInterface {
+class FormTestEventSubscriber {
 
   /**
    * Adds custom attributes to the request object.
@@ -28,12 +26,4 @@ public function onKernelRequest(GetResponseEvent $event) {
     $request->attributes->set('request_attribute', 'request_value');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequest');
-    return $events;
-  }
-
 }
diff --git a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/EventSubscriber/MaintenanceModeSubscriber.php b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/EventSubscriber/MaintenanceModeSubscriber.php
index 2071a37..9475b58 100644
--- a/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/EventSubscriber/MaintenanceModeSubscriber.php
+++ b/core/modules/system/tests/modules/menu_test/lib/Drupal/menu_test/EventSubscriber/MaintenanceModeSubscriber.php
@@ -7,14 +7,12 @@
 
 namespace Drupal\menu_test\EventSubscriber;
 
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
  * Maintenance mode subscriber to set site online on a test.
  */
-class MaintenanceModeSubscriber implements EventSubscriberInterface {
+class MaintenanceModeSubscriber {
 
   /**
    * Set the page online if called from a certain path.
@@ -30,12 +28,4 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestMaintenance', 35);
-    return $events;
-  }
-
 }
diff --git a/core/modules/system/tests/modules/menu_test/menu_test.events.yml b/core/modules/system/tests/modules/menu_test/menu_test.events.yml
new file mode 100644
index 0000000..e4d8127
--- /dev/null
+++ b/core/modules/system/tests/modules/menu_test/menu_test.events.yml
@@ -0,0 +1,5 @@
+subscribers:
+  kernel.request:
+    - callback: Drupal\menu_test\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestMaintenance
+      priority: 35
+    - menu_test.active_trail_subscriber:onKernelRequest
diff --git a/core/modules/system/tests/modules/menu_test/menu_test.services.yml b/core/modules/system/tests/modules/menu_test/menu_test.services.yml
index 3de0169..e313280 100644
--- a/core/modules/system/tests/modules/menu_test/menu_test.services.yml
+++ b/core/modules/system/tests/modules/menu_test/menu_test.services.yml
@@ -1,14 +1,7 @@
 services:
-  menu_test_maintenance_mode_subscriber:
-    class: Drupal\menu_test\EventSubscriber\MaintenanceModeSubscriber
-    tags:
-      - { name: event_subscriber }
-
   menu_test.active_trail_subscriber:
     class: Drupal\menu_test\EventSubscriber\ActiveTrailSubscriber
     arguments: ['@state']
-    tags:
-      - { name: event_subscriber }
 
   theme.negotiator.test_theme:
     class: Drupal\menu_test\Theme\TestThemeNegotiator
diff --git a/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php b/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php
index 9078493..f1469c9 100644
--- a/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php
+++ b/core/modules/system/tests/modules/service_provider_test/lib/Drupal/service_provider_test/TestClass.php
@@ -9,11 +9,9 @@
 
 use Drupal\Core\KeyValueStore\StateInterface;
 use Drupal\Core\DestructableInterface;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 
-class TestClass implements EventSubscriberInterface, DestructableInterface {
+class TestClass implements DestructableInterface {
 
   /**
    * The state keyvalue collection.
@@ -40,17 +38,6 @@ public function onKernelRequestTest(GetResponseEvent $event) {
   }
 
   /**
-   * Registers methods as kernel listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestTest', 100);
-    return $events;
-  }
-
-  /**
    * Implements \Drupal\Core\DestructableInterface::destruct().
    */
   public function destruct() {
diff --git a/core/modules/system/tests/modules/service_provider_test/service_provider_test.events.yml b/core/modules/system/tests/modules/service_provider_test/service_provider_test.events.yml
new file mode 100644
index 0000000..22d02c3
--- /dev/null
+++ b/core/modules/system/tests/modules/service_provider_test/service_provider_test.events.yml
@@ -0,0 +1,4 @@
+subscribers:
+  kernel.request:
+    - callback: service_provider_test_class:onKernelRequestTest
+      priority: 100
diff --git a/core/modules/system/tests/modules/service_provider_test/service_provider_test.services.yml b/core/modules/system/tests/modules/service_provider_test/service_provider_test.services.yml
index dda70f5..eb1cc9b 100644
--- a/core/modules/system/tests/modules/service_provider_test/service_provider_test.services.yml
+++ b/core/modules/system/tests/modules/service_provider_test/service_provider_test.services.yml
@@ -2,6 +2,5 @@ services:
   service_provider_test_class:
     class: Drupal\service_provider_test\TestClass
     tags:
-      - { name: event_subscriber }
       - { name: needs_destruction }
     arguments: ['@state']
diff --git a/core/modules/system/tests/modules/session_test/lib/Drupal/session_test/EventSubscriber/SessionTestSubscriber.php b/core/modules/system/tests/modules/session_test/lib/Drupal/session_test/EventSubscriber/SessionTestSubscriber.php
index 44e2882..f467442 100644
--- a/core/modules/system/tests/modules/session_test/lib/Drupal/session_test/EventSubscriber/SessionTestSubscriber.php
+++ b/core/modules/system/tests/modules/session_test/lib/Drupal/session_test/EventSubscriber/SessionTestSubscriber.php
@@ -7,16 +7,14 @@
 
 namespace Drupal\session_test\EventSubscriber;
 
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\FilterResponseEvent;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
 
 /**
  * Defines a test session subscriber that checks whether the session is empty.
  */
-class SessionTestSubscriber implements EventSubscriberInterface {
+class SessionTestSubscriber {
 
   /*
    * Stores whether $_SESSION is empty at the beginning of the request.
@@ -57,16 +55,4 @@ public function onKernelResponseSessionTest(FilterResponseEvent $event) {
     $response->headers->set('X-Session-Empty', $this->emptySession);
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::RESPONSE][] = array('onKernelResponseSessionTest', 300);
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestSessionTest', 100);
-    return $events;
-  }
-
 }
diff --git a/core/modules/system/tests/modules/session_test/session_test.events.yml b/core/modules/system/tests/modules/session_test/session_test.events.yml
new file mode 100644
index 0000000..94b99cd
--- /dev/null
+++ b/core/modules/system/tests/modules/session_test/session_test.events.yml
@@ -0,0 +1,7 @@
+subscribers:
+  kernel.request:
+    - callback: Drupal\session_test\EventSubscriber\SessionTestSubscriber::onKernelResponseSessionTest
+      priority: 300
+  kernel.response:
+    - callback: Drupal\session_test\EventSubscriber\SessionTestSubscriber::onKernelRequestSessionTest
+      priority: 100
diff --git a/core/modules/system/tests/modules/session_test/session_test.services.yml b/core/modules/system/tests/modules/session_test/session_test.services.yml
deleted file mode 100644
index 8ef2e20..0000000
--- a/core/modules/system/tests/modules/session_test/session_test.services.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-services:
-  session_test.subscriber:
-    class: Drupal\session_test\EventSubscriber\SessionTestSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/EventSubscriber/ThemeTestSubscriber.php b/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/EventSubscriber/ThemeTestSubscriber.php
index 2e5417d..08a6bcb 100644
--- a/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/EventSubscriber/ThemeTestSubscriber.php
+++ b/core/modules/system/tests/modules/theme_test/lib/Drupal/theme_test/EventSubscriber/ThemeTestSubscriber.php
@@ -8,14 +8,12 @@
 namespace Drupal\theme_test\EventSubscriber;
 
 use Symfony\Component\DependencyInjection\ContainerAware;
-use Symfony\Component\HttpKernel\KernelEvents;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 
 /**
  * Theme test subscriber for controller requests.
  */
-class ThemeTestSubscriber extends ContainerAware implements EventSubscriberInterface {
+class ThemeTestSubscriber extends ContainerAware {
 
   /**
    * The used container.
@@ -59,13 +57,4 @@ public function onView(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onRequest');
-    $events[KernelEvents::VIEW][] = array('onView', -1000);
-    return $events;
-  }
-
 }
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.events.yml b/core/modules/system/tests/modules/theme_test/theme_test.events.yml
new file mode 100644
index 0000000..c00f5a9
--- /dev/null
+++ b/core/modules/system/tests/modules/theme_test/theme_test.events.yml
@@ -0,0 +1,6 @@
+subscribers:
+  kernel.request:
+    - Drupal\theme_test\EventSubscriber\ThemeTestSubscriber::onRequest
+  kernel.view:
+    - callback: Drupal\theme_test\EventSubscriber\ThemeTestSubscriber::onView
+      priority: -1000
diff --git a/core/modules/system/tests/modules/theme_test/theme_test.services.yml b/core/modules/system/tests/modules/theme_test/theme_test.services.yml
index 69fd3ca..41d944b 100644
--- a/core/modules/system/tests/modules/theme_test/theme_test.services.yml
+++ b/core/modules/system/tests/modules/theme_test/theme_test.services.yml
@@ -1,9 +1,4 @@
 services:
-  theme_test.subscriber:
-    class: Drupal\theme_test\EventSubscriber\ThemeTestSubscriber
-    tags:
-      - { name: event_subscriber }
-
   theme.negotiator.test_custom_theme:
     class: Drupal\theme_test\Theme\CustomThemeNegotiator
     tags:
diff --git a/core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php b/core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php
index 3c23086..1ec4c64 100644
--- a/core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php
+++ b/core/modules/user/lib/Drupal/user/EventSubscriber/MaintenanceModeSubscriber.php
@@ -7,15 +7,13 @@
 
 namespace Drupal\user\EventSubscriber;
 
-use Symfony\Component\EventDispatcher\EventSubscriberInterface;
 use Symfony\Component\HttpFoundation\RedirectResponse;
 use Symfony\Component\HttpKernel\Event\GetResponseEvent;
-use Symfony\Component\HttpKernel\KernelEvents;
 
 /**
  * Maintenance mode subscriber to logout users.
  */
-class MaintenanceModeSubscriber implements EventSubscriberInterface {
+class MaintenanceModeSubscriber {
 
   /**
    * Determine whether the page is configured to be offline.
@@ -70,12 +68,4 @@ public function onKernelRequestMaintenance(GetResponseEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[KernelEvents::REQUEST][] = array('onKernelRequestMaintenance', 35);
-    return $events;
-  }
-
 }
diff --git a/core/modules/user/user.events.yml b/core/modules/user/user.events.yml
new file mode 100644
index 0000000..4862e71
--- /dev/null
+++ b/core/modules/user/user.events.yml
@@ -0,0 +1,4 @@
+subscribers:
+  kernel.request:
+    - callback: Drupal\user\EventSubscriber\MaintenanceModeSubscriber::onKernelRequestMaintenance
+      priority: 35
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index f35e710..4f6fa09 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -21,10 +21,6 @@ services:
   user.autocomplete:
     class: Drupal\user\UserAutocomplete
     arguments: ['@database', '@config.factory']
-  user_maintenance_mode_subscriber:
-    class: Drupal\user\EventSubscriber\MaintenanceModeSubscriber
-    tags:
-      - { name: event_subscriber }
   theme.negotiator.user:
     class: Drupal\user\Theme\UserNegotiator
     arguments: ['@entity.manager', '@current_user']
diff --git a/core/modules/views/views.events.yml b/core/modules/views/views.events.yml
new file mode 100644
index 0000000..c68c984
--- /dev/null
+++ b/core/modules/views/views.events.yml
@@ -0,0 +1,3 @@
+subscribers:
+  routing.route_dynamic:
+    - Drupal\views\EventSubscriber\RouteSubscriber::dynamicRoutes
diff --git a/core/tests/Drupal/Tests/Core/EventListenerPassTest.php b/core/tests/Drupal/Tests/Core/EventListenerPassTest.php
new file mode 100644
index 0000000..d477041
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/EventListenerPassTest.php
@@ -0,0 +1,283 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Tests\Core\EventListenerPassTest.
+ */
+
+namespace Drupal\Tests\Core;
+
+use Drupal\Component\Discovery\DiscoverableInterface;
+use Drupal\Core\EventListenerPass;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Tests the event listener pass.
+ *
+ * @group Drupal
+ *
+ * @see \Drupal\EventListenerPassTest
+ */
+class EventListenerPassTest extends UnitTestCase {
+
+  /**
+   * The tested event listener pass.
+   *
+   * @var \Drupal\Core\EventListenerPass|\Drupal\Tests\Core\TestEventListenerPass
+   */
+  protected $eventListenerPass;
+
+  /**
+   * The mocked event dispatcher.
+   *
+   * @var \Symfony\Component\EventDispatcher\EventDispatcherInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $eventDispatcher;
+
+  /**
+   * The mocked module handler.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $moduleHandler;
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getInfo() {
+    return array(
+      'name' => 'Event listener pass',
+      'description' => 'Tests the event listener pass',
+      'group' => 'Bootstrap',
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    $this->eventListenerPass = new TestEventListenerPass();
+  }
+
+  /**
+   * Creates a container with a event_dispatcher and module handler service.
+   *
+   * @return \Symfony\Component\DependencyInjection\ContainerBuilder
+   *   The created container.
+   */
+  protected function setUpContainer() {
+    $container = new ContainerBuilder();
+    $this->eventDispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
+    $this->moduleHandler = $this->getMock('Drupal\Core\Extension\ModuleHandlerInterface');
+    $container->set('event_dispatcher', $this->eventDispatcher);
+    $container->register('event_dispatcher', 'Symfony\Component\EventDispatcher\ContainerAwareEventDispatcher')
+      ->setArguments(array(new Reference('service_container')));
+
+    $container->set('module_handler', $this->moduleHandler);
+    return $container;
+  }
+
+  /**
+   * Tests the event listener pass without any event.
+   */
+  public function testNoEvent() {
+    $container = $this->setUpContainer();
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array()));
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+
+    $this->eventListenerPass->process($container);
+
+    $this->assertEquals(3, count($container->getServiceIds()));
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one class based event.
+   */
+  public function testEvent() {
+    $container = $this->setUpContainer();
+
+    $info['subscribers']['example'][] = 'Drupal\Tests\Core\TestClass::subscriberMethod';
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $expected_calls[] = array('addListenerService', array('example', array('event_listener.Drupal.Tests.Core.TestClass', 'subscriberMethod')));
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one class based event with a priority.
+   */
+  public function testEventWithPriority() {
+    $container = $this->setUpContainer();
+
+    $info['subscribers']['example'][] = array(
+      'callback' => 'Drupal\Tests\Core\TestClass::subscriberMethod',
+      'priority' => 10,
+    );
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $expected_calls[] = array('addListenerService', array('example', array('event_listener.Drupal.Tests.Core.TestClass', 'subscriberMethod'), 10));
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one service based event.
+   */
+  public function testServiceEventWithoutPriority() {
+    $container = $this->setUpContainer();
+    $container->register('subscriber_service', 'Drupal\Tests\Core\TestClass');
+
+    $info['subscribers']['example'][] = array(
+      'callback' => 'subscriber_service:subscriberMethod',
+    );
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $expected_calls[] = array('addListenerService', array('example', array('subscriber_service', 'subscriberMethod')));
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one service based event with a priority.
+   */
+  public function testServiceEventWithPriority() {
+    $container = $this->setUpContainer();
+    $container->register('subscriber_service', 'Drupal\Tests\Core\TestClass');
+
+    $info['subscribers']['example'][] = array(
+      'callback' => 'subscriber_service:subscriberMethod',
+      'priority' => 10,
+    );
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $expected_calls[] = array('addListenerService', array('example', array('subscriber_service', 'subscriberMethod'), 10));
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with a bunch of services/classes.
+   */
+  public function testMultipleEvents() {
+    $container = $this->setUpContainer();
+    $container->register('subscriber_service', 'Drupal\Tests\Core\TestClass');
+
+    // Set a service without a priority.
+    $info['subscribers']['example'][] = array(
+      'callback' => 'subscriber_service:subscriberMethod',
+    );
+
+    // Setup the same method with different priorities.
+    $info['subscribers']['example2'][] = array(
+      'callback' => 'subscriber_service:subscriberMethod2',
+      'priority' => -10,
+    );
+
+    $info['subscribers']['example2'][] = array(
+      'callback' => 'subscriber_service:subscriberMethod2',
+      'priority' => 10,
+    );
+
+    // Subscribe to different events with the same method and same priority.
+    $info['subscribers']['example3'][] = array(
+      'callback' => 'Drupal\Tests\Core\TestClass::subscriberMethod2',
+      'priority' => 10,
+    );
+    $info['subscribers']['example4'][] = array(
+      'callback' => 'Drupal\Tests\Core\TestClass::subscriberMethod2',
+      'priority' => 10,
+    );
+
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+
+    $definition = $container->getDefinition('event_dispatcher');
+    $expected_calls = array();
+    $expected_calls[] = array('addListenerService', array('example', array('subscriber_service', 'subscriberMethod')));
+    $expected_calls[] = array('addListenerService', array('example2', array('subscriber_service', 'subscriberMethod2'), -10));
+    $expected_calls[] = array('addListenerService', array('example2', array('subscriber_service', 'subscriberMethod2'), 10));
+    $expected_calls[] = array('addListenerService', array('example3', array('event_listener.Drupal.Tests.Core.TestClass', 'subscriberMethod2'), 10));
+    $expected_calls[] = array('addListenerService', array('example4', array('event_listener.Drupal.Tests.Core.TestClass', 'subscriberMethod2'), 10));
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with an invalid yaml file.
+   *
+   * @expectedException \LogicException
+   * @expectedExceptionMessage Unable to parse the callback name "test_service-test"
+   */
+  public function testInvalidYaml() {
+    $container = $this->setUpContainer();
+
+    $info['subscribers']['example'][] = 'test_service-test';
+    $yaml_discovery = $this->getMock('Drupal\Component\Discovery\DiscoverableInterface');
+    $yaml_discovery->expects($this->once())
+      ->method('findAll')
+      ->will($this->returnValue(array($info)));
+
+    $this->eventListenerPass->setYamlDiscovery($yaml_discovery);
+    $this->eventListenerPass->process($container);
+  }
+
+}
+
+class TestEventListenerPass extends EventListenerPass {
+
+  public function setYamlDiscovery(DiscoverableInterface $yaml_discovery) {
+    $this->yamlDiscovery = $yaml_discovery;
+  }
+
+  protected function getYamlDiscovery(ModuleHandlerInterface $module_handler) {
+    return $this->yamlDiscovery;
+  }
+
+}
+
+class TestClass {
+  public function subscriberMethod() {}
+  public function subscriberMethod2() {}
+}
