diff --git a/core/core.events.yml b/core/core.events.yml
new file mode 100644
index 0000000..bfe84d4
--- /dev/null
+++ b/core/core.events.yml
@@ -0,0 +1,69 @@
+subscribers:
+  config.importer.import:
+    - callback: config_snapshot_subscriber:onConfigImporterImport
+      priority: 40
+  config.importer.validate:
+    - callback: Drupal\Core\EventSubscriber\ConfigImportSubscriber::onConfigImporterValidate
+      priority: 40
+  config.save:
+    - callback: config.factory:onConfigSave
+      priority: 255
+  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: 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
+    - route_enhancer.param_conversion:onException
+  kernel.view:
+    - callback: html_view_subscriber:onHtmlFragment
+      priority: 100
+    - callback: html_view_subscriber:onHtmlPage
+      priority: 50
+    - 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
+    - callback: router.rebuild_subscriber:onKernelTerminate
+      priority: 200
+  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
+  routing.route_finished:
+    - router.route_provider:reset
+    - callback: router.rebuild_subscriber:onRouterRebuild
+      priority: 200
diff --git a/core/core.services.yml b/core/core.services.yml
index b1fbd4f..c0897d3 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -82,7 +82,6 @@ services:
     class: Drupal\Core\Config\ConfigFactory
     tags:
       - { name: persist }
-      - { name: event_subscriber }
     arguments: ['@config.storage', '@event_dispatcher', '@config.typed']
   config.installer:
     class: Drupal\Core\Config\ConfigInstaller
@@ -278,8 +277,6 @@ services:
   router.route_provider:
     class: Drupal\Core\Routing\RouteProvider
     arguments: ['@database', '@router.builder']
-    tags:
-      - { name: event_subscriber }
   router.matcher.final_matcher:
     class: Drupal\Core\Routing\UrlMatcher
   router.matcher:
@@ -324,8 +321,6 @@ services:
   router.rebuild_subscriber:
     class: Drupal\Core\EventSubscriber\RouterRebuildSubscriber
     arguments: ['@router.builder']
-    tags:
-      - { name: event_subscriber }
   path.alias_manager.cached:
     class: Drupal\Core\CacheDecorator\AliasManagerCacheDecorator
     arguments: ['@path.alias_manager', '@cache.path']
@@ -351,8 +346,6 @@ services:
       - [setContainer, ['@service_container']]
   paramconverter_subscriber:
     class: Drupal\Core\EventSubscriber\ParamConverterSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@paramconverter_manager']
   paramconverter.entity:
     class: Drupal\Core\ParamConverter\EntityConverter
@@ -361,29 +354,18 @@ 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.param_conversion:
     class: Drupal\Core\Routing\Enhancer\ParamConversionEnhancer
     arguments: ['@paramconverter_manager']
     tags:
       - { name: route_enhancer }
-      - { name: event_subscriber }
   route_enhancer.authentication:
     class: Drupal\Core\Routing\Enhancer\AuthenticationEnhancer
     calls:
@@ -414,8 +396,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: ['@controller_resolver', '@string_translation', '@title_resolver']
@@ -439,13 +419,9 @@ services:
     class: Drupal\Core\ContentNegotiation
   view_subscriber:
     class: Drupal\Core\EventSubscriber\ViewSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@content_negotiation', '@title_resolver', '@ajax_response_renderer']
   html_view_subscriber:
     class: Drupal\Core\EventSubscriber\HtmlViewSubscriber
-    tags:
-      - { name: event_subscriber }
     arguments: ['@html_fragment_renderer', '@html_page_renderer']
   html_fragment_renderer:
     class: Drupal\Core\Page\DefaultHtmlFragmentRenderer
@@ -471,12 +447,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
@@ -505,44 +477,24 @@ services:
     tags:
       - { name: access_check, applies_to: _csrf_token }
     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_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.manager', '@config.storage', '@config.storage.snapshot']
   exception_controller:
     class: Drupal\Core\Controller\ExceptionController
@@ -592,14 +544,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']
@@ -621,8 +567,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']
@@ -696,8 +640,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/Config/ConfigFactory.php b/core/lib/Drupal/Core/Config/ConfigFactory.php
index 8b74a70..af96d71 100644
--- a/core/lib/Drupal/Core/Config/ConfigFactory.php
+++ b/core/lib/Drupal/Core/Config/ConfigFactory.php
@@ -26,7 +26,7 @@
  *
  * @see \Drupal\Core\Config\StorageInterface
  */
-class ConfigFactory implements ConfigFactoryInterface, EventSubscriberInterface {
+class ConfigFactory implements ConfigFactoryInterface {
 
   /**
    * A storage controller instance for reading and writing configuration data.
@@ -386,12 +386,4 @@ public function onConfigSave(ConfigEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events['config.save'][] = array('onConfigSave', 255);
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index d99ae28..054cd79 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..93bacdd
--- /dev/null
+++ b/core/lib/Drupal/Core/EventListenerPass.php
@@ -0,0 +1,154 @@
+<?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) {
+          if ($result = $this->prepareListener($container, $event_id, $listener)) {
+            list($add_method, $args) = $result;
+            $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;
+    }
+
+    if (!($callback_parts = $this->parseCallback($callback, $container))) {
+      return;
+    }
+    $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, ContainerBuilder $container) {
+    // TODO: This logic should abstracted somewhere.
+    $optional = $callback[0] == '?';
+
+    // Callback in the service:method notation.
+    $count = substr_count($callback, ':');
+    if ($count == 1) {
+      list($service, $method) = explode(':', $callback, 2);
+      if ($optional) {
+        $service = substr($service, 1);
+      }
+
+      if (!$container->has($service)) {
+        if ($optional) {
+          return array();
+        }
+        else {
+          throw new \InvalidArgumentException(sprintf('Service "%s" does not exist.', $service));
+        }
+      }
+
+      return array('service' => $service, 'method' => $method);
+    }
+
+    // Callback in the class::method notation.
+    if (strpos($callback, '::') !== FALSE) {
+      list($class, $method) = explode('::', $callback, 2);
+      if ($optional) {
+        $class = substr($class, 1);
+      }
+
+      if (!class_exists($class)) {
+        if ($optional) {
+          return array();
+        }
+        else {
+          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/ConfigImportSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
index 6cd3129..4011406 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
@@ -15,7 +15,7 @@
 /**
  * Config import subscriber for config import events.
  */
-class ConfigImportSubscriber implements EventSubscriberInterface {
+class ConfigImportSubscriber {
 
   /**
    * Validates the configuration to be imported.
@@ -33,15 +33,4 @@ public function onConfigImporterValidate(ConfigImporterEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events['config.importer.validate'][] = array('onConfigImporterValidate', 40);
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/ConfigSnapshotSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ConfigSnapshotSubscriber.php
index 656eb2d..f1f164d 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ConfigSnapshotSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ConfigSnapshotSubscriber.php
@@ -16,7 +16,7 @@
 /**
  * Create a snapshot when config is imported.
  */
-class ConfigSnapshotSubscriber implements EventSubscriberInterface {
+class ConfigSnapshotSubscriber {
 
   /**
    * The configuration manager.
@@ -63,15 +63,4 @@ public function onConfigImporterImport(ConfigImporterEvent $event) {
     $this->configManager->createSnapshot($this->sourceStorage, $this->snapshotStorage);
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events['config.importer.import'][] = array('onConfigImporterImport', 40);
-    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 8e4596f..0fbd04a 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/HtmlViewSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
index 69e80cd..68d0a3d 100644
--- a/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
@@ -19,7 +19,7 @@
 /**
  * Main subscriber for Html-page responses.
  */
-class HtmlViewSubscriber implements EventSubscriberInterface {
+class HtmlViewSubscriber {
 
   /**
    * The fragment rendering service.
@@ -92,17 +92,4 @@ public function onHtmlPage(GetResponseForControllerResultEvent $event) {
     }
   }
 
-  /**
-   * Registers the methods in this class that should be listeners.
-   *
-   * @return array
-   *   An array of event listener definitions.
-   */
-  static function getSubscribedEvents() {
-    $events[KernelEvents::VIEW][] = array('onHtmlFragment', 100);
-    $events[KernelEvents::VIEW][] = array('onHtmlPage', 50);
-
-    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 b89e9ff..398727d 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ParamConverterSubscriber.php
@@ -9,13 +9,12 @@
 
 use Drupal\Core\ParamConverter\ParamConverterManagerInterface;
 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/ReverseProxySubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php
index cf0003d..7b490da 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ReverseProxySubscriber.php
@@ -15,7 +15,7 @@
 /**
  * Reverse proxy subscriber for controller requests.
  */
-class ReverseProxySubscriber implements EventSubscriberInterface {
+class ReverseProxySubscriber {
 
   /**
    * A settings object.
@@ -50,14 +50,4 @@ public function onKernelRequestReverseProxyCheck(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('onKernelRequestReverseProxyCheck', 10);
-    return $events;
-  }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/RouterRebuildSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/RouterRebuildSubscriber.php
index d432656..9c3dd7d 100644
--- a/core/lib/Drupal/Core/EventSubscriber/RouterRebuildSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/RouterRebuildSubscriber.php
@@ -18,7 +18,7 @@
 /**
  * Rebuilds the router and menu_router if necessary.
  */
-class RouterRebuildSubscriber implements EventSubscriberInterface {
+class RouterRebuildSubscriber {
 
   /**
    * @var \Drupal\Core\Routing\RouteBuilderInterface
@@ -56,16 +56,4 @@ public function onRouterRebuild(Event $event) {
     Cache::deleteTags(array('local_task' => 1));
   }
 
-  /**
-   * 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', 200);
-    $events[RoutingEvents::FINISHED][] = array('onRouterRebuild', 200);
-    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 48f057b..6a0f9c3 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\RouteObjectInterface;
 use Symfony\Component\Routing\RouteCollection;
@@ -145,5 +146,15 @@ public function convert(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/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
index 614ac96..2798faf 100644
--- a/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
+++ b/core/lib/Drupal/Core/Routing/Enhancer/ParamConversionEnhancer.php
@@ -21,7 +21,7 @@
 /**
  * Provides a route enhancer that handles parameter conversion.
  */
-class ParamConversionEnhancer implements RouteEnhancerInterface, EventSubscriberInterface {
+class ParamConversionEnhancer implements RouteEnhancerInterface {
 
   /**
    * The parameter conversion manager.
@@ -82,12 +82,4 @@ public function onException(GetResponseForExceptionEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public static function getSubscribedEvents() {
-    $events[KernelEvents::EXCEPTION][] = array('onException', 0);
-    return $events;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Routing/RouteProvider.php b/core/lib/Drupal/Core/Routing/RouteProvider.php
index 20b0ec1..c62e5b1 100644
--- a/core/lib/Drupal/Core/Routing/RouteProvider.php
+++ b/core/lib/Drupal/Core/Routing/RouteProvider.php
@@ -19,7 +19,7 @@
 /**
  * A Route Provider front-end for all Drupal-stored routes.
  */
-class RouteProvider implements RouteProviderInterface, EventSubscriberInterface {
+class RouteProvider implements RouteProviderInterface {
 
   /**
    * The database connection from which to read route information.
@@ -292,12 +292,4 @@ public function reset() {
     $this->routes  = array();
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events[RoutingEvents::FINISHED][] = array('reset');
-    return $events;
-  }
-
 }
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/config/tests/config_override/config_override.events.yml b/core/modules/config/tests/config_override/config_override.events.yml
new file mode 100644
index 0000000..58b9e37
--- /dev/null
+++ b/core/modules/config/tests/config_override/config_override.events.yml
@@ -0,0 +1,6 @@
+subscribers:
+  config.module.overrides:
+    - callback: Drupal\config_override\EventSubscriber\ConfigModuleOverrideSubscriber::onConfigModuleOverride
+      priority: 40
+    - callback: Drupal\config_override\EventSubscriber\ConfigModuleLowPriorityOverrideSubscriber::onConfigModuleOverride
+      priority: 35
diff --git a/core/modules/config/tests/config_override/config_override.services.yml b/core/modules/config/tests/config_override/config_override.services.yml
deleted file mode 100644
index 586ce49..0000000
--- a/core/modules/config/tests/config_override/config_override.services.yml
+++ /dev/null
@@ -1,9 +0,0 @@
-services:
-  config_override_config_subscriber:
-    class: Drupal\config_override\EventSubscriber\ConfigModuleOverrideSubscriber
-    tags:
-      - { name: event_subscriber }
-  config_override_low_priority_config_subscriber:
-    class: Drupal\config_override\EventSubscriber\ConfigModuleLowPriorityOverrideSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/config_translation/config_translation.events.yml b/core/modules/config_translation/config_translation.events.yml
new file mode 100644
index 0000000..754f1d5
--- /dev/null
+++ b/core/modules/config_translation/config_translation.events.yml
@@ -0,0 +1,2 @@
+subscribers:
+
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 f23f8b8..0c14cf7 100644
--- a/core/modules/hal/hal.services.yml
+++ b/core/modules/hal/hal.services.yml
@@ -26,7 +26,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/language/language.events.yml b/core/modules/language/language.events.yml
new file mode 100644
index 0000000..9bd2dc5
--- /dev/null
+++ b/core/modules/language/language.events.yml
@@ -0,0 +1,6 @@
+subscribers:
+  kernel.request:
+    - callback: ?language_request_subscriber:onKernelRequestLanguage
+      priority: 255
+  config.save:
+    - Drupal\language\EventSubscriber\ConfigSubscriber::onConfigSave
diff --git a/core/modules/language/language.services.yml b/core/modules/language/language.services.yml
index 422644a..81aede7 100644
--- a/core/modules/language/language.services.yml
+++ b/core/modules/language/language.services.yml
@@ -7,7 +7,3 @@ services:
     arguments: ['@language_manager', '@plugin.manager.language_negotiation_method', '@config.factory', '@settings']
     calls:
       - [initLanguageManager]
-  language.config_subscriber:
-    class: Drupal\language\EventSubscriber\ConfigSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/language/lib/Drupal/language/EventSubscriber/ConfigSubscriber.php b/core/modules/language/lib/Drupal/language/EventSubscriber/ConfigSubscriber.php
index 819c2d3..9319cab 100644
--- a/core/modules/language/lib/Drupal/language/EventSubscriber/ConfigSubscriber.php
+++ b/core/modules/language/lib/Drupal/language/EventSubscriber/ConfigSubscriber.php
@@ -14,7 +14,7 @@
 /**
  * Deletes the container if default language has changed.
  */
-class ConfigSubscriber implements EventSubscriberInterface {
+class ConfigSubscriber {
 
   /**
    * Causes the container to be rebuilt on the next request.
@@ -31,12 +31,4 @@ public function onConfigSave(ConfigEvent $event) {
     }
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  static function getSubscribedEvents() {
-    $events['config.save'][] = array('onConfigSave', 0);
-    return $events;
-  }
-
 }
diff --git a/core/modules/language/lib/Drupal/language/LanguageServiceProvider.php b/core/modules/language/lib/Drupal/language/LanguageServiceProvider.php
index 8c11eca..0c309bc 100644
--- a/core/modules/language/lib/Drupal/language/LanguageServiceProvider.php
+++ b/core/modules/language/lib/Drupal/language/LanguageServiceProvider.php
@@ -27,7 +27,6 @@ public function register(ContainerBuilder $container) {
     // The following services are needed only on multilingual sites.
     if ($this->isMultilingual()) {
       $container->register('language_request_subscriber', 'Drupal\language\EventSubscriber\LanguageRequestSubscriber')
-        ->addTag('event_subscriber')
         ->addArgument(new Reference('language_manager'))
         ->addArgument(new Reference('language_negotiator'))
         ->addArgument(new Reference('string_translation'))
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/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 f27fe0d..16c1325 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 0a42c91..9b61aac 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.
@@ -71,12 +69,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 23d8706..22ff8fb 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', '@entity.manager', '@entity.query']
-  user_maintenance_mode_subscriber:
-    class: Drupal\user\EventSubscriber\MaintenanceModeSubscriber
-    tags:
-      - { name: event_subscriber }
   theme.negotiator.admin_theme:
     class: Drupal\user\Theme\AdminNegotiator
     arguments: ['@current_user', '@config.factory', '@entity.manager']
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..f365ad3
--- /dev/null
+++ b/core/tests/Drupal/Tests/Core/EventListenerPassTest.php
@@ -0,0 +1,376 @@
+<?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
+ *
+ * @coversDefaultClass \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 one service which does not exist.
+   *
+   * @expectedException \InvalidArgumentException
+   * @expectedExceptionMessage Service "subscriber_service" does not exist.
+   *
+   */
+  public function testNotExistingService() {
+    $container = $this->setUpContainer();
+
+    $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);
+  }
+
+  /**
+   * Tests the event listener pass with one optional non existing service.
+   */
+  public function testOptionalNonExistingService() {
+    $container = $this->setUpContainer();
+
+    $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();
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one optional non existent class.
+   */
+  public function testOptionalNotExistingClass() {
+    $container = $this->setUpContainer();
+
+    $info['subscribers']['example'][] = array(
+      'callback' => '?Drupal\Tests\Core\TestClass2::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();
+    $this->assertEquals($expected_calls, $definition->getMethodCalls());
+  }
+
+  /**
+   * Tests the event listener pass with one class which does not exist.
+   *
+   * @expectedException \InvalidArgumentException
+   * @expectedExceptionMessage Class "Drupal\Tests\Core\TestClass2" does not exist.
+   *
+   */
+  public function testNotExistingClass() {
+    $container = $this->setUpContainer();
+
+    $info['subscribers']['example'][] = array(
+      'callback' => 'Drupal\Tests\Core\TestClass2::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);
+  }
+
+
+  /**
+   * 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() {}
+}
