diff --git a/core/authorize.php b/core/authorize.php
index 1544aa9..a6f97f3 100644
--- a/core/authorize.php
+++ b/core/authorize.php
@@ -90,6 +90,12 @@ function authorize_access_allowed() {
 // Initialize the maintenance theme for this administrative script.
 drupal_maintenance_theme();
 
+$container = drupal_container();
+$container->register('css_asset_manager', 'Drupal\Core\Asset\CssAssetManager')
+  ->setFactoryClass('Drupal\Core\Asset\AssetManagerFactory')
+  ->setFactoryMethod('get')
+  ->addArgument('css');
+
 $output = '';
 $show_messages = TRUE;
 
diff --git a/core/includes/common.inc b/core/includes/common.inc
index f8a54e9..c1c8b8e 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -2718,42 +2718,17 @@ function drupal_add_css($data = NULL, $options = NULL) {
  * @see drupal_add_css()
  */
 function drupal_get_css($css = NULL, $skip_alter = FALSE) {
-  if (!isset($css)) {
-    $css = drupal_add_css();
-  }
+  $styles = drupal_container()->get('css_asset_manager');
+  $styles->set($css);
 
   // Allow modules and themes to alter the CSS items.
   if (!$skip_alter) {
-    drupal_alter('css', $css);
-  }
-
-  // Sort CSS items, so that they appear in the correct order.
-  uasort($css, 'drupal_sort_css_js');
-
-  // Remove the overridden CSS files. Later CSS files override former ones.
-  $previous_item = array();
-  foreach ($css as $key => $item) {
-    if ($item['type'] == 'file') {
-      // If defined, force a unique basename for this file.
-      $basename = isset($item['basename']) ? $item['basename'] : drupal_basename($item['data']);
-      if (isset($previous_item[$basename])) {
-        // Remove the previous item that shared the same base name.
-        unset($css[$previous_item[$basename]]);
-      }
-      $previous_item[$basename] = $key;
-    }
+    drupal_alter('css', $styles->assets);
   }
 
-  // Render the HTML needed to load the CSS.
-  $styles = array(
-    '#type' => 'styles',
-    '#items' => $css,
-  );
-  if (!empty($setting)) {
-    $styles['#attached']['js'][] = array('type' => 'setting', 'data' => $setting);
-  }
+  $styles->sort();
 
-  return drupal_render($styles);
+  return $styles->render();
 }
 
 /**
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index d5983b6..9acda21 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -322,6 +322,10 @@ function install_begin_request(&$install_state) {
     $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory')
       ->addArgument(new Reference('config.storage'))
       ->addArgument(new Reference('dispatcher'));
+    $container->register('css_asset_manager', 'Drupal\Core\Asset\CssAssetManager')
+      ->setFactoryClass('Drupal\Core\Asset\AssetManagerFactory')
+      ->setFactoryMethod('get')
+      ->addArgument('css');
     drupal_container($container);
   }
 
diff --git a/core/lib/Drupal/Core/Asset/AssetManager.php b/core/lib/Drupal/Core/Asset/AssetManager.php
new file mode 100644
index 0000000..f5f6cfd
--- /dev/null
+++ b/core/lib/Drupal/Core/Asset/AssetManager.php
@@ -0,0 +1,58 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Assets\AssetInterface.
+ */
+
+namespace Drupal\Core\Asset;
+
+/**
+ * Defines an interface for asset collections.
+ *
+ * @see assets()
+ */
+abstract class AssetManager {
+
+  /**
+   * Returns array of assets.
+   *
+   * @param $group
+   *   The group of assets to return.
+   *
+   * @return
+   *   Array of assets as returned by drupal_add_css() or drupal_add_js().
+   */
+  abstract function get($group = NULL);
+
+  /**
+   * Renders the assets into the appropriate HTML.
+   *
+   * @return
+   *   HTML string.
+   */
+  abstract function render();
+
+  /**
+   * Defines the current assets.
+   *
+   * @param array $data
+   *   Array of assets as returned by drupal_add_css() or drupal_add_js()..
+   */
+  function set($data = NULL) {
+
+  }
+  /**
+   * Process the assets, applying filters provided by plugins.
+   */
+  function process() {
+
+  }
+
+  /**
+   * Sorts the assets.
+   */
+  function sort() {
+
+  }
+}
diff --git a/core/lib/Drupal/Core/Asset/AssetManagerFactory.php b/core/lib/Drupal/Core/Asset/AssetManagerFactory.php
new file mode 100644
index 0000000..bc1d724
--- /dev/null
+++ b/core/lib/Drupal/Core/Asset/AssetManagerFactory.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\Core\Asset\AssetFactory.
+ */
+
+namespace Drupal\Core\Asset;
+
+/**
+ * Defines the asset factory.
+ */
+class AssetManagerFactory {
+
+  /**
+   * Instantiates an asset class for a given asset type.
+   *
+   * Classes implementing Drupal\Core\Assets\AssetInterface can register
+   * themselves for specific types.
+   *
+   * @param string $type
+   *   The type for which an asset object should be returned.
+   *
+   * @return Drupal\Core\Assets\AssetInterface
+   *   The asset object associated with the specified type.
+   */
+  public static function get($type) {
+    // Check whether there is a custom class defined for the requested type or
+    // use the default 'type' definition otherwise.
+    $asset_types = self::getTypes();
+    $class = $asset_types[$type];
+    return new $class($type);
+  }
+
+  /**
+   * Returns a list of asset types for this site.
+   *
+   * @return array
+   *   An associative array with types as keys, and asset class names as
+   *   value.
+   */
+  public static function getTypes() {
+    // @todo Just copying CacheFactory here, but really should use config.
+    // See _aggregator_get_variables().
+    // Perhaps store in system module config.
+    // Need to return other config, too, bundler and packager variables for each type.
+    global $conf;
+    $asset_types = isset($conf['asset_classes']) ? $conf['asset_classes'] : array();
+    // Ensure there is a default 'generic' definition.
+    $asset_types += array('css' => 'Drupal\Core\Asset\CssAssetManager');
+    // $asset_types += array('js' => 'Drupal\Core\Asset\JsAssetManager');
+    return $asset_types;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Asset/CssAssetManager.php b/core/lib/Drupal/Core/Asset/CssAssetManager.php
new file mode 100644
index 0000000..b4b93f2
--- /dev/null
+++ b/core/lib/Drupal/Core/Asset/CssAssetManager.php
@@ -0,0 +1,79 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\Asset\CssAssetManager.
+ */
+
+namespace Drupal\Core\Asset;
+
+/**
+ * Defines a default Asset implementation.
+ *
+ * This is Drupal's default CSS Asset implementation.
+ */
+class CssAssetManager extends AssetManager {
+
+  public $assets = array();
+
+  /**
+   * Implements Drupal\Core\Assets\AssetCollectionInterface::get().
+   */
+  function get($group = NULL) {
+    $assets = array();
+    if ($group === NULL) {
+      $assets = $this->assets;
+    }
+    foreach ($this->assets as $file) {
+      if (isset($file['group']) && $file['group'] == $group) {
+        $assets[] = $file;
+      }
+    }
+    return $assets;
+  }
+
+  /**
+   * Implements Drupal\Core\Assets\AssetCollectionInterface::set().
+   */
+  function set($css = NULL) {
+    if (!isset($css)) {
+      $css = drupal_add_css();
+    }
+      $this->assets = $css;
+  }
+
+  /**
+   * Implements Drupal\Core\Assets\AssetCollectionInterface::set().
+   */
+  function sort() {
+    // Sort CSS items, so that they appear in the correct order.
+    uasort($this->assets, 'drupal_sort_css_js');
+
+    // Remove the overridden CSS files. Later CSS files override former ones.
+    $previous_item = array();
+    foreach ($this->assets as $key => $item) {
+      if ($item['type'] == 'file') {
+        // If defined, force a unique basename for this file.
+        $basename = isset($item['basename']) ? $item['basename'] : drupal_basename($item['data']);
+        if (isset($previous_item[$basename])) {
+          // Remove the previous item that shared the same base name.
+          unset($this->assets[$previous_item[$basename]]);
+        }
+        $previous_item[$basename] = $key;
+      }
+    }
+  }
+
+  /**
+   * Implements Drupal\Core\Assets\AssetCollectionInterface::set().
+   */
+  function render() {
+    // Render the HTML needed to load the CSS.
+    $styles = array(
+      '#type' => 'styles',
+      '#items' => $this->assets,
+    );
+    return drupal_render($styles);
+  }
+
+}
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 48684e5..e4f35ce 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -54,6 +54,14 @@ public function build(ContainerBuilder $container) {
       ->setFactoryClass('Drupal\Core\Database\Database')
       ->setFactoryMethod('getConnection')
       ->addArgument('slave');
+    $container->register('css_asset_manager', 'Drupal\Core\Asset\CssAssetManager')
+      ->setFactoryClass('Drupal\Core\Asset\AssetManagerFactory')
+      ->setFactoryMethod('get')
+      ->addArgument('css');
+    /*$container->register('js_asset_manager', 'Drupal\Core\Assets\CssAssetCollection')
+      ->setFactoryClass('Drupal\Core\Assets\AssetCollectionFactory')
+      ->setFactoryMethod('get')
+      ->addArgument('js');*/
     $container->register('typed_data', 'Drupal\Core\TypedData\TypedDataManager');
     // Add the user's storage for temporary, non-cache data.
     $container->register('lock', 'Drupal\Core\Lock\DatabaseLockBackend');
diff --git a/core/update.php b/core/update.php
index 98296bb..07f4aab 100644
--- a/core/update.php
+++ b/core/update.php
@@ -461,6 +461,10 @@ function update_check_requirements($skip_warnings = FALSE) {
   ->addArgument(new Reference('router.dumper'))
   ->addArgument(new Reference('lock'))
   ->addArgument(new Reference('dispatcher'));
+$container->register('css_asset_manager', 'Drupal\Core\Asset\CssAssetManager')
+  ->setFactoryClass('Drupal\Core\Asset\AssetManagerFactory')
+  ->setFactoryMethod('get')
+  ->addArgument('css');
 
 // Turn error reporting back on. From now on, only fatal errors (which are
 // not passed through the error handler) will cause a message to be printed.
