diff --git a/core/core.services.yml b/core/core.services.yml
index 2b27f69..da4ee8f 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -401,6 +401,9 @@ services:
   title_resolver:
     class: Drupal\Core\Controller\TitleResolver
     arguments: ['@controller_resolver', '@string_translation']
+  reverse_service_resolver:
+    class: Drupal\Core\DependencyInjection\ReverseServiceResolver
+    arguments: ['@service_container']
   http_kernel:
     class: Stack\StackedHttpKernel
   http_kernel.basic:
diff --git a/core/lib/Drupal/Core/Config/ConfigImporter.php b/core/lib/Drupal/Core/Config/ConfigImporter.php
index 007282e..bbb5215 100644
--- a/core/lib/Drupal/Core/Config/ConfigImporter.php
+++ b/core/lib/Drupal/Core/Config/ConfigImporter.php
@@ -1018,11 +1018,10 @@ public function alreadyImporting() {
    * keep the services used by the importer in sync.
    */
   protected function reInjectMe() {
-    $this->_serviceIds = array();
-    $vars = get_object_vars($this);
-    foreach ($vars as $key => $value) {
-      if (is_object($value) && isset($value->_serviceId)) {
-        $this->$key = \Drupal::service($value->_serviceId);
+    $resolver = $this->getReverseServiceResolver();
+    foreach (get_object_vars($this) as $key => $value) {
+      if ($service_id = $resolver->lookup($value)) {
+        $this->$key = \Drupal::service($service_id);
       }
     }
   }
diff --git a/core/lib/Drupal/Core/DependencyInjection/Container.php b/core/lib/Drupal/Core/DependencyInjection/Container.php
index 0d4c972..4c9b192 100644
--- a/core/lib/Drupal/Core/DependencyInjection/Container.php
+++ b/core/lib/Drupal/Core/DependencyInjection/Container.php
@@ -17,19 +17,6 @@ class Container extends SymfonyContainer {
   /**
    * {@inheritdoc}
    */
-  public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE) {
-    $service = parent::get($id, $invalidBehavior);
-    // Some services are called but do not exist, so the parent returns nothing.
-    if (is_object($service)) {
-      $service->_serviceId = $id;
-    }
-
-    return $service;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function __sleep() {
     trigger_error('The container was serialized.', E_USER_ERROR);
     return array_keys(get_object_vars($this));
diff --git a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
index ba29a66..90ab89b 100644
--- a/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
+++ b/core/lib/Drupal/Core/DependencyInjection/ContainerBuilder.php
@@ -30,19 +30,6 @@ public function __construct(ParameterBagInterface $parameterBag = NULL) {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function get($id, $invalidBehavior = self::EXCEPTION_ON_INVALID_REFERENCE) {
-    $service = parent::get($id, $invalidBehavior);
-    // Some services are called but do not exist, so the parent returns nothing.
-    if (is_object($service)) {
-      $service->_serviceId = $id;
-    }
-
-    return $service;
-  }
-
-  /**
    * Overrides Symfony\Component\DependencyInjection\ContainerBuilder::set().
    *
    * Drupal's container builder can be used at runtime after compilation, so we
diff --git a/core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php b/core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php
index cb6a27d..d044c58 100644
--- a/core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php
+++ b/core/lib/Drupal/Core/DependencyInjection/DependencySerializationTrait.php
@@ -22,22 +22,25 @@
   protected $_serviceIds = array();
 
   /**
+   * The reverse service resolver.
+   *
+   * @var \Drupal\Core\DependencyInjection\ReverseServiceResolverInterface.
+   */
+  protected $reverseServiceResolver;
+
+  /**
    * {@inheritdoc}
    */
   public function __sleep() {
     $this->_serviceIds = array();
     $vars = get_object_vars($this);
+    $resolver = $this->getReverseServiceResolver();
     foreach ($vars as $key => $value) {
-      if (is_object($value) && isset($value->_serviceId)) {
+      if ($service_id = $resolver->lookup($value)) {
         // If a class member was instantiated by the dependency injection
-        // container, only store its ID so it can be used to get a fresh object
-        // on unserialization.
-        $this->_serviceIds[$key] = $value->_serviceId;
-        unset($vars[$key]);
-      }
-      // Special case the container, which might not have a service ID.
-      elseif ($value instanceof ContainerInterface) {
-        $this->_serviceIds[$key] = 'service_container';
+        // container, only store its ID so it can be used to get a fresh
+        // object on unserialization.
+        $this->_serviceIds[$key] = $service_id;
         unset($vars[$key]);
       }
     }
@@ -56,4 +59,31 @@ public function __wakeup() {
     $this->_serviceIds = array();
   }
 
+  /**
+   * Sets the reverse service resolver.
+   *
+   * @param \Drupal\Core\DependencyInjection\ReverseServiceResolverInterface $reverse_service_resolver
+   *   The reverse service resolver.
+   *
+   * @return $this
+   */
+  public function setReverseServiceResolver(ReverseServiceResolverInterface $reverse_service_resolver) {
+    $this->reverseServiceResolver = $reverse_service_resolver;
+
+    return $this;
+  }
+
+  /**
+   * Returns the reverse service resolver.
+   *
+   * @return \Drupal\Core\DependencyInjection\ReverseServiceResolverInterface
+   *   The reverse service resolver.
+   */
+  protected function getReverseServiceResolver() {
+    if (!isset($this->reverseServiceResolver)) {
+      $this->reverseServiceResolver = \Drupal::service('reverse_service_resolver');
+    }
+    return $this->reverseServiceResolver;
+  }
+
 }
diff --git a/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolver.php b/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolver.php
new file mode 100644
index 0000000..778da4d
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolver.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\DependencyInjection\ReverseServiceResolver.
+ */
+
+namespace Drupal\Core\DependencyInjection;
+
+use Symfony\Component\DependencyInjection\IntrospectableContainerInterface;
+
+/**
+ * Defines an interface for reverse service resolvers.
+ */
+class ReverseServiceResolver implements ReverseServiceResolverInterface {
+
+  use DependencySerializationTrait;
+
+  /**
+   * The service container.
+   *
+   * @var \Symfony\Component\DependencyInjection\IntrospectableContainerInterface;
+   */
+  protected $container;
+
+  /**
+   * Constructs a new reverse service resolver.
+   *
+   * @param \Symfony\Component\DependencyInjection\IntrospectableContainerInterface $container
+   *   The service container.
+   */
+  public function __construct(IntrospectableContainerInterface $container) {
+    $this->container = $container;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function lookup($service) {
+    foreach ($this->container->getServiceIds() as $service_id) {
+      if ($this->container->initialized($service_id)) {
+        if ($this->container->get($service_id) === $service) {
+          return $service_id;
+        }
+      }
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolverInterface.php b/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolverInterface.php
new file mode 100644
index 0000000..ed9c891
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/ReverseServiceResolverInterface.php
@@ -0,0 +1,27 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\DependencyInjection\ReverseServiceResolverInterface.
+ */
+
+namespace Drupal\Core\DependencyInjection;
+
+/**
+ * Defines an interface for reverse service resolvers.
+ */
+interface ReverseServiceResolverInterface {
+
+  /**
+   * Returns the service id used to create the given service instance.
+   *
+   * @param mixed $service
+   *   A service instance.
+   *
+   * @return string|NULL
+   *   The service id or NULL if the given instance was not created by the
+   *   container.
+   */
+  public function lookup($service);
+
+}
diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php
index a3f4114..3a0705c 100644
--- a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php
+++ b/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerBuilderTest.php
@@ -39,18 +39,4 @@ public function testSetOnSynchronizedService() {
     $this->assertSame($baz, $container->get('bar')->getBaz());
   }
 
-  /**
-   * Tests the get method.
-   *
-   * @see \Drupal\Core\DependencyInjection\Container::get()
-   */
-  public function testGet() {
-    $container = new ContainerBuilder();
-    $container->register('bar', 'BarClass');
-
-    $result = $container->get('bar');
-    $this->assertTrue($result instanceof \BarClass);
-    $this->assertEquals('bar', $result->_serviceId);
-  }
-
 }
diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerTest.php
deleted file mode 100644
index e892f22..0000000
--- a/core/tests/Drupal/Tests/Core/DependencyInjection/ContainerTest.php
+++ /dev/null
@@ -1,48 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Tests\Core\DependencyInjection\ContainerTest.
- */
-
-namespace Drupal\Tests\Core\DependencyInjection;
-
-use Drupal\Core\DependencyInjection\Container;
-use Drupal\Tests\UnitTestCase;
-
-/**
- * @coversDefaultClass \Drupal\Core\DependencyInjection\Container
- * @group DependencyInjection
- */
-class ContainerTest extends UnitTestCase {
-
-  /**
-   * The tested container.
-   *
-   * @var \Drupal\Core\DependencyInjection\Container
-   */
-  public $container;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    $this->container = new Container();
-  }
-
-  /**
-   * Tests the get method.
-   *
-   * @see \Drupal\Core\DependencyInjection\Container::get()
-   */
-  public function testGet() {
-    $service = new \stdClass();
-    $service->key = 'value';
-
-    $this->container->set('test_service', $service);
-    $result = $this->container->get('test_service');
-    $this->assertSame($service, $result);
-    $this->assertEquals('test_service', $result->_serviceId);
-  }
-
-}
diff --git a/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php b/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php
index ad05400..6afc3aa 100644
--- a/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php
+++ b/core/tests/Drupal/Tests/Core/DependencyInjection/DependencySerializationTest.php
@@ -9,6 +9,7 @@
 
 use Drupal\Core\DependencyInjection\Container;
 use Drupal\Core\DependencyInjection\DependencySerializationTrait;
+use Drupal\Core\DependencyInjection\ReverseServiceResolver;
 use Drupal\Tests\UnitTestCase;
 use Symfony\Component\DependencyInjection\ContainerAwareInterface;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -26,10 +27,10 @@ class DependencySerializationTest extends UnitTestCase {
   public function testSerialization() {
     // Create a pseudo service and dependency injected object.
     $service = new \stdClass();
-    $service->_serviceId = 'test_service';
     $container = new Container();
     $container->set('test_service', $service);
     $container->set('service_container', $container);
+    $container->set('reverse_service_resolver', new ReverseServiceResolver($container));
     \Drupal::setContainer($container);
 
     $dependencySerialization = new DependencySerializationTestDummy($service);
