diff --git a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
index e6741fcbea..95023fa7f2 100644
--- a/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
+++ b/core/lib/Drupal/Core/DependencyInjection/YamlFileLoader.php
@@ -353,7 +353,7 @@ private function validate($content, $file)
             throw new InvalidArgumentException(sprintf('The service file "%s" is not valid. It should contain an array. Check your YAML syntax.', $file));
         }
 
-        if ($invalid_keys = array_diff_key($content, array('parameters' => 1, 'services' => 1))) {
+        if ($invalid_keys = array_diff_key($content, array('parameters' => 1, 'services' => 1, 'service_providers' => 1))) {
             throw new InvalidArgumentException(sprintf('The service file "%s" is not valid: it contains invalid keys %s. Services have to be added under "services" and Parameters under "parameters".', $file, $invalid_keys));
         }
 
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 8de7a460c0..3e52dbcf59 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -4,6 +4,7 @@
 
 use Composer\Autoload\ClassLoader;
 use Drupal\Component\Assertion\Handle;
+use Drupal\Component\FileCache\FileCache;
 use Drupal\Component\FileCache\FileCacheFactory;
 use Drupal\Component\Utility\UrlHelper;
 use Drupal\Core\Cache\DatabaseBackend;
@@ -20,6 +21,7 @@
 use Drupal\Core\Installer\InstallerRedirectTrait;
 use Drupal\Core\Language\Language;
 use Drupal\Core\Security\RequestSanitizer;
+use Drupal\Core\Serialization\Yaml;
 use Drupal\Core\Site\Settings;
 use Drupal\Core\Test\TestDatabase;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
@@ -590,6 +592,7 @@ public function discoverServiceProviders() {
     $this->serviceProviderClasses['app']['core'] = 'Drupal\Core\CoreServiceProvider';
 
     // Retrieve enabled modules and register their namespaces.
+    $file_cache = FileCacheFactory::get('container_yaml_loader');
     if (!isset($this->moduleList)) {
       $extensions = $this->getConfigStorage()->read('core.extension');
       $this->moduleList = isset($extensions['module']) ? $extensions['module'] : [];
@@ -605,9 +608,24 @@ public function discoverServiceProviders() {
       if (class_exists($class)) {
         $this->serviceProviderClasses['app'][$module] = $class;
       }
+
       $filename = dirname($filename) . "/$module.services.yml";
       if (file_exists($filename)) {
         $this->serviceYamls['app'][$module] = $filename;
+
+        // Allow to also load service providers via module's services.yml file.
+        if (!$content = $file_cache->get($filename)) {
+          $content = Yaml::decode(file_get_contents($filename));
+        }
+        if (is_array($content) && isset($content['service_providers']) && is_array($content['service_providers'])) {
+          foreach ($content['service_providers'] as $index => $service_provider_class) {
+            $this->serviceProviderClasses['app'][$module . '_' . $index] = $service_provider_class;
+          }
+        }
+      }
+
+      if (!empty($this->serviceProviderClasses['app'][$module]) && empty($this->serviceProviderClasses['app'][$module . '_0'])) {
+        @trigger_error('Implicit service providers are deprecated in Drupal 8.6.x and will be removed before Drupal 9.0.0. Instead declare your service providers in .services.yml files. See https://www.drupal.org/node/2974194.', E_USER_DEPRECATED);
       }
     }
 
diff --git a/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.info.yml b/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.info.yml
new file mode 100644
index 0000000000..d89ae7804f
--- /dev/null
+++ b/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.info.yml
@@ -0,0 +1,6 @@
+name: 'Drupal kernel module service providers'
+type: module
+description: ''
+package: Testing
+version: VERSION
+core: 8.x
diff --git a/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.services.yml b/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.services.yml
new file mode 100644
index 0000000000..e7754728c1
--- /dev/null
+++ b/core/modules/system/tests/modules/drupalkernel_module_service_providers/drupalkernel_module_service_providers.services.yml
@@ -0,0 +1,2 @@
+service_providers:
+  - Drupal\drupalkernel_module_service_providers\DrupalkernelModuleServiceProvidersServiceProvider2
diff --git a/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider.php b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider.php
new file mode 100644
index 0000000000..72baa8631a
--- /dev/null
+++ b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Drupal\drupalkernel_module_service_providers;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderInterface;
+
+class DrupalkernelModuleServiceProvidersServiceProvider implements ServiceProviderInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container) {
+    $container->register('drupalkernel_module_service_providers.test_0', 'Drupal\drupalkernel_module_service_providers\TestService');
+  }
+
+}
diff --git a/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider2.php b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider2.php
new file mode 100644
index 0000000000..6be5687242
--- /dev/null
+++ b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/DrupalkernelModuleServiceProvidersServiceProvider2.php
@@ -0,0 +1,17 @@
+<?php
+
+namespace Drupal\drupalkernel_module_service_providers;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceProviderInterface;
+
+class DrupalkernelModuleServiceProvidersServiceProvider2 implements ServiceProviderInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function register(ContainerBuilder $container) {
+    $container->register('drupalkernel_module_service_providers.test_1', 'Drupal\drupalkernel_module_service_providers\TestService');
+  }
+
+}
diff --git a/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/TestService.php b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/TestService.php
new file mode 100644
index 0000000000..03401d2e58
--- /dev/null
+++ b/core/modules/system/tests/modules/drupalkernel_module_service_providers/src/TestService.php
@@ -0,0 +1,7 @@
+<?php
+
+namespace Drupal\drupalkernel_module_service_providers;
+
+class TestService {
+
+}
diff --git a/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php b/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
index b5cb96b8cc..9d57bb605d 100644
--- a/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
+++ b/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\KernelTests\Core\DrupalKernel;
 
 use Drupal\Core\DrupalKernel;
+use Drupal\drupalkernel_module_service_providers\TestService;
 use Drupal\KernelTests\KernelTestBase;
 use Symfony\Component\HttpFoundation\Request;
 
@@ -191,4 +192,20 @@ public function testPreventChangeOfSitePath() {
     $kernel->setSitePath($path);
   }
 
+  /**
+   * Tests service providers defined by a test module.
+   */
+  public function testServiceProviders() {
+    $request = Request::createFromGlobals();
+
+    $modules_enabled = [
+      'system' => 'system',
+      'user' => 'user',
+      'drupalkernel_module_service_providers' => 'drupalkernel_module_service_providers',
+    ];
+    $kernel = $this->getTestKernel($request, $modules_enabled);
+    $this->assertInstanceOf(TestService::class, $kernel->getContainer()->get('drupalkernel_module_service_providers.test_0'));
+    $this->assertInstanceOf(TestService::class, $kernel->getContainer()->get('drupalkernel_module_service_providers.test_1'));
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php
index 4093b6a2eb..3efd0fd447 100644
--- a/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php
+++ b/core/tests/Drupal/Tests/Core/DependencyInjection/YamlFileLoaderTest.php
@@ -31,6 +31,8 @@ class: \Drupal\Core\ExampleClass
   example_private_service:
     class: \Drupal\Core\ExampleClass
     public: false
+service_providers:
+  - \Drupal\Core\CoreServiceProvider
 YAML;
 
     vfsStream::setup('drupal', NULL, [
