diff --git a/composer.json b/composer.json
index 9fa6935..135e36a 100644
--- a/composer.json
+++ b/composer.json
@@ -27,7 +27,10 @@
       "Drupal\\Core": "core/lib/",
       "Drupal\\Component": "core/lib/",
       "Drupal\\Driver": "drivers/lib/"
-    }
+    },
+    "files": [
+      "core/lib/Drupal.php"
+    ]
   },
   "config": {
     "vendor-dir": "core/vendor",
diff --git a/core/authorize.php b/core/authorize.php
index fe39394..3507f7f 100644
--- a/core/authorize.php
+++ b/core/authorize.php
@@ -23,6 +23,8 @@
 // Change the directory to the Drupal root.
 chdir('..');
 
+require_once __DIR__ . '/autoload.php';
+
 /**
  * Global flag to identify update.php and authorize.php runs.
  *
diff --git a/core/autoload.php b/core/autoload.php
new file mode 100644
index 0000000..4909004
--- /dev/null
+++ b/core/autoload.php
@@ -0,0 +1,7 @@
+<?php
+
+use Drupal\Core\Autoload\DrupalAutoloaderInit;
+
+require_once __DIR__ . '/lib/Drupal/Core/Autoload/DrupalAutoloaderInit.php';
+
+return DrupalAutoloaderInit::getLoader();
\ No newline at end of file
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 11b22df..ec0782b 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -10,7 +10,6 @@
 use Drupal\Core\DrupalKernel;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
-use Symfony\Component\ClassLoader\ClassLoader;
 use Symfony\Component\ClassLoader\ApcClassLoader;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 use Symfony\Component\DependencyInjection\Container;
@@ -512,9 +511,6 @@ function drupal_override_server_variables($variables = array()) {
  * Initializes the PHP environment.
  */
 function drupal_environment_initialize() {
-  // Make sure the \Drupal class is available.
-  require_once DRUPAL_ROOT . '/core/lib/Drupal.php';
-
   if (!isset($_SERVER['HTTP_REFERER'])) {
     $_SERVER['HTTP_REFERER'] = '';
   }
@@ -597,7 +593,7 @@ function drupal_settings_initialize() {
   if (is_readable(DRUPAL_ROOT . '/' . $conf_path . '/settings.php')) {
     include_once DRUPAL_ROOT . '/' . $conf_path . '/settings.php';
   }
-  require_once DRUPAL_ROOT . '/core/lib/Drupal/Component/Utility/Settings.php';
+
   new Settings(isset($settings) ? $settings : array());
   $is_https = isset($_SERVER['HTTPS']) && strtolower($_SERVER['HTTPS']) == 'on';
 
@@ -1853,51 +1849,6 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
 }
 
 /**
- * Handles an entire PHP request.
- *
- * This function may be called by PHP scripts (e.g., Drupal's index.php) that
- * want Drupal to take over the entire PHP processing of the request. The only
- * expectation is that PHP's superglobals are initialized as desired (PHP does
- * this automatically, but some scripts might want to alter them) and that the
- * DRUPAL_ROOT constant is defined and set to the absolute server directory of
- * Drupal's codebase.
- *
- * Scripts and applications that want to invoke multiple Drupal requests within
- * a single PHP request, or Drupal request handling within some larger workflow,
- * should not call this function, but instead instantiate and use
- * \Drupal\Core\DrupalKernel as needed.
- *
- * @param boolean $test_only
- *   Whether to restrict handling to only requests invoked by SimpleTest.
- *
- * @see index.php
- */
-function drupal_handle_request($test_only = FALSE) {
-  // Initialize the environment, load settings.php, and activate a PSR-0 class
-  // autoloader with required namespaces registered.
-  drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
-
-  // Exit if we should be in a test environment but aren't.
-  if ($test_only && !drupal_valid_test_ua()) {
-    header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
-    exit;
-  }
-
-  $kernel = new DrupalKernel('prod', drupal_classloader(), !$test_only);
-
-  // @todo Remove this once everything in the bootstrap has been
-  //   converted to services in the DIC.
-  $kernel->boot();
-  drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE);
-
-  // Create a request object from the HttpFoundation.
-  $request = Request::createFromGlobals();
-  $response = $kernel->handle($request)->prepare($request)->send();
-
-  $kernel->terminate($request, $response);
-}
-
-/**
  * Returns the time zone of the current user.
  */
 function drupal_get_user_timezone() {
@@ -2756,7 +2707,7 @@ function arg($index = NULL, $path = NULL) {
  *   loader class when calling drupal_classloader() from settings.php. It is
  *   ignored otherwise.
  *
- * @return \Symfony\Component\ClassLoader\ClassLoader
+ * @return \Drupal\Core\Autoload\ClassLoader
  *   A ClassLoader class instance (or extension thereof).
  */
 function drupal_classloader($class_loader = NULL) {
@@ -2767,9 +2718,8 @@ function drupal_classloader($class_loader = NULL) {
 
   if (!isset($loader)) {
 
-    // Include the Symfony ClassLoader for loading PSR-0-compatible classes.
-    require_once DRUPAL_ROOT . '/core/vendor/symfony/class-loader/Symfony/Component/ClassLoader/ClassLoader.php';
-    $loader = new ClassLoader();
+    // Retrieve the Composer ClassLoader for loading classes.
+    $loader = include __DIR__ . '/../autoload.php';
 
     // Register the class loader.
     // When configured to use APC, the ApcClassLoader is registered instead.
@@ -2782,18 +2732,12 @@ function drupal_classloader($class_loader = NULL) {
     if ($class_loader === 'apc') {
       require_once DRUPAL_ROOT . '/core/vendor/symfony/class-loader/Symfony/Component/ClassLoader/ApcClassLoader.php';
       $apc_loader = new ApcClassLoader('drupal.' . drupal_get_hash_salt(), $loader);
+      $loader->unregister();
       $apc_loader->register();
     }
     else {
       $loader->register();
     }
-
-    // Register namespaces for vendor libraries managed by Composer.
-    $prefixes_and_namespaces = require DRUPAL_ROOT . '/core/vendor/composer/autoload_namespaces.php';
-    $loader->addPrefixes($prefixes_and_namespaces);
-
-    // Register the loader with PHP.
-    $loader->register();
   }
   return $loader;
 }
@@ -2808,7 +2752,7 @@ function drupal_classloader($class_loader = NULL) {
  */
 function drupal_classloader_register($name, $path) {
   $loader = drupal_classloader();
-  $loader->addPrefix('Drupal\\' . $name, DRUPAL_ROOT . '/' . $path . '/lib');
+  $loader->add('Drupal\\' . $name, DRUPAL_ROOT . '/' . $path . '/lib');
 }
 
 /**
diff --git a/core/install.php b/core/install.php
index 641403d..e2900a2 100644
--- a/core/install.php
+++ b/core/install.php
@@ -8,6 +8,8 @@
 // Change the directory to the Drupal root.
 chdir('..');
 
+require_once __DIR__ . '/autoload.php';
+
 /**
  * Global flag to indicate the site is in installation mode.
  *
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index 7720e04..4fc1d56 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -5,6 +5,8 @@
  * Contains Drupal.
  */
 
+use Drupal\Core\DrupalKernel;
+use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
 /**
@@ -77,6 +79,54 @@
 class Drupal {
 
   /**
+   * Handles an entire PHP request.
+   *
+   * This function may be called by PHP scripts (e.g., Drupal's index.php) that
+   * want Drupal to take over the entire PHP processing of the request. The only
+   * expectation is that PHP's superglobals are initialized as desired (PHP does
+   * this automatically, but some scripts might want to alter them) and that the
+   * DRUPAL_ROOT constant is defined and set to the absolute server directory of
+   * Drupal's codebase.
+   *
+   * Scripts and applications that want to invoke multiple Drupal requests within
+   * a single PHP request, or Drupal request handling within some larger workflow,
+   * should not call this function, but instead instantiate and use
+   * \Drupal\Core\DrupalKernel as needed.
+   *
+   * @param boolean $test_only
+   *   Whether to restrict handling to only requests invoked by SimpleTest.
+   *
+   * @see index.php
+   */
+  public static function handleRequest($test_only = FALSE) {
+    // Prepare the Drupal bootstrap.
+    require_once __DIR__ . '/../includes/bootstrap.inc';
+
+    // Initialize the environment, load settings.php, and activate a PSR-0 class
+    // autoloader with required namespaces registered.
+    drupal_bootstrap(DRUPAL_BOOTSTRAP_CONFIGURATION);
+
+    // Exit if we should be in a test environment but aren't.
+    if ($test_only && !drupal_valid_test_ua()) {
+     header($_SERVER['SERVER_PROTOCOL'] . ' 403 Forbidden');
+     exit;
+    }
+
+    $kernel = new DrupalKernel('prod', drupal_classloader(), !$test_only);
+
+    // @todo Remove this once everything in the bootstrap has been
+    //   converted to services in the DIC.
+    $kernel->boot();
+    drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE);
+
+    // Create a request object from the HttpFoundation.
+    $request = Request::createFromGlobals();
+    $response = $kernel->handle($request)->prepare($request)->send();
+
+    $kernel->terminate($request, $response);
+  }
+
+  /**
    * The currently active container object.
    *
    * @var \Symfony\Component\DependencyInjection\ContainerInterface
diff --git a/core/lib/Drupal/Core/Autoload/ClassLoader.php b/core/lib/Drupal/Core/Autoload/ClassLoader.php
new file mode 100644
index 0000000..351c6b7
--- /dev/null
+++ b/core/lib/Drupal/Core/Autoload/ClassLoader.php
@@ -0,0 +1,343 @@
+<?php
+
+namespace Drupal\Core\Autoload;
+
+/**
+ * ClassLoader implements a PSR-0 class loader
+ *
+ * See https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md
+ *
+ *     $loader = new \Composer\Autoload\ClassLoader();
+ *
+ *     // register classes with namespaces
+ *     $loader->add('Symfony\Component', __DIR__.'/component');
+ *     $loader->add('Symfony',           __DIR__.'/framework');
+ *
+ *     // activate the autoloader
+ *     $loader->register();
+ *
+ *     // to enable searching the include path (eg. for PEAR packages)
+ *     $loader->setUseIncludePath(true);
+ *
+ * In this example, if you try to use a class in the Symfony\Component
+ * namespace or one of its children (Symfony\Component\Console for instance),
+ * the autoloader will first look for the class under the component/
+ * directory, and it will then fallback to the framework/ directory if not
+ * found before giving up.
+ *
+ * This class is loosely based on the Symfony UniversalClassLoader.
+ *
+ * @author Fabien Potencier <fabien@symfony.com>
+ * @author Jordi Boggiano <j.boggiano@seld.be>
+ */
+class ClassLoader {
+
+  // PSR-4
+  private $prefixLengthsPsr4 = array();
+  private $prefixDirsPsr4 = array();
+  private $fallbackDirsPsr4 = array();
+
+  // PSR-0
+  private $prefixesPsr0 = array();
+  private $fallbackDirsPsr0 = array();
+
+  private $useIncludePath = false;
+  private $classMap = array();
+
+  public function getPrefixes() {
+    return call_user_func_array('array_merge', $this->prefixesPsr0);
+  }
+
+  public function getPrefixesPsr4() {
+    return $this->prefixDirsPsr4;
+  }
+
+  public function getFallbackDirs() {
+    return $this->fallbackDirsPsr0;
+  }
+
+  public function getFallbackDirsPsr4() {
+    return $this->fallbackDirsPsr4;
+  }
+
+  public function getClassMap() {
+    return $this->classMap;
+  }
+
+  /**
+   * @param array $classMap Class to filename map
+   */
+  public function addClassMap(array $classMap) {
+    if ($this->classMap) {
+      $this->classMap = array_merge($this->classMap, $classMap);
+    }
+    else {
+      $this->classMap = $classMap;
+    }
+  }
+
+  /**
+   * Registers a set of PSR-0 directories for a given prefix, either
+   * appending or prepending to the ones previously set for this prefix.
+   *
+   * @param string       $prefix  The prefix
+   * @param array|string $paths   The PSR-0 root directories
+   * @param bool         $prepend Whether to prepend the directories
+   */
+  public function add($prefix, $paths, $prepend = false) {
+    if (!$prefix) {
+      if ($prepend) {
+        $this->fallbackDirsPsr0 = array_merge(
+          (array) $paths,
+          $this->fallbackDirsPsr0
+        );
+      }
+      else {
+        $this->fallbackDirsPsr0 = array_merge(
+          $this->fallbackDirsPsr0,
+          (array) $paths
+        );
+      }
+
+      return;
+    }
+
+    $first = $prefix[0];
+    if (!isset($this->prefixesPsr0[$first][$prefix])) {
+      $this->prefixesPsr0[$first][$prefix] = (array) $paths;
+
+      return;
+    }
+    if ($prepend) {
+      $this->prefixesPsr0[$first][$prefix] = array_merge(
+        (array) $paths,
+        $this->prefixesPsr0[$first][$prefix]
+      );
+    }
+    else {
+      $this->prefixesPsr0[$first][$prefix] = array_merge(
+        $this->prefixesPsr0[$first][$prefix],
+        (array) $paths
+      );
+    }
+  }
+
+  /**
+   * Registers a set of PSR-4 directories for a given namespace, either
+   * appending or prepending to the ones previously set for this namespace.
+   *
+   * @param string $prefix  The prefix/namespace, with trailing '\\'
+   * @param array|string $paths   The PSR-0 base directories
+   * @param bool $prepend Whether to prepend the directories
+   * @throws \Exception
+   */
+  public function addPsr4($prefix, $paths, $prepend = false) {
+    if (!$prefix) {
+      // Register directories for the root namespace.
+      if ($prepend) {
+        $this->fallbackDirsPsr4 = array_merge(
+          (array) $paths,
+          $this->fallbackDirsPsr4
+        );
+      }
+      else {
+        $this->fallbackDirsPsr4 = array_merge(
+          $this->fallbackDirsPsr4,
+          (array) $paths
+        );
+      }
+    }
+    elseif (!isset($this->prefixDirsPsr4[$prefix])) {
+      // Register directories for a new namespace.
+      $length = strlen($prefix);
+      if ('\\' !== $prefix[$length - 1]) {
+        throw new \Exception("A non-empty PSR-4 prefix must end with a namespace separator.");
+      }
+      $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+      $this->prefixDirsPsr4[$prefix] = (array) $paths;
+    }
+    elseif ($prepend) {
+      // Prepend directories for an already registered namespace.
+      $this->prefixDirsPsr4[$prefix] = array_merge(
+        (array) $paths,
+        $this->prefixDirsPsr4[$prefix]
+      );
+    }
+    else {
+      // Append directories for an already registered namespace.
+      $this->prefixDirsPsr4[$prefix] = array_merge(
+        $this->prefixDirsPsr4[$prefix],
+        (array) $paths
+      );
+    }
+  }
+
+  /**
+   * Registers a set of PSR-0 directories for a given prefix,
+   * replacing any others previously set for this prefix.
+   *
+   * @param string       $prefix The prefix
+   * @param array|string $paths  The PSR-0 base directories
+   */
+  public function set($prefix, $paths) {
+    if (!$prefix) {
+      $this->fallbackDirsPsr0 = (array) $paths;
+    }
+    else {
+      $this->prefixesPsr0[$prefix[0]][$prefix] = (array) $paths;
+    }
+  }
+
+  /**
+   * Registers a set of PSR-4 directories for a given namespace,
+   * replacing any others previously set for this namespace.
+   *
+   * @param string $prefix  The prefix/namespace, with trailing '\\'
+   * @param array|string $paths   The PSR-4 base directories
+   * @throws \Exception
+   */
+  public function setPsr4($prefix, $paths) {
+    if (!$prefix) {
+      $this->fallbackDirsPsr4 = (array) $paths;
+    }
+    else {
+      $length = strlen($prefix);
+      if ('\\' !== $prefix[$length - 1]) {
+        throw new \Exception("A non-empty PSR-4 prefix must end with a namespace separator.");
+      }
+      $this->prefixLengthsPsr4[$prefix[0]][$prefix] = $length;
+      $this->prefixDirsPsr4[$prefix] = (array) $paths;
+    }
+  }
+
+  /**
+   * Turns on searching the include path for class files.
+   *
+   * @param bool $useIncludePath
+   */
+  public function setUseIncludePath($useIncludePath) {
+    $this->useIncludePath = $useIncludePath;
+  }
+
+  /**
+   * Can be used to check if the autoloader uses the include path to check
+   * for classes.
+   *
+   * @return bool
+   */
+  public function getUseIncludePath() {
+    return $this->useIncludePath;
+  }
+
+  /**
+   * Registers this instance as an autoloader.
+   *
+   * @param bool $prepend Whether to prepend the autoloader or not
+   */
+  public function register($prepend = false) {
+    spl_autoload_register(array($this, 'loadClass'), true, $prepend);
+  }
+
+  /**
+   * Unregisters this instance as an autoloader.
+   */
+  public function unregister() {
+    spl_autoload_unregister(array($this, 'loadClass'));
+  }
+
+  /**
+   * Loads the given class or interface.
+   *
+   * @param  string    $class The name of the class
+   * @return bool|null True if loaded, null otherwise
+   */
+  public function loadClass($class) {
+    if ($file = $this->findFile($class)) {
+      include $file;
+
+      return true;
+    }
+  }
+
+  /**
+   * Finds the path to the file where the class is defined.
+   *
+   * @param string $class The name of the class
+   *
+   * @return string|false The path if found, false otherwise
+   */
+  public function findFile($class) {
+    // work around for PHP 5.3.0 - 5.3.2 https://bugs.php.net/50731
+    if ('\\' == $class[0]) {
+      $class = substr($class, 1);
+    }
+
+    // class map lookup
+    if (isset($this->classMap[$class])) {
+      return $this->classMap[$class];
+    }
+
+    // PSR-4 lookup
+    $logicalPathPsr4 = strtr($class, '\\', DIRECTORY_SEPARATOR) . '.php';
+
+    $first = $class[0];
+    if (isset($this->prefixLengthsPsr4[$first])) {
+      foreach ($this->prefixLengthsPsr4[$first] as $prefix => $length) {
+        if (0 === strpos($class, $prefix)) {
+          foreach ($this->prefixDirsPsr4[$prefix] as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . substr($logicalPathPsr4, $length))) {
+              return $file;
+            }
+          }
+        }
+      }
+    }
+
+    // PSR-4 fallback dirs
+    foreach ($this->fallbackDirsPsr4 as $dir) {
+      if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr4)) {
+        return $file;
+      }
+    }
+
+    // PSR-0 lookup
+    if (false !== $pos = strrpos($class, '\\')) {
+      // namespaced class name
+      $logicalPathPsr0
+        = substr($logicalPathPsr4, 0, $pos + 1)
+        . strtr(substr($logicalPathPsr4, $pos + 1), '_', DIRECTORY_SEPARATOR)
+      ;
+    }
+    else {
+      // PEAR-like class name
+      $logicalPathPsr0 = strtr($class, '_', DIRECTORY_SEPARATOR) . '.php';
+    }
+
+    if (isset($this->prefixesPsr0[$first])) {
+      foreach ($this->prefixesPsr0[$first] as $prefix => $dirs) {
+        if (0 === strpos($class, $prefix)) {
+          foreach ($dirs as $dir) {
+            if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+              return $file;
+            }
+          }
+        }
+      }
+    }
+
+    // PSR-0 fallback dirs
+    foreach ($this->fallbackDirsPsr0 as $dir) {
+      if (file_exists($file = $dir . DIRECTORY_SEPARATOR . $logicalPathPsr0)) {
+        return $file;
+      }
+    }
+
+    // PSR-0 include paths.
+    if ($this->useIncludePath && $file = stream_resolve_include_path($logicalPathPsr0)) {
+      return $file;
+    }
+
+    // Remember that this class does not exist.
+    return $this->classMap[$class] = false;
+  }
+}
\ No newline at end of file
diff --git a/core/lib/Drupal/Core/Autoload/DrupalAutoloaderInit.php b/core/lib/Drupal/Core/Autoload/DrupalAutoloaderInit.php
new file mode 100644
index 0000000..b77f6af
--- /dev/null
+++ b/core/lib/Drupal/Core/Autoload/DrupalAutoloaderInit.php
@@ -0,0 +1,51 @@
+<?php
+
+namespace Drupal\Core\Autoload;
+
+class DrupalAutoloaderInit
+{
+  private static $loader;
+
+  public static function loadClassLoader($class) {
+    if ('Drupal\Core\Autoload\ClassLoader' === $class) {
+      require __DIR__ . '/ClassLoader.php';
+    }
+  }
+
+  public static function getLoader() {
+    if (null !== self::$loader) {
+      return self::$loader;
+    }
+
+    spl_autoload_register(array('Drupal\Core\Autoload\DrupalAutoloaderInit', 'loadClassLoader'), true, true);
+    self::$loader = $loader = new ClassLoader();
+    spl_autoload_unregister(array('Drupal\Core\Autoload\DrupalAutoloaderInit', 'loadClassLoader'));
+
+    $coreDir = dirname(dirname(dirname(dirname(__DIR__))));
+    $vendorDir = $coreDir . '/vendor';
+    $composerDir = $vendorDir . '/composer';
+    $baseDir = dirname($coreDir);
+
+    $includePaths = require $composerDir . '/include_paths.php';
+    array_push($includePaths, get_include_path());
+    set_include_path(join(PATH_SEPARATOR, $includePaths));
+
+    $map = require $composerDir . '/autoload_namespaces.php';
+    foreach ($map as $namespace => $path) {
+      $loader->set($namespace, $path);
+    }
+
+    $classMap = require $composerDir . '/autoload_classmap.php';
+    if ($classMap) {
+      $loader->addClassMap($classMap);
+    }
+
+    $loader->register(true);
+
+    // @todo This can be updated once Composer provides a autoload_files.php.
+    require $vendorDir . '/kriswallsmith/assetic/src/functions.php';
+    require $baseDir . '/core/lib/Drupal.php';
+
+    return $loader;
+  }
+}
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index af1fe52..830909a 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -12,7 +12,6 @@
 use Drupal\Core\CoreServiceProvider;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\DependencyInjection\YamlFileLoader;
-use Symfony\Component\ClassLoader\ClassLoader;
 use Symfony\Component\Config\Loader\LoaderInterface;
 use Symfony\Component\DependencyInjection\ParameterBag\ParameterBag;
 use Symfony\Component\DependencyInjection\Dumper\PhpDumper;
@@ -20,6 +19,7 @@
 use Symfony\Component\HttpFoundation\Response;
 use Symfony\Component\HttpKernel\HttpKernelInterface;
 use Symfony\Component\HttpKernel\TerminableInterface;
+use Drupal\Core\Autoload\ClassLoader;
 
 /**
  * The DrupalKernel class is the core of Drupal itself.
@@ -97,7 +97,7 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
   /**
    * The classloader object.
    *
-   * @var \Symfony\Component\ClassLoader\ClassLoader
+   * @var \Drupal\Core\Autoload\ClassLoader
    */
   protected $classLoader;
 
@@ -150,7 +150,7 @@ class DrupalKernel implements DrupalKernelInterface, TerminableInterface {
    *   String indicating the environment, e.g. 'prod' or 'dev'. Used by
    *   Symfony\Component\HttpKernel\Kernel::__construct(). Drupal does not use
    *   this value currently. Pass 'prod'.
-   * @param \Symfony\Component\ClassLoader\ClassLoader $class_loader
+   * @param \Drupal\Core\Autoload\ClassLoader $class_loader
    *   (optional) The classloader is only used if $storage is not given or
    *   the load from storage fails and a container rebuild is required. In
    *   this case, the loaded modules will be registered with this loader in
@@ -521,7 +521,7 @@ protected function buildContainer() {
     $container->setParameter('container.namespaces', $namespaces);
 
     // Register synthetic services.
-    $container->register('class_loader', 'Symfony\Component\ClassLoader\ClassLoader')->setSynthetic(TRUE);
+    $container->register('class_loader', 'Composer\Autoload\ClassLoader')->setSynthetic(TRUE);
     $container->register('kernel', 'Symfony\Component\HttpKernel\KernelInterface')->setSynthetic(TRUE);
     $container->register('service_container', 'Symfony\Component\DependencyInjection\ContainerInterface')->setSynthetic(TRUE);
     $yaml_loader = new YamlFileLoader($container);
@@ -661,6 +661,8 @@ protected function getModuleNamespaces($moduleFileNames) {
    * Registers a list of namespaces.
    */
   protected function registerNamespaces(array $namespaces = array()) {
-    $this->classLoader->addPrefixes($namespaces);
+    foreach ($namespaces as $prefix => $path) {
+      $this->classLoader->addPsr4($prefix . '\\', $path . '/' . str_replace('\\', '/', $prefix));
+    }
   }
 }
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 4df4683..e1ed140 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -520,27 +520,28 @@ function simpletest_classloader_register() {
     'theme' => array('dir' => 'themes', 'extension' => 'info'),
     'profile' => array('dir' => 'profiles', 'extension' => 'profile'),
   );
+
+  $classloader = drupal_classloader();
+
   foreach ($types as $type => $info) {
     $matches = drupal_system_listing('/^' . DRUPAL_PHP_FUNCTION_PATTERN . '\.' . $info['extension'] . '$/', $info['dir']);
     foreach ($matches as $name => $file) {
       drupal_classloader_register($name, dirname($file->uri));
-      drupal_classloader()->addPrefix('Drupal\\' . $name . '\\Tests', DRUPAL_ROOT . '/' . dirname($file->uri) . '/tests');
+      $classloader->add('Drupal\\' . $name . '\\Tests', DRUPAL_ROOT . '/' . dirname($file->uri) . '/tests');
       // While being there, prime drupal_get_filename().
       drupal_get_filename($type, $name, $file->uri);
     }
   }
 
   // Register the core test directory so we can find \Drupal\UnitTestCase.
-  drupal_classloader()->addPrefix('Drupal\\Tests', DRUPAL_ROOT . '/core/tests');
+  $classloader->add('Drupal\\Tests', DRUPAL_ROOT . '/core/tests');
 
   // Manually register phpunit prefixes because they use a classmap instead of a
   // prefix. This can be safely removed if we move to using composer's
   // autoloader with a classmap.
-  drupal_classloader()->addPrefixes(array(
-    'PHPUnit' => DRUPAL_ROOT . '/core/vendor/phpunit/phpunit',
-    'File_Iterator' => DRUPAL_ROOT . '/core/vendor/phpunit/php-file-iterator/',
-    'PHP_Timer' => DRUPAL_ROOT . '/core/vendor/phpunit/php-timer/',
-  ));
+  $classloader->add('PHPUnit', DRUPAL_ROOT . '/core/vendor/phpunit/phpunit');
+  $classloader->add('File_Iterator', DRUPAL_ROOT . '/core/vendor/phpunit/php-file-iterator/');
+  $classloader->add('PHP_Timer', DRUPAL_ROOT . '/core/vendor/phpunit/php-timer/');
 }
 
 /**
diff --git a/core/modules/statistics/statistics.php b/core/modules/statistics/statistics.php
index 22d2fb4..f971faa 100644
--- a/core/modules/statistics/statistics.php
+++ b/core/modules/statistics/statistics.php
@@ -9,7 +9,8 @@
 chdir('../../..');
 
 // Load the Drupal bootstrap.
-include_once dirname(dirname(__DIR__)) . '/includes/bootstrap.inc';
+require_once dirname(dirname(__DIR__)) . '/autoload.php';
+require_once dirname(dirname(__DIR__)) . '/includes/bootstrap.inc';
 drupal_bootstrap(DRUPAL_BOOTSTRAP_VARIABLES);
 
 if (config('statistics.settings')->get('count_content_views')) {
diff --git a/core/modules/system/tests/http.php b/core/modules/system/tests/http.php
index 5e5e702..38dd888 100644
--- a/core/modules/system/tests/http.php
+++ b/core/modules/system/tests/http.php
@@ -18,5 +18,5 @@
 
 // Change current directory to the Drupal root.
 chdir('../../../..');
-require_once dirname(dirname(dirname(__DIR__))) . '/includes/bootstrap.inc';
-drupal_handle_request(TRUE);
+require_once dirname(dirname(dirname(__DIR__))) . '/autoload.php';
+Drupal::handleRequest(TRUE);
diff --git a/core/modules/system/tests/https.php b/core/modules/system/tests/https.php
index e509c15..7a5c998 100644
--- a/core/modules/system/tests/https.php
+++ b/core/modules/system/tests/https.php
@@ -20,5 +20,5 @@
 
 // Change current directory to the Drupal root.
 chdir('../../../..');
-require_once dirname(dirname(dirname(__DIR__))) . '/includes/bootstrap.inc';
-drupal_handle_request(TRUE);
+require_once dirname(dirname(dirname(__DIR__))) . '/autoload.php';
+Drupal::handleRequest(TRUE);
diff --git a/core/scripts/run-tests.sh b/core/scripts/run-tests.sh
index 49b1a44..0e36deb 100755
--- a/core/scripts/run-tests.sh
+++ b/core/scripts/run-tests.sh
@@ -4,6 +4,8 @@
  * This script runs Drupal tests from command line.
  */
 
+require_once __DIR__ . '/../autoload.php';
+
 const SIMPLETEST_SCRIPT_COLOR_PASS = 32; // Green.
 const SIMPLETEST_SCRIPT_COLOR_FAIL = 31; // Red.
 const SIMPLETEST_SCRIPT_COLOR_EXCEPTION = 33; // Brown.
diff --git a/core/tests/bootstrap.php b/core/tests/bootstrap.php
index 08d8871..d0d05de 100644
--- a/core/tests/bootstrap.php
+++ b/core/tests/bootstrap.php
@@ -1,10 +1,8 @@
 <?php
 
 // Register the namespaces we'll need to autoload from.
-$loader = require __DIR__ . "/../vendor/autoload.php";
-$loader->add('Drupal\\', __DIR__);
-$loader->add('Drupal\Core', __DIR__ . "/../../core/lib");
-$loader->add('Drupal\Component', __DIR__ . "/../../core/lib");
+$loader = require __DIR__ . "/../autoload.php";
+$loader->add('Drupal\\Tests', __DIR__);
 
 foreach (scandir(__DIR__ . "/../modules") as $module) {
   $loader->add('Drupal\\' . $module, __DIR__ . "/../modules/" . $module . "/lib");
@@ -17,7 +15,6 @@
   }
 }
 
-require __DIR__ . "/../../core/lib/Drupal.php";
 // Look into removing this later.
 define('REQUEST_TIME', (int) $_SERVER['REQUEST_TIME']);
 
diff --git a/core/update.php b/core/update.php
index 3052584..0238871 100644
--- a/core/update.php
+++ b/core/update.php
@@ -22,6 +22,8 @@
 // Change the directory to the Drupal root.
 chdir('..');
 
+require_once __DIR__ . '/autoload.php';
+
 // Exit early if an incompatible PHP version would cause fatal errors.
 // The minimum version is specified explicitly, as DRUPAL_MINIMUM_PHP is not
 // yet available. It is defined in bootstrap.inc, but it is not possible to
diff --git a/core/vendor/composer/autoload_real.php b/core/vendor/composer/autoload_real.php
index c2b428f..178481e 100644
--- a/core/vendor/composer/autoload_real.php
+++ b/core/vendor/composer/autoload_real.php
@@ -43,6 +43,7 @@ public static function getLoader()
         $loader->register(true);
 
         require $vendorDir . '/kriswallsmith/assetic/src/functions.php';
+        require $baseDir . '/core/lib/Drupal.php';
 
         return $loader;
     }
diff --git a/index.php b/index.php
index 4934bd2..f0f07d3 100644
--- a/index.php
+++ b/index.php
@@ -8,9 +8,10 @@
  * See COPYRIGHT.txt and LICENSE.txt files in the "core" directory.
  */
 
-require_once __DIR__ . '/core/includes/bootstrap.inc';
+require_once __DIR__ . '/core/autoload.php';
+
 try {
-  drupal_handle_request();
+  Drupal::handleRequest();
 }
 catch (Exception $e) {
   print 'If you have just changed code (for example deployed a new module or moved an existing one) read http://drupal.org/documentation/rebuild';
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index fe16cfc..11a1b66 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -411,14 +411,15 @@
 /**
  * Class Loader.
  *
- * By default, Drupal uses the Symfony UniversalClassLoader which is best for
- * development, as it does not break when code is moved on the file system.
- * The APC classloader provides better performance and is recommended for
- * production sites.
+ * By default, Drupal uses Composer's ClassLoader, which is best for
+ * development, as it does not break when code is moved on the file
+ * system. It is possible, however, to wrap the class loader with a
+ * cached class loader solution for better performance, which is
+ * recommended for production sites.
  *
  * Examples:
- *  $class_loader = 'apc'
- *  $class_loader = 'default'
+ *   $settings['class_loader'] = 'apc';
+ *   $settings['class_loader'] = 'default';
  */
 # $settings['class_loader'] = 'apc';
 
