diff --git a/composer.lock b/composer.lock
index 74b69b59d0630697453d8ebcbcb7cebe8c2c53ab..7066af29277729bbe0d438fc265e91c0c6a3c5b9 100644
--- a/composer.lock
+++ b/composer.lock
@@ -457,7 +457,7 @@
             "dist": {
                 "type": "path",
                 "url": "core",
-                "reference": "66032fab56e4ed2421480c8343f8c86f7db8a18f"
+                "reference": "f8e50d64acdddb816b10f83ca307712bd2cd65e5"
             },
             "require": {
                 "asm89/stack-cors": "^1.1",
@@ -487,7 +487,6 @@
                 "psr/log": "^1.0",
                 "stack/builder": "^1.0",
                 "symfony-cmf/routing": "^2.1",
-                "symfony/class-loader": "~3.4.0",
                 "symfony/console": "^4.4",
                 "symfony/dependency-injection": "^4.4",
                 "symfony/event-dispatcher": "^4.4",
@@ -660,11 +659,29 @@
                 },
                 "classmap": [
                     "lib/Drupal.php",
+                    "lib/Drupal/Component/DependencyInjection/Container.php",
+                    "lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php",
+                    "lib/Drupal/Component/FileCache/FileCacheFactory.php",
                     "lib/Drupal/Component/Utility/Timer.php",
                     "lib/Drupal/Component/Utility/Unicode.php",
+                    "lib/Drupal/Core/Cache/Cache.php",
+                    "lib/Drupal/Core/Cache/CacheBackendInterface.php",
+                    "lib/Drupal/Core/Cache/CacheTagsChecksumInterface.php",
+                    "lib/Drupal/Core/Cache/CacheTagsChecksumTrait.php",
+                    "lib/Drupal/Core/Cache/CacheTagsInvalidatorInterface.php",
+                    "lib/Drupal/Core/Cache/DatabaseBackend.php",
+                    "lib/Drupal/Core/Cache/DatabaseCacheTagsChecksum.php",
+                    "lib/Drupal/Core/Database/Connection.php",
                     "lib/Drupal/Core/Database/Database.php",
+                    "lib/Drupal/Core/Database/Driver/mysql/Connection.php",
+                    "lib/Drupal/Core/Database/Driver/pgsql/Connection.php",
+                    "lib/Drupal/Core/Database/Driver/sqlite/Connection.php",
+                    "lib/Drupal/Core/Database/Statement.php",
+                    "lib/Drupal/Core/Database/StatementInterface.php",
+                    "lib/Drupal/Core/DependencyInjection/Container.php",
                     "lib/Drupal/Core/DrupalKernel.php",
                     "lib/Drupal/Core/DrupalKernelInterface.php",
+                    "lib/Drupal/Core/Installer/InstallerRedirectTrait.php",
                     "lib/Drupal/Core/Site/Settings.php"
                 ]
             },
@@ -1916,62 +1933,6 @@
             ],
             "time": "2019-12-10T10:41:58+00:00"
         },
-        {
-            "name": "symfony/class-loader",
-            "version": "v3.4.37",
-            "source": {
-                "type": "git",
-                "url": "https://github.com/symfony/class-loader.git",
-                "reference": "bcdf6ff46e115b29be3186391f29e0da82cd6f72"
-            },
-            "dist": {
-                "type": "zip",
-                "url": "https://api.github.com/repos/symfony/class-loader/zipball/bcdf6ff46e115b29be3186391f29e0da82cd6f72",
-                "reference": "bcdf6ff46e115b29be3186391f29e0da82cd6f72",
-                "shasum": ""
-            },
-            "require": {
-                "php": "^5.5.9|>=7.0.8"
-            },
-            "require-dev": {
-                "symfony/finder": "~2.8|~3.0|~4.0",
-                "symfony/polyfill-apcu": "~1.1"
-            },
-            "suggest": {
-                "symfony/polyfill-apcu": "For using ApcClassLoader on HHVM"
-            },
-            "type": "library",
-            "extra": {
-                "branch-alias": {
-                    "dev-master": "3.4-dev"
-                }
-            },
-            "autoload": {
-                "psr-4": {
-                    "Symfony\\Component\\ClassLoader\\": ""
-                },
-                "exclude-from-classmap": [
-                    "/Tests/"
-                ]
-            },
-            "notification-url": "https://packagist.org/downloads/",
-            "license": [
-                "MIT"
-            ],
-            "authors": [
-                {
-                    "name": "Fabien Potencier",
-                    "email": "fabien@symfony.com"
-                },
-                {
-                    "name": "Symfony Community",
-                    "homepage": "https://symfony.com/contributors"
-                }
-            ],
-            "description": "Symfony ClassLoader Component",
-            "homepage": "https://symfony.com",
-            "time": "2020-01-04T12:05:51+00:00"
-        },
         {
             "name": "symfony/console",
             "version": "v4.4.4",
@@ -4101,9 +4062,6 @@
                 "ext-zip": "Enabling the zip extension allows you to unzip archives",
                 "ext-zlib": "Allow gzip compression of HTTP requests"
             },
-            "bin": [
-                "bin/composer"
-            ],
             "type": "library",
             "extra": {
                 "branch-alias": {
diff --git a/composer/Metapackage/CoreRecommended/composer.json b/composer/Metapackage/CoreRecommended/composer.json
index ada5f268639e226b9bf02d0575ee480a86fc61d9..82783170abf6d76ea66d390b91d909234f29706b 100644
--- a/composer/Metapackage/CoreRecommended/composer.json
+++ b/composer/Metapackage/CoreRecommended/composer.json
@@ -35,7 +35,6 @@
         "ralouphie/getallheaders": "3.0.3",
         "stack/builder": "v1.0.6",
         "symfony-cmf/routing": "2.1.1",
-        "symfony/class-loader": "v3.4.37",
         "symfony/console": "v4.4.4",
         "symfony/debug": "v4.4.4",
         "symfony/dependency-injection": "v4.4.4",
diff --git a/composer/Plugin/VendorHardening/Config.php b/composer/Plugin/VendorHardening/Config.php
index d468b03d2366640b8255a55b11683701939a26c2..da4deab0efe48b36182f97c34495b7c3f6340143 100644
--- a/composer/Plugin/VendorHardening/Config.php
+++ b/composer/Plugin/VendorHardening/Config.php
@@ -70,7 +70,6 @@ class Config {
     'squizlabs/php_codesniffer' => ['tests'],
     'stack/builder' => ['tests'],
     'symfony/browser-kit' => ['Tests'],
-    'symfony/class-loader' => ['Tests'],
     'symfony/console' => ['Tests'],
     'symfony/css-selector' => ['Tests'],
     'symfony/debug' => ['Tests'],
diff --git a/core/assets/scaffold/files/default.settings.php b/core/assets/scaffold/files/default.settings.php
index 1c8dbee9e7986c241e7f22b4d33afdaf57c914db..295f18e307144b6a2febb1a80d1752116abccb85 100644
--- a/core/assets/scaffold/files/default.settings.php
+++ b/core/assets/scaffold/files/default.settings.php
@@ -424,35 +424,13 @@
 /**
  * Class Loader.
  *
- * If the APC extension is detected, the Symfony APC class loader is used for
- * performance reasons. Detection can be prevented by setting
- * class_loader_auto_detect to false, as in the example below.
+ * If the APCu extension is detected, the classloader will be optimised to use
+ * it. Set to FALSE to disable this.
+ *
+ * @see https://getcomposer.org/doc/articles/autoloader-optimization.md
  */
 # $settings['class_loader_auto_detect'] = FALSE;
 
-/*
- * If the APC extension is not detected, either because APC is missing or
- * because auto-detection has been disabled, auto-loading falls back to
- * Composer's ClassLoader, which is good for development as it does not break
- * when code is moved in the file system. You can also decorate the base class
- * loader with another cached solution than the Symfony APC class loader, as
- * all production sites should have a cached class loader of some sort enabled.
- *
- * To do so, you may decorate and replace the local $class_loader variable. For
- * example, to use Symfony's APC class loader without automatic detection,
- * uncomment the code below.
- */
-/*
-if ($settings['hash_salt']) {
-  $prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']);
-  $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader);
-  unset($prefix);
-  $class_loader->unregister();
-  $apc_loader->register();
-  $class_loader = $apc_loader;
-}
-*/
-
 /**
  * Authorized file system operations:
  *
diff --git a/core/composer.json b/core/composer.json
index 486bae8d672d15636f6aa80cdaa312cfe5d7a125..d6fa77152456d87187d4837e2b0eac5d0180615f 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -18,7 +18,6 @@
         "ext-tokenizer": "*",
         "ext-xml": "*",
         "php": ">=7.3",
-        "symfony/class-loader": "~3.4.0",
         "symfony/console": "^4.4",
         "symfony/dependency-injection": "^4.4",
         "symfony/event-dispatcher": "^4.4",
@@ -176,11 +175,29 @@
         },
         "classmap": [
             "lib/Drupal.php",
+            "lib/Drupal/Component/DependencyInjection/Container.php",
+            "lib/Drupal/Component/DependencyInjection/PhpArrayContainer.php",
+            "lib/Drupal/Component/FileCache/FileCacheFactory.php",
             "lib/Drupal/Component/Utility/Timer.php",
             "lib/Drupal/Component/Utility/Unicode.php",
+            "lib/Drupal/Core/Cache/Cache.php",
+            "lib/Drupal/Core/Cache/CacheBackendInterface.php",
+            "lib/Drupal/Core/Cache/CacheTagsChecksumInterface.php",
+            "lib/Drupal/Core/Cache/CacheTagsChecksumTrait.php",
+            "lib/Drupal/Core/Cache/CacheTagsInvalidatorInterface.php",
+            "lib/Drupal/Core/Cache/DatabaseBackend.php",
+            "lib/Drupal/Core/Cache/DatabaseCacheTagsChecksum.php",
+            "lib/Drupal/Core/Database/Connection.php",
             "lib/Drupal/Core/Database/Database.php",
+            "lib/Drupal/Core/Database/Driver/mysql/Connection.php",
+            "lib/Drupal/Core/Database/Driver/pgsql/Connection.php",
+            "lib/Drupal/Core/Database/Driver/sqlite/Connection.php",
+            "lib/Drupal/Core/Database/Statement.php",
+            "lib/Drupal/Core/Database/StatementInterface.php",
+            "lib/Drupal/Core/DependencyInjection/Container.php",
             "lib/Drupal/Core/DrupalKernel.php",
             "lib/Drupal/Core/DrupalKernelInterface.php",
+            "lib/Drupal/Core/Installer/InstallerRedirectTrait.php",
             "lib/Drupal/Core/Site/Settings.php"
         ]
     },
diff --git a/core/lib/Drupal/Core/Composer/Composer.php b/core/lib/Drupal/Core/Composer/Composer.php
index b6937c39b2db4a73d773b540d2f7b665bd4fcd32..bd87d539225ab3423f82ad7080690d040d541df2 100644
--- a/core/lib/Drupal/Core/Composer/Composer.php
+++ b/core/lib/Drupal/Core/Composer/Composer.php
@@ -68,7 +68,6 @@ class Composer {
     'squizlabs/php_codesniffer' => ['tests'],
     'stack/builder' => ['tests'],
     'symfony/browser-kit' => ['Tests'],
-    'symfony/class-loader' => ['Tests'],
     'symfony/console' => ['Tests'],
     'symfony/css-selector' => ['Tests'],
     'symfony/debug' => ['Tests'],
@@ -116,14 +115,18 @@ public static function preAutoloadDump(Event $event) {
     if (!isset($autoload['classmap'])) {
       $autoload['classmap'] = [];
     }
-    // Check for our packages, and then optimize them if they're present.
+    // Check for packages used prior to the default classloader being able to
+    // use APCu and optimize them if they're present.
+    // @see \Drupal\Core\DrupalKernel::boot()
     if ($repository->findPackage('symfony/http-foundation', $constraint)) {
       $autoload['classmap'] = array_merge($autoload['classmap'], [
         $vendor_dir . '/symfony/http-foundation/Request.php',
+        $vendor_dir . '/symfony/http-foundation/RequestStack.php',
         $vendor_dir . '/symfony/http-foundation/ParameterBag.php',
         $vendor_dir . '/symfony/http-foundation/FileBag.php',
         $vendor_dir . '/symfony/http-foundation/ServerBag.php',
         $vendor_dir . '/symfony/http-foundation/HeaderBag.php',
+        $vendor_dir . '/symfony/http-foundation/HeaderUtils.php',
       ]);
     }
     if ($repository->findPackage('symfony/http-kernel', $constraint)) {
@@ -133,6 +136,30 @@ public static function preAutoloadDump(Event $event) {
         $vendor_dir . '/symfony/http-kernel/TerminableInterface.php',
       ]);
     }
+    if ($repository->findPackage('symfony/http-kernel', $constraint)) {
+      $autoload['classmap'] = array_merge($autoload['classmap'], [
+        $vendor_dir . '/symfony/http-kernel/HttpKernel.php',
+        $vendor_dir . '/symfony/http-kernel/HttpKernelInterface.php',
+        $vendor_dir . '/symfony/http-kernel/TerminableInterface.php',
+      ]);
+    }
+    if ($repository->findPackage('symfony/dependency-injection', $constraint)) {
+      $autoload['classmap'] = array_merge($autoload['classmap'], [
+        $vendor_dir . '/symfony/dependency-injection/ContainerAwareInterface.php',
+        $vendor_dir . '/symfony/dependency-injection/ContainerInterface.php',
+      ]);
+    }
+    if ($repository->findPackage('psr/container', $constraint)) {
+      $autoload['classmap'] = array_merge($autoload['classmap'], [
+        $vendor_dir . '/psr/container/src/ContainerInterface.php',
+      ]);
+    }
+    if ($repository->findPackage('laminas/laminas-zendframework-bridge', $constraint)) {
+      $autoload['classmap'] = array_merge($autoload['classmap'], [
+        $vendor_dir . '/laminas/laminas-zendframework-bridge/src/Autoloader.php',
+        $vendor_dir . '/laminas/laminas-zendframework-bridge/src/RewriteRules.php',
+      ]);
+    }
     $package->setAutoload($autoload);
   }
 
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 3bc14df4e065997b353195d67d5d4ead54842bff..68e166ce312188cf6f812f7e3e503ccf4ff57fe5 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -24,9 +24,6 @@
 use Drupal\Core\Security\RequestSanitizer;
 use Drupal\Core\Site\Settings;
 use Drupal\Core\Test\TestDatabase;
-use Symfony\Component\ClassLoader\ApcClassLoader;
-use Symfony\Component\ClassLoader\WinCacheClassLoader;
-use Symfony\Component\ClassLoader\XcacheClassLoader;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
 use Symfony\Component\HttpFoundation\RedirectResponse;
@@ -251,8 +248,7 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
    *   The request.
    * @param $class_loader
    *   The class loader. Normally Composer's ClassLoader, as included by the
-   *   front controller, but may also be decorated; e.g.,
-   *   \Symfony\Component\ClassLoader\ApcClassLoader.
+   *   front controller, but may also be decorated.
    * @param string $environment
    *   String indicating the environment, e.g. 'prod' or 'dev'.
    * @param bool $allow_dumping
@@ -281,8 +277,7 @@ public static function createFromRequest(Request $request, $class_loader, $envir
    *   String indicating the environment, e.g. 'prod' or 'dev'.
    * @param $class_loader
    *   The class loader. Normally \Composer\Autoload\ClassLoader, as included by
-   *   the front controller, but may also be decorated; e.g.,
-   *   \Symfony\Component\ClassLoader\ApcClassLoader.
+   *   the front controller, but may also be decorated.
    * @param bool $allow_dumping
    *   (optional) FALSE to stop the container from being written to or read
    *   from disk. Defaults to TRUE.
@@ -474,6 +469,15 @@ public function boot() {
     // Initialize the container.
     $this->initializeContainer();
 
+    // Add the APCu prefix to use to cache found/not-found classes.
+    if (Settings::get('class_loader_auto_detect', TRUE) && method_exists($this->classLoader, 'setApcuPrefix')) {
+      // Vary the APCu key by which modules are installed to allow
+      // class_exists() checks to determine functionality.
+      $id = 'class_loader:' . crc32(implode(array_keys($this->container->getParameter('container.modules')), ':'));
+      $prefix = Settings::getApcuPrefix($id, $this->root);
+      $this->classLoader->setApcuPrefix($prefix);
+    }
+
     if (in_array('phar', stream_get_wrappers(), TRUE)) {
       // Set up a stream wrapper to handle insecurities due to PHP's builtin
       // phar stream wrapper. This is not registered as a regular stream wrapper
@@ -1029,7 +1033,6 @@ public static function bootEnvironment($app_root = NULL) {
   protected function initializeSettings(Request $request) {
     $site_path = static::findSitePath($request);
     $this->setSitePath($site_path);
-    $class_loader_class = get_class($this->classLoader);
     Settings::initialize($this->root, $site_path, $this->classLoader);
 
     // Initialize our list of trusted HTTP Host headers to protect against
@@ -1040,40 +1043,6 @@ protected function initializeSettings(Request $request) {
         throw new BadRequestHttpException('The provided host name is not valid for this server.');
       }
     }
-
-    // If the class loader is still the same, possibly
-    // upgrade to an optimized class loader.
-    if ($class_loader_class == get_class($this->classLoader)
-        && Settings::get('class_loader_auto_detect', TRUE)) {
-      $prefix = Settings::getApcuPrefix('class_loader', $this->root);
-      $loader = NULL;
-
-      // We autodetect one of the following three optimized classloaders, if
-      // their underlying extension exists.
-      if (function_exists('apcu_fetch')) {
-        $loader = new ApcClassLoader($prefix, $this->classLoader);
-      }
-      elseif (extension_loaded('wincache')) {
-        $loader = new WinCacheClassLoader($prefix, $this->classLoader);
-      }
-      elseif (extension_loaded('xcache')) {
-        $loader = new XcacheClassLoader($prefix, $this->classLoader);
-      }
-      if (!empty($loader)) {
-        $this->classLoader->unregister();
-        // The optimized classloader might be persistent and store cache misses.
-        // For example, once a cache miss is stored in APCu clearing it on a
-        // specific web-head will not clear any other web-heads. Therefore
-        // fallback to the composer class loader that only statically caches
-        // misses.
-        $old_loader = $this->classLoader;
-        $this->classLoader = $loader;
-        // Our class loaders are prepended to ensure they come first like the
-        // class loader they are replacing.
-        $old_loader->register(TRUE);
-        $loader->register(TRUE);
-      }
-    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Site/Settings.php b/core/lib/Drupal/Core/Site/Settings.php
index 762462464b31df99c749ea2c6cb698dd96587159..adecc0f1a944e09b48f20b9b10f9f81753dcf627 100644
--- a/core/lib/Drupal/Core/Site/Settings.php
+++ b/core/lib/Drupal/Core/Site/Settings.php
@@ -107,7 +107,7 @@ public static function getAll() {
    * @param \Composer\Autoload\ClassLoader $class_loader
    *   The class loader that is used for this request. Passed by reference and
    *   exposed to the local scope of settings.php, so as to allow it to be
-   *   decorated with Symfony's ApcClassLoader, for example.
+   *   decorated.
    *
    * @see default.settings.php
    */
diff --git a/core/modules/help_topics/tests/modules/help_topics_test/help_topics_test.info.yml b/core/modules/help_topics/tests/modules/help_topics_test/help_topics_test.info.yml
index 62b8655ff22ac65ae8a0484e346979563cb72844..cf74fada3db8753d88efa1a05f15bfdabdee181c 100644
--- a/core/modules/help_topics/tests/modules/help_topics_test/help_topics_test.info.yml
+++ b/core/modules/help_topics/tests/modules/help_topics_test/help_topics_test.info.yml
@@ -4,3 +4,5 @@ name: 'ABC Help Test'
 type: module
 description: 'Support module for help testing.'
 package: Testing
+dependencies:
+  - help_topics
diff --git a/core/modules/help_topics/tests/src/Functional/HelpTopicSearchTest.php b/core/modules/help_topics/tests/src/Functional/HelpTopicSearchTest.php
index 2f6765c1519a37ea7ce45fd9d150dc56462060aa..889025104e9b914d60b5788d0285f5f375980328 100644
--- a/core/modules/help_topics/tests/src/Functional/HelpTopicSearchTest.php
+++ b/core/modules/help_topics/tests/src/Functional/HelpTopicSearchTest.php
@@ -241,6 +241,7 @@ public function testHelpSearch() {
    * Tests uninstalling the help_topics module.
    */
   public function testUninstall() {
+    \Drupal::service('module_installer')->uninstall(['help_topics_test']);
     // Ensure we can uninstall help_topics and use the help system without
     // breaking.
     $this->drupalLogin($this->rootUser);
diff --git a/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php b/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
index d0ea11c41f170cee412a9d753e32c680175e02f9..2fdefb7bac7cf0b6504f1e6d4763d278c468e7c0 100644
--- a/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
+++ b/core/tests/Drupal/KernelTests/Core/DrupalKernel/DrupalKernelTest.php
@@ -2,14 +2,18 @@
 
 namespace Drupal\KernelTests\Core\DrupalKernel;
 
+use Composer\Autoload\ClassLoader;
 use Drupal\Core\DrupalKernel;
 use Drupal\KernelTests\KernelTestBase;
+use org\bovigo\vfs\vfsStream;
+use Prophecy\Argument;
 use Symfony\Component\HttpFoundation\Request;
 
 /**
  * Tests DIC compilation to disk.
  *
  * @group DrupalKernel
+ * @coversDefaultClass \Drupal\Core\DrupalKernel
  */
 class DrupalKernelTest extends KernelTestBase {
 
@@ -189,4 +193,64 @@ public function testPreventChangeOfSitePath() {
     $kernel->setSitePath($path);
   }
 
+  /**
+   * Data provider for self::testClassLoaderAutoDetect
+   * @return array
+   */
+  public function providerClassLoaderAutoDetect() {
+    return [
+      'TRUE' => [TRUE],
+      'FALSE' => [FALSE],
+    ];
+  }
+
+  /**
+   * Tests class_loader_auto_detect setting.
+   *
+   * This test runs in a separate process since it registers class loaders and
+   * results in statics being set.
+   *
+   * @runInSeparateProcess
+   * @preserveGlobalState disabled
+   * @covers ::boot
+   * @dataProvider providerClassLoaderAutoDetect
+   *
+   * @param bool $value
+   *   The value to set class_loader_auto_detect to.
+   */
+  public function testClassLoaderAutoDetect($value) {
+    // Create a virtual file system containing items that should be
+    // excluded. Exception being modules directory.
+    vfsStream::setup('root', NULL, [
+      'sites' => [
+        'default' => [],
+      ],
+      'core' => [
+        'lib' => [
+          'Drupal' => [
+            'Core' => [],
+            'Component' => [],
+          ],
+        ],
+      ],
+    ]);
+
+    $this->setSetting('class_loader_auto_detect', $value);
+    $classloader = $this->prophesize(ClassLoader::class);
+
+    // Assert that we call the setApcuPrefix on the classloader if
+    // class_loader_auto_detect is set to TRUE;
+    if ($value) {
+      $classloader->setApcuPrefix(Argument::type('string'))->shouldBeCalled();
+    }
+    else {
+      $classloader->setApcuPrefix(Argument::type('string'))->shouldNotBeCalled();
+    }
+
+    // Create a kernel suitable for testing.
+    $kernel = new DrupalKernel('test', $classloader->reveal(), FALSE, vfsStream::url('root'));
+    $kernel->setSitePath(vfsStream::url('root/sites/default'));
+    $kernel->boot();
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/DrupalKernel/DrupalKernelTest.php b/core/tests/Drupal/Tests/Core/DrupalKernel/DrupalKernelTest.php
index 1151382b1dfb06e1522075f3ded44823b60ce731..efdfe3e7831eb509f710af392ad9a132aac4d119 100644
--- a/core/tests/Drupal/Tests/Core/DrupalKernel/DrupalKernelTest.php
+++ b/core/tests/Drupal/Tests/Core/DrupalKernel/DrupalKernelTest.php
@@ -5,7 +5,6 @@
   use Drupal\Core\DrupalKernel;
   use Drupal\Tests\UnitTestCase;
   use org\bovigo\vfs\vfsStream;
-  use Symfony\Component\ClassLoader\ApcClassLoader;
   use Symfony\Component\HttpFoundation\Request;
 
   /**
@@ -48,63 +47,6 @@ public function testTrustedHosts($host, $server_name, $message, $expected = FALS
       Request::setFactory(NULL);
     }
 
-    /**
-     * Tests the reregistration of autoloaders if APCu available.
-     *
-     * This test runs in a separate process since it registers class loaders and
-     * results in statics being set.
-     *
-     * @runInSeparateProcess
-     * @preserveGlobalState disabled
-     * @requires function apcu_fetch
-     * @covers ::initializeSettings
-     */
-    public function testInitializeSettings() {
-      $request = new Request();
-      $classloader = new fakeAutoloader();
-
-      // Create a kernel suitable for testing.
-      $kernel = $this->getMockBuilder(DrupalKernel::class)
-        ->disableOriginalConstructor()
-        ->setMethods(['do_not_mock_any_methods'])
-        ->getMock();
-      $classloader_property = new \ReflectionProperty($kernel, 'classLoader');
-      $classloader_property->setAccessible(TRUE);
-      $classloader_property->setValue($kernel, $classloader);
-      $method = new \ReflectionMethod($kernel, 'initializeSettings');
-      $method->setAccessible(TRUE);
-
-      // Prepend another autoloader to simulate Drush's autoloader.
-      $fake_drush_autoloader = function () {
-        return NULL;
-      };
-      spl_autoload_register($fake_drush_autoloader, TRUE, TRUE);
-
-      // Before calling DrupalKernel::initializeSettings() the first autoloader
-      // is the fake Drush autoloader.
-      $this->assertSame($fake_drush_autoloader, spl_autoload_functions()[0]);
-
-      // Call DrupalKernel::initializeSettings() to simulate part of a Drupal
-      // bootstrap. During the include of autoload.php Composer would prepend
-      // Drupal's autoloader and then this method should not result in Drush's
-      // autoloader becoming the first autoloader even if it swaps out
-      // Composer's autoloader for an optimised one.
-      $method->invoke($kernel, $request);
-
-      $autoloaders = spl_autoload_functions();
-      // The first autoloader should be the APCu based autoloader.
-      $this->assertInstanceOf(ApcClassLoader::class, $autoloaders[0][0]);
-      // The second autoloader should be the original autoloader the kernel was
-      // constructed with.
-      $this->assertSame($classloader, $autoloaders[1][0]);
-      // The third autoloader should be Drush's autoloader.
-      $this->assertSame($fake_drush_autoloader, $autoloaders[2]);
-
-      // Reset the request factory because it is statically stored on the
-      // request.
-      Request::setFactory(NULL);
-    }
-
     /**
      * Provides test data for testTrustedHosts().
      */
diff --git a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
index 69672dd41d70f2f34b3a041c5f9a7396bf27ae94..651c94ef67a1f9f2fb227b764ca8c368c58519b2 100644
--- a/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
+++ b/core/tests/Drupal/Tests/Listeners/DeprecationListenerTrait.php
@@ -140,11 +140,6 @@ public static function isDeprecationSkipped($message) {
    */
   public static function getSkippedDeprecations() {
     return [
-      'The Symfony\Component\ClassLoader\ApcClassLoader class is deprecated since Symfony 3.3 and will be removed in 4.0. Use `composer install --apcu-autoloader` instead.',
-      // The following deprecation is not triggered by DrupalCI testing since it
-      // is a Windows only deprecation. Remove when core no longer uses
-      // WinCacheClassLoader in \Drupal\Core\DrupalKernel::initializeSettings().
-      'The Symfony\Component\ClassLoader\WinCacheClassLoader class is deprecated since Symfony 3.3 and will be removed in 4.0. Use `composer install --apcu-autoloader` instead.',
       // The following deprecation message is skipped for testing purposes.
       '\Drupal\Tests\SkippedDeprecationTest deprecation',
       // These deprecations are triggered by symfony/psr-http-message-factory
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 1c8dbee9e7986c241e7f22b4d33afdaf57c914db..295f18e307144b6a2febb1a80d1752116abccb85 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -424,35 +424,13 @@
 /**
  * Class Loader.
  *
- * If the APC extension is detected, the Symfony APC class loader is used for
- * performance reasons. Detection can be prevented by setting
- * class_loader_auto_detect to false, as in the example below.
+ * If the APCu extension is detected, the classloader will be optimised to use
+ * it. Set to FALSE to disable this.
+ *
+ * @see https://getcomposer.org/doc/articles/autoloader-optimization.md
  */
 # $settings['class_loader_auto_detect'] = FALSE;
 
-/*
- * If the APC extension is not detected, either because APC is missing or
- * because auto-detection has been disabled, auto-loading falls back to
- * Composer's ClassLoader, which is good for development as it does not break
- * when code is moved in the file system. You can also decorate the base class
- * loader with another cached solution than the Symfony APC class loader, as
- * all production sites should have a cached class loader of some sort enabled.
- *
- * To do so, you may decorate and replace the local $class_loader variable. For
- * example, to use Symfony's APC class loader without automatic detection,
- * uncomment the code below.
- */
-/*
-if ($settings['hash_salt']) {
-  $prefix = 'drupal.' . hash('sha256', 'drupal.' . $settings['hash_salt']);
-  $apc_loader = new \Symfony\Component\ClassLoader\ApcClassLoader($prefix, $class_loader);
-  unset($prefix);
-  $class_loader->unregister();
-  $apc_loader->register();
-  $class_loader = $apc_loader;
-}
-*/
-
 /**
  * Authorized file system operations:
  *