diff --git a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
index f5df4ec..b376ed8 100644
--- a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
+++ b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
@@ -52,7 +52,7 @@ public function load($filename) {
       static::$yaml[$filename] = $this->loadFile($filename);
     }
     $content = static::$yaml[$filename];
-    $content += array('parameters' => array(), 'services' => array());
+    $content += array('parameters' => array(), 'services' => array(), 'subscribers' => array());
     // parameters
     foreach ($content['parameters'] as $key => $value) {
       $this->container->setParameter($key, $this->resolveServices($value));
@@ -61,6 +61,34 @@ public function load($filename) {
     foreach ($content['services'] as $id => $service) {
       $this->parseDefinition($id, $service, $filename);
     }
+    // events subscribers
+    foreach ($content['subscribers'] as $key => $value) {
+      $this->parseEventSubscriberDefinition($key, $value);
+    }
+  }
+
+  /**
+   * Parses an event subscriber definition.
+   *
+   * @param string $name
+   *   The name of the event subscriber.
+   * @param array $args
+   *   The properties of the event subscriber.
+   */
+  protected function parseEventSubscriberDefinition($name, $args) {
+    $definition = new Definition();
+
+    $definition->addTag("event_subscriber", array());
+
+    if (isset($args['arguments'])) {
+      $definition->setArguments($this->resolveServices($args['arguments']));
+    }
+
+    if (isset($args['class'])) {
+      $definition->setClass($args['class']);
+    }
+
+    $this->container->setDefinition($name, $definition);
   }
 
   /**
@@ -215,7 +243,7 @@ protected function validate($content, $filename) {
     if (!is_array($content)) {
       throw new \InvalidArgumentException(sprintf('The service file "%s" is not valid: it is not an array.', $filename));
     }
-    if ($keys = array_diff_key($content, array('parameters' => TRUE, 'services' => TRUE))) {
+    if ($keys = array_diff_key($content, array('parameters' => TRUE, 'services' => TRUE, 'subscribers' => TRUE))) {
       $invalid_keys = htmlspecialchars(implode(', ', $keys), ENT_QUOTES, 'UTF-8');
       throw new \InvalidArgumentException(sprintf('The service file "%s" is not valid: it contains invalid keys %s.', $filename, $invalid_keys));
     }
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index af1fe52..fef25ae 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -137,6 +137,13 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
   protected $serviceYamls;
 
   /**
+   * Holds the list of YAML files containing event definitions.
+   *
+   * @var array
+   */
+  protected $eventYamls;
+
+  /**
    * The array of registered service providers.
    *
    * @var array
@@ -225,6 +232,7 @@ public function discoverServiceProviders() {
       'core/core.services.yml'
     );
     $this->serviceProviderClasses = array('Drupal\Core\CoreServiceProvider');
+    $this->eventYamls = array();
 
     // Ensure we know what modules are enabled and that their namespaces are
     // registered.
@@ -248,6 +256,12 @@ public function discoverServiceProviders() {
       if (file_exists($filename)) {
         $this->serviceYamls[] = $filename;
       }
+
+      // Load each module's events and event event subscriptions.
+      $filename = dirname($module_filenames[$module]) . "/$module.events.yml";
+      if (file_exists($filename)) {
+        $this->eventYamls[] = $filename;
+      }
     }
 
     // Add site specific or test service providers.
@@ -528,6 +542,9 @@ protected function buildContainer() {
     foreach ($this->serviceYamls as $filename) {
       $yaml_loader->load($filename);
     }
+    foreach ($this->eventYamls as $filename) {
+      $yaml_loader->load($filename);
+    }
     foreach ($this->serviceProviders as $provider) {
       $provider->register($container);
     }
diff --git a/core/modules/user/user.events.yml b/core/modules/user/user.events.yml
new file mode 100644
index 0000000..bbf4773
--- /dev/null
+++ b/core/modules/user/user.events.yml
@@ -0,0 +1,3 @@
+subscribers:
+  user_maintenance_mode_subscriber:
+    class: Drupal\user\EventSubscriber\MaintenanceModeSubscriber
\ No newline at end of file
diff --git a/core/modules/user/user.services.yml b/core/modules/user/user.services.yml
index 6fb7d47..468955d 100644
--- a/core/modules/user/user.services.yml
+++ b/core/modules/user/user.services.yml
@@ -21,7 +21,3 @@ services:
   user.autocomplete:
     class: Drupal\user\UserAutocomplete
     arguments: ['@database', '@config.factory']
-  user_maintenance_mode_subscriber:
-    class: Drupal\user\EventSubscriber\MaintenanceModeSubscriber
-    tags:
-      - { name: event_subscriber }
diff --git a/core/modules/views/views.events.yml b/core/modules/views/views.events.yml
new file mode 100644
index 0000000..0df4736
--- /dev/null
+++ b/core/modules/views/views.events.yml
@@ -0,0 +1,4 @@
+subscribers:
+  views.route_subscriber:
+    class: Drupal\views\EventSubscriber\RouteSubscriber
+    arguments: ['@config.factory']
diff --git a/core/modules/views/views.services.yml b/core/modules/views/views.services.yml
index d5ab9d9..0f41597 100644
--- a/core/modules/views/views.services.yml
+++ b/core/modules/views/views.services.yml
@@ -81,11 +81,6 @@ services:
     factory_method: get
     factory_service: cache_factory
     arguments: [views_results]
-  views.route_subscriber:
-    class: Drupal\views\EventSubscriber\RouteSubscriber
-    arguments: ['@config.factory']
-    tags:
-      - { name: 'event_subscriber' }
   views.route_access_check:
     class: Drupal\views\ViewsAccessCheck
     tags:
