diff --git a/core/lib/Drupal/Component/DependencyInjection/Container.php b/core/lib/Drupal/Component/DependencyInjection/Container.php
index df25ae8..fee67bd 100644
--- a/core/lib/Drupal/Component/DependencyInjection/Container.php
+++ b/core/lib/Drupal/Component/DependencyInjection/Container.php
@@ -366,7 +366,7 @@ public function set($id, $service, $scope = ContainerInterface::SCOPE_CONTAINER)
    * {@inheritdoc}
    */
   public function has($id) {
-    return isset($this->services[$id]) || isset($this->serviceDefinitions[$id]);
+    return isset($this->services[$id]) || isset($this->serviceDefinitions[$id]) || isset($this->aliases[$id]);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
index 1edaec3..f9cc1d8 100644
--- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
+++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
@@ -95,4 +95,15 @@ public function __sleep() {
     return array_keys(get_object_vars($this));
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getDefinition($id) {
+    $id = strtolower($id);
+    if ($this->hasAlias($id)) {
+      $id = $this->getAlias($id);
+    }
+    return parent::getDefinition($id);
+  }
+
 }
diff --git a/core/modules/simpletest/src/TestServiceProvider.php b/core/modules/simpletest/src/TestServiceProvider.php
index 5a1a398..bf02cd3 100644
--- a/core/modules/simpletest/src/TestServiceProvider.php
+++ b/core/modules/simpletest/src/TestServiceProvider.php
@@ -33,13 +33,13 @@ function register(ContainerBuilder $container) {
    */
   public function alter(ContainerBuilder $container) {
     if (static::$currentTest instanceof KernelTestBase) {
-      // While $container->get() does a recursive resolve, getDefinition() does
-      // not, so do it ourselves.
       foreach (['router.route_provider' => 'RouteProvider'] as $original_id => $class) {
-        for ($id = $original_id; $container->hasAlias($id); $id = (string) $container->getAlias($id));
-        $definition = $container->getDefinition($id);
+        $definition = $container->getDefinition($original_id);
         $definition->clearTag('needs_destruction');
         $container->setDefinition("simpletest.$original_id", $definition);
+
+        // Resolve $original_id to its final $id similar to get().
+        $id = $container->hasAlias($original_id) ? $container->getAlias($original_id) : $original_id;
         $container->setDefinition($id, new Definition('Drupal\simpletest\\' . $class));
       }
     }
diff --git a/core/tests/Drupal/Tests/Component/DependencyInjection/ContainerTest.php b/core/tests/Drupal/Tests/Component/DependencyInjection/ContainerTest.php
index 5721c64..5dec667 100644
--- a/core/tests/Drupal/Tests/Component/DependencyInjection/ContainerTest.php
+++ b/core/tests/Drupal/Tests/Component/DependencyInjection/ContainerTest.php
@@ -224,6 +224,17 @@ public function testHas() {
   }
 
   /**
+   * Tests that Container::has() for aliased services works properly.
+   *
+   * @covers ::has
+   */
+  public function testHasForAliasedService() {
+    $service = $this->container->has('service.provider');
+    $aliased_service = $this->container->has('service.provider_alias');
+    $this->assertSame($service, $aliased_service);
+  }
+
+  /**
    * Tests that Container::get() for circular dependencies works properly.
    * @expectedException \Symfony\Component\DependencyInjection\Exception\ServiceCircularReferenceException
    * @covers ::get
