diff --git a/composer.json b/composer.json
index 7e647d5..ac5d6fa 100644
--- a/composer.json
+++ b/composer.json
@@ -26,7 +26,8 @@
     "phpunit/phpunit": "4.1.*",
     "phpunit/phpunit-mock-objects": "dev-master#e60bb929c50ae4237aaf680a4f6773f4ee17f0a2",
     "zendframework/zend-feed": "2.2.*",
-    "mikey179/vfsStream": "1.*"
+    "mikey179/vfsStream": "1.*",
+    "stack/builder": "1.0.*"
   },
   "autoload": {
     "psr-4": {
diff --git a/composer.lock b/composer.lock
index 082fd93..981d888 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
         "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
         "This file is @generated automatically"
     ],
-    "hash": "6a7a4ba69644c6cf110d03b1a5346e3e",
+    "hash": "8afb97667c2791fec2fb1fc43853da24",
     "packages": [
         {
             "name": "doctrine/annotations",
@@ -1414,6 +1414,56 @@
             "time": "2014-03-07 15:35:33"
         },
         {
+            "name": "stack/builder",
+            "version": "v1.0.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/stackphp/builder.git",
+                "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/stackphp/builder/zipball/b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+                "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0",
+                "symfony/http-foundation": "~2.1",
+                "symfony/http-kernel": "~2.1"
+            },
+            "require-dev": {
+                "silex/silex": "~1.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.0-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Stack": "src"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch",
+                    "homepage": "http://wiedler.ch/igor/"
+                }
+            ],
+            "description": "Builder for stack middlewares based on HttpKernelInterface.",
+            "keywords": [
+                "stack"
+            ],
+            "time": "2014-01-28 19:42:24"
+        },
+        {
             "name": "symfony-cmf/routing",
             "version": "1.2.0",
             "target-dir": "Symfony/Cmf/Component/Routing",
diff --git a/core/core.services.yml b/core/core.services.yml
index 2f04124..7626ffb 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -344,6 +344,13 @@ services:
     arguments: ['@controller_resolver', '@string_translation']
   http_kernel:
     class: Symfony\Component\HttpKernel\HttpKernel
+    factory_method: resolve
+    factory_service: http_kernel_factory
+    arguments: ['@http_kernel.basic']
+  http_kernel_factory:
+    class: Stack\Builder
+  http_kernel.basic:
+    class: Symfony\Component\HttpKernel\HttpKernel
     arguments: ['@event_dispatcher', '@controller_resolver', '@request_stack']
   language_manager:
     class: Drupal\Core\Language\LanguageManager
diff --git a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
index 1a7ca6e..b3d5c2a 100644
--- a/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
+++ b/core/lib/Drupal/Core/Authentication/AuthenticationManager.php
@@ -182,7 +182,7 @@ public function handleException(GetResponseForExceptionEvent $event) {
     $active_providers = ($route && $route->getOption('_auth')) ? $route->getOption('_auth') : array($this->defaultProviderId());
 
     // Get the sorted list of active providers for the given route.
-    $providers = array_intersect($active_providers, array_keys($this->providers));
+    $providers = array_intersect($active_providers, array_keys($this->getSortedProviders()));
 
     foreach ($providers as $provider_id) {
       if ($this->providers[$provider_id]->handleException($event) == TRUE) {
diff --git a/core/lib/Drupal/Core/CoreServiceProvider.php b/core/lib/Drupal/Core/CoreServiceProvider.php
index 11b9e3e..2ac11dd 100644
--- a/core/lib/Drupal/Core/CoreServiceProvider.php
+++ b/core/lib/Drupal/Core/CoreServiceProvider.php
@@ -10,6 +10,7 @@
 use Drupal\Core\Cache\CacheContextsPass;
 use Drupal\Core\Cache\ListCacheBinsPass;
 use Drupal\Core\DependencyInjection\Compiler\BackendCompilerPass;
+use Drupal\Core\DependencyInjection\Compiler\StackedKernelPass;
 use Drupal\Core\DependencyInjection\ServiceProviderInterface;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\DependencyInjection\Compiler\ModifyServiceDefinitionsPass;
@@ -54,6 +55,8 @@ public function register(ContainerBuilder $container) {
 
     $container->addCompilerPass(new BackendCompilerPass());
 
+    $container->addCompilerPass(new StackedKernelPass());
+
     // Collect tagged handler services as method calls on consumer services.
     $container->addCompilerPass(new TaggedHandlersPass());
 
diff --git a/core/lib/Drupal/Core/DependencyInjection/Compiler/StackedKernelPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/StackedKernelPass.php
new file mode 100644
index 0000000..bf8efc0
--- /dev/null
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/StackedKernelPass.php
@@ -0,0 +1,45 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\DependencyInjection\Compiler\StackedKernelPass.
+ */
+
+namespace Drupal\Core\DependencyInjection\Compiler;
+
+use Symfony\Component\DependencyInjection\Compiler\CompilerPassInterface;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+
+/**
+ * Provides a compiler pass for stacked HTTP kernels.
+ *
+ * @see \Stack\Builder
+ */
+class StackedKernelPass implements CompilerPassInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function process(ContainerBuilder $container) {
+    if (!$container->hasDefinition('http_kernel_factory')) {
+      return;
+    }
+
+    $http_kernel_factory = $container->getDefinition('http_kernel_factory');
+    $middleware_priorities = array();
+    $middleware_arguments = array();
+    foreach ($container->findTaggedServiceIds('http_middleware') as $id => $attributes) {
+      $priority = isset($attributes[0]['priority']) ? $attributes[0]['priority'] : 0;
+      $middleware_priorities[$id] = $priority;
+      $definition = $container->getDefinition($id);
+      $middleware_arguments[$id] = $definition->getArguments();
+      array_unshift($middleware_arguments[$id], $definition->getClass());
+    }
+    array_multisort($middleware_priorities, SORT_DESC, $middleware_arguments, SORT_DESC);
+
+    foreach ($middleware_arguments as $id => $push_arguments) {
+      $http_kernel_factory->addMethodCall('push', $push_arguments);
+    }
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index d4170a4..0270cd3 100644
--- a/core/lib/Drupal/Core/Form/FormBuilder.php
+++ b/core/lib/Drupal/Core/Form/FormBuilder.php
@@ -121,7 +121,7 @@ class FormBuilder implements FormBuilderInterface, FormValidatorInterface, FormS
    * @param \Drupal\Core\HttpKernel $http_kernel
    *   The HTTP kernel.
    */
-  public function __construct(FormValidatorInterface $form_validator, FormSubmitterInterface $form_submitter, ModuleHandlerInterface $module_handler, KeyValueExpirableFactoryInterface $key_value_expirable_factory, EventDispatcherInterface $event_dispatcher, RequestStack $request_stack, ClassResolverInterface $class_resolver, CsrfTokenGenerator $csrf_token = NULL, HttpKernel $http_kernel = NULL) {
+  public function __construct(FormValidatorInterface $form_validator, FormSubmitterInterface $form_submitter, ModuleHandlerInterface $module_handler, KeyValueExpirableFactoryInterface $key_value_expirable_factory, EventDispatcherInterface $event_dispatcher, RequestStack $request_stack, ClassResolverInterface $class_resolver, CsrfTokenGenerator $csrf_token = NULL, HttpKernelInterface $http_kernel = NULL) {
     $this->formValidator = $form_validator;
     $this->formSubmitter = $form_submitter;
     $this->moduleHandler = $module_handler;
diff --git a/core/modules/system/src/Tests/HttpKernel/StackKernelIntegrationTest.php b/core/modules/system/src/Tests/HttpKernel/StackKernelIntegrationTest.php
new file mode 100644
index 0000000..ee37f7e
--- /dev/null
+++ b/core/modules/system/src/Tests/HttpKernel/StackKernelIntegrationTest.php
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\HttpKernel\StackKernelIntegrationTest.
+ */
+
+namespace Drupal\system\Tests\HttpKernel;
+
+use Drupal\simpletest\KernelTestBase;
+use Symfony\Component\HttpFoundation\Request;
+
+/**
+ * Tests the stacked kernel functionality.
+ *
+ * @group Routing.
+ */
+class StackKernelIntegrationTest extends KernelTestBase {
+
+  /**
+   * Modules to enable.
+   *
+   * @var array
+   */
+  public static $modules = array('httpkernel_test', 'system');
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setUp() {
+    parent::setUp();
+
+    $this->installSchema('system', 'router');
+  }
+
+  /**
+   * Tests a request.
+   */
+  public function testRequest() {
+    $request = new Request();
+    /** @var \Symfony\Component\HttpKernel\HttpKernelInterface $http_kernel */
+    $http_kernel = \Drupal::service('http_kernel');
+    $http_kernel->handle($request);
+
+    $this->assertEqual($request->attributes->get('_hello'), 'world');
+    $this->assertEqual($request->attributes->get('_previous_optional_argument'), 'test_argument');
+  }
+
+}
+
diff --git a/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.info.yml b/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.info.yml
new file mode 100644
index 0000000..5f1375f
--- /dev/null
+++ b/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.info.yml
@@ -0,0 +1,6 @@
+name: 'HttpKernel test'
+type: module
+description: 'Support module for httpkernel tests.'
+package: Testing
+version: VERSION
+core: 8.x
diff --git a/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.services.yml b/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.services.yml
new file mode 100644
index 0000000..c4784de
--- /dev/null
+++ b/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.services.yml
@@ -0,0 +1,10 @@
+services:
+  httpkernel_test.test_middleware:
+    class: Drupal\httpkernel_test\HttpKernel\TestMiddleware
+    tags:
+      - { name: http_middleware }
+  httpkernel_test.test_middleware2:
+    class: Drupal\httpkernel_test\HttpKernel\TestMiddleware
+    arguments: ['test_argument']
+    tags:
+      - { name: http_middleware, priority: 20 }
diff --git a/core/modules/system/tests/modules/httpkernel_test/src/HttpKernel/TestMiddleware.php b/core/modules/system/tests/modules/httpkernel_test/src/HttpKernel/TestMiddleware.php
new file mode 100644
index 0000000..93e1a89
--- /dev/null
+++ b/core/modules/system/tests/modules/httpkernel_test/src/HttpKernel/TestMiddleware.php
@@ -0,0 +1,60 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\httpkernel_test\HttpKernel\TestMiddleware.
+ */
+
+namespace Drupal\httpkernel_test\HttpKernel;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Provides a test middleware.
+ */
+class TestMiddleware implements HttpKernelInterface {
+
+ /**
+  * The decorated kernel.
+  *
+  * @var \Symfony\Component\HttpKernel\HttpKernelInterface
+  */
+ protected $kernel;
+
+  /**
+   * An optional argument.
+   *
+   * @var mixed
+   */
+  protected $optionalArgument;
+
+  /**
+   * Constructs a new TestMiddleware object.
+   *
+   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $kernel
+   *   The decorated kernel.
+   * @param mixed $optional_argument
+   *   (optional) An optional argument.
+   */
+  public function __construct(HttpKernelInterface $kernel, $optional_argument = NULL) {
+    $this->kernel = $kernel;
+    $this->optionalArgument = $optional_argument;
+ }
+
+ /**
+  * {@inheritdoc}
+  */
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
+   $request->attributes->set('_hello', 'world');
+   if ($request->attributes->has('_optional_argument')) {
+     $request->attributes->set('_previous_optional_argument', $request->attributes->get('_optional_argument'));
+   }
+   elseif (isset($this->optionalArgument)) {
+     $request->attributes->set('_optional_argument', $this->optionalArgument);
+   }
+
+   return $this->kernel->handle($request, $type, $catch);
+ }
+
+}
diff --git a/core/vendor/composer/autoload_namespaces.php b/core/vendor/composer/autoload_namespaces.php
index f49ab2c..5bb8438 100644
--- a/core/vendor/composer/autoload_namespaces.php
+++ b/core/vendor/composer/autoload_namespaces.php
@@ -26,6 +26,7 @@
     'Symfony\\Component\\CssSelector\\' => array($vendorDir . '/symfony/css-selector'),
     'Symfony\\Component\\ClassLoader\\' => array($vendorDir . '/symfony/class-loader'),
     'Symfony\\Cmf\\Component\\Routing' => array($vendorDir . '/symfony-cmf/routing'),
+    'Stack' => array($vendorDir . '/stack/builder/src'),
     'Psr\\Log\\' => array($vendorDir . '/psr/log'),
     'Gliph' => array($vendorDir . '/sdboyer/gliph/src'),
     'EasyRdf_' => array($vendorDir . '/easyrdf/easyrdf/lib'),
diff --git a/core/vendor/composer/installed.json b/core/vendor/composer/installed.json
index 97c0fa4..5b56c2a 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -2512,5 +2512,57 @@
             "database",
             "routing"
         ]
+    },
+    {
+        "name": "stack/builder",
+        "version": "v1.0.2",
+        "version_normalized": "1.0.2.0",
+        "source": {
+            "type": "git",
+            "url": "https://github.com/stackphp/builder.git",
+            "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7"
+        },
+        "dist": {
+            "type": "zip",
+            "url": "https://api.github.com/repos/stackphp/builder/zipball/b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+            "reference": "b4af43e7b7f3f7fac919ff475b29f7c5dc7b23b7",
+            "shasum": ""
+        },
+        "require": {
+            "php": ">=5.3.0",
+            "symfony/http-foundation": "~2.1",
+            "symfony/http-kernel": "~2.1"
+        },
+        "require-dev": {
+            "silex/silex": "~1.0"
+        },
+        "time": "2014-01-28 19:42:24",
+        "type": "library",
+        "extra": {
+            "branch-alias": {
+                "dev-master": "1.0-dev"
+            }
+        },
+        "installation-source": "dist",
+        "autoload": {
+            "psr-0": {
+                "Stack": "src"
+            }
+        },
+        "notification-url": "https://packagist.org/downloads/",
+        "license": [
+            "MIT"
+        ],
+        "authors": [
+            {
+                "name": "Igor Wiedler",
+                "email": "igor@wiedler.ch",
+                "homepage": "http://wiedler.ch/igor/"
+            }
+        ],
+        "description": "Builder for stack middlewares based on HttpKernelInterface.",
+        "keywords": [
+            "stack"
+        ]
     }
 ]
diff --git a/core/vendor/stack/builder/.travis.yml b/core/vendor/stack/builder/.travis.yml
new file mode 100644
index 0000000..1d50df4
--- /dev/null
+++ b/core/vendor/stack/builder/.travis.yml
@@ -0,0 +1,19 @@
+language: php
+
+php:
+  - 5.3.3
+  - 5.3
+  - 5.4
+  - 5.5
+  - hhvm
+
+before_script:
+  - composer self-update
+  - composer install --no-interaction --prefer-source
+
+script: phpunit --coverage-text
+
+matrix:
+  allow_failures:
+    - php: hhvm
+  fast_finish: true
diff --git a/core/vendor/stack/builder/CHANGELOG.md b/core/vendor/stack/builder/CHANGELOG.md
new file mode 100644
index 0000000..f6f35d6
--- /dev/null
+++ b/core/vendor/stack/builder/CHANGELOG.md
@@ -0,0 +1,14 @@
+CHANGELOG
+=========
+
+* 1.0.2 (2014-xx-xx)
+
+  * Validate missing arguments (@bajbnet).
+
+* 1.0.1 (2013-10-25)
+
+  * Lower PHP requirement to 5.3.
+
+* 1.0.0 (2013-08-02)
+
+  * Initial release.
diff --git a/core/vendor/stack/builder/LICENSE b/core/vendor/stack/builder/LICENSE
new file mode 100644
index 0000000..ceac72c
--- /dev/null
+++ b/core/vendor/stack/builder/LICENSE
@@ -0,0 +1,19 @@
+Copyright (c) 2013 Igor Wiedler
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is furnished
+to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+THE SOFTWARE.
diff --git a/core/vendor/stack/builder/README.md b/core/vendor/stack/builder/README.md
new file mode 100644
index 0000000..812406c
--- /dev/null
+++ b/core/vendor/stack/builder/README.md
@@ -0,0 +1,62 @@
+# Stack/Builder
+
+Builder for stack middlewares based on HttpKernelInterface.
+
+Stack/Builder is a small library that helps you construct a nested
+HttpKernelInterface decorator tree. It models it as a stack of middlewares.
+
+## Example
+
+If you want to decorate a [silex](https://github.com/fabpot/Silex) app with
+session and cache middlewares, you'll have to do something like this:
+
+    use Symfony\Component\HttpKernel\HttpCache\Store;
+
+    $app = new Silex\Application();
+
+    $app->get('/', function () {
+        return 'Hello World!';
+    });
+
+    $app = new Stack\Session(
+        new Symfony\Component\HttpKernel\HttpCache\HttpCache(
+            $app,
+            new Store(__DIR__.'/cache')
+        )
+    );
+
+This can get quite annoying indeed. Stack/Builder simplifies that:
+
+    $stack = (new Stack\Builder())
+        ->push('Stack\Session')
+        ->push('Symfony\Component\HttpKernel\HttpCache\HttpCache', new Store(__DIR__.'/cache'));
+
+    $app = $stack->resolve($app);
+
+As you can see, by arranging the layers as a stack, they become a lot easier
+to work with.
+
+In the front controller, you need to serve the request:
+
+    use Symfony\Component\HttpFoundation\Request;
+
+    $request = Request::createFromGlobals();
+    $response = $app->handle($request)->send();
+    $app->terminate($request, $response);
+
+Stack/Builder also supports pushing a `callable` on to the stack, for situations
+where instantiating middlewares might be more complicated. The `callable` should
+accept a `HttpKernelInterface` as the first argument and should also return a
+`HttpKernelInterface`. The example above could be rewritten as:
+
+    $stack = (new Stack\Builder())
+        ->push('Stack\Session')
+        ->push(function ($app) {
+            $cache = new HttpCache($app, new Store(__DIR__.'/cache'));
+            return $cache;
+        });
+
+## Inspiration
+
+* [Rack::Builder](http://rack.rubyforge.org/doc/Rack/Builder.html)
+* [HttpKernel middlewares](https://igor.io/2013/02/02/http-kernel-middlewares.html)
diff --git a/core/vendor/stack/builder/composer.json b/core/vendor/stack/builder/composer.json
new file mode 100644
index 0000000..e9f164c
--- /dev/null
+++ b/core/vendor/stack/builder/composer.json
@@ -0,0 +1,26 @@
+{
+    "name": "stack/builder",
+    "description": "Builder for stack middlewares based on HttpKernelInterface.",
+    "keywords": ["stack"],
+    "license": "MIT",
+    "authors": [
+        {
+            "name": "Igor Wiedler",
+            "email": "igor@wiedler.ch"
+        }
+    ],
+    "require": {
+        "php": ">=5.3.0",
+        "symfony/http-foundation": "~2.1",
+        "symfony/http-kernel": "~2.1"
+    },
+    "require-dev": {
+        "silex/silex": "~1.0"
+    },
+    "autoload": {
+        "psr-0": { "Stack": "src" }
+    },
+    "extra": {
+        "branch-alias": { "dev-master": "1.0-dev" }
+    }
+}
diff --git a/core/vendor/stack/builder/composer.lock b/core/vendor/stack/builder/composer.lock
new file mode 100644
index 0000000..26c6a99
--- /dev/null
+++ b/core/vendor/stack/builder/composer.lock
@@ -0,0 +1,488 @@
+{
+    "_readme": [
+        "This file locks the dependencies of your project to a known state",
+        "Read more about it at http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file"
+    ],
+    "hash": "78698481679eca710495d5aca028baaa",
+    "packages": [
+        {
+            "name": "psr/log",
+            "version": "1.0.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/php-fig/log.git",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/php-fig/log/zipball/fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "reference": "fe0936ee26643249e916849d48e3a51d5f5e278b",
+                "shasum": ""
+            },
+            "type": "library",
+            "autoload": {
+                "psr-0": {
+                    "Psr\\Log\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "PHP-FIG",
+                    "homepage": "http://www.php-fig.org/"
+                }
+            ],
+            "description": "Common interface for logging libraries",
+            "keywords": [
+                "log",
+                "psr",
+                "psr-3"
+            ],
+            "time": "2012-12-21 11:40:51"
+        },
+        {
+            "name": "symfony/debug",
+            "version": "v2.4.1",
+            "target-dir": "Symfony/Component/Debug",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Debug.git",
+                "reference": "74110be5ec681a83fc5bd66dd5fd29fe85fe9c1f"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Debug/zipball/74110be5ec681a83fc5bd66dd5fd29fe85fe9c1f",
+                "reference": "74110be5ec681a83fc5bd66dd5fd29fe85fe9c1f",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/http-foundation": "~2.1",
+                "symfony/http-kernel": "~2.1"
+            },
+            "suggest": {
+                "symfony/http-foundation": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Debug\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Debug Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-01-01 09:02:49"
+        },
+        {
+            "name": "symfony/event-dispatcher",
+            "version": "v2.4.1",
+            "target-dir": "Symfony/Component/EventDispatcher",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/EventDispatcher.git",
+                "reference": "e3ba42f6a70554ed05749e61b829550f6ac33601"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/EventDispatcher/zipball/e3ba42f6a70554ed05749e61b829550f6ac33601",
+                "reference": "e3ba42f6a70554ed05749e61b829550f6ac33601",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "symfony/dependency-injection": "~2.0"
+            },
+            "suggest": {
+                "symfony/dependency-injection": "",
+                "symfony/http-kernel": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\EventDispatcher\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony EventDispatcher Component",
+            "homepage": "http://symfony.com",
+            "time": "2013-12-28 08:12:03"
+        },
+        {
+            "name": "symfony/http-foundation",
+            "version": "v2.4.1",
+            "target-dir": "Symfony/Component/HttpFoundation",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/HttpFoundation.git",
+                "reference": "6c6b8a7bcd7e2cc920cd6acace563fdbf121d844"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/HttpFoundation/zipball/6c6b8a7bcd7e2cc920cd6acace563fdbf121d844",
+                "reference": "6c6b8a7bcd7e2cc920cd6acace563fdbf121d844",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\HttpFoundation\\": ""
+                },
+                "classmap": [
+                    "Symfony/Component/HttpFoundation/Resources/stubs"
+                ]
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpFoundation Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-01-05 02:10:50"
+        },
+        {
+            "name": "symfony/http-kernel",
+            "version": "v2.4.1",
+            "target-dir": "Symfony/Component/HttpKernel",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/HttpKernel.git",
+                "reference": "0605eedeb52c4d3a3144128d8336395a57be60d4"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/HttpKernel/zipball/0605eedeb52c4d3a3144128d8336395a57be60d4",
+                "reference": "0605eedeb52c4d3a3144128d8336395a57be60d4",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "psr/log": "~1.0",
+                "symfony/debug": "~2.3",
+                "symfony/event-dispatcher": "~2.1",
+                "symfony/http-foundation": "~2.4"
+            },
+            "require-dev": {
+                "symfony/browser-kit": "~2.2",
+                "symfony/class-loader": "~2.1",
+                "symfony/config": "~2.0",
+                "symfony/console": "~2.2",
+                "symfony/dependency-injection": "~2.0",
+                "symfony/finder": "~2.0",
+                "symfony/process": "~2.0",
+                "symfony/routing": "~2.2",
+                "symfony/stopwatch": "~2.2",
+                "symfony/templating": "~2.2"
+            },
+            "suggest": {
+                "symfony/browser-kit": "",
+                "symfony/class-loader": "",
+                "symfony/config": "",
+                "symfony/console": "",
+                "symfony/dependency-injection": "",
+                "symfony/finder": ""
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\HttpKernel\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony HttpKernel Component",
+            "homepage": "http://symfony.com",
+            "time": "2014-01-05 02:12:11"
+        }
+    ],
+    "packages-dev": [
+        {
+            "name": "pimple/pimple",
+            "version": "v1.1.0",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/fabpot/Pimple.git",
+                "reference": "471c7d7c52ad6594e17b8ec33efdd1be592b5d83"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/fabpot/Pimple/zipball/471c7d7c52ad6594e17b8ec33efdd1be592b5d83",
+                "reference": "471c7d7c52ad6594e17b8ec33efdd1be592b5d83",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.0"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Pimple": "lib/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                }
+            ],
+            "description": "Pimple is a simple Dependency Injection Container for PHP 5.3",
+            "homepage": "http://pimple.sensiolabs.org",
+            "keywords": [
+                "container",
+                "dependency injection"
+            ],
+            "time": "2013-09-19 04:53:08"
+        },
+        {
+            "name": "silex/silex",
+            "version": "v1.1.2",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/silexphp/Silex.git",
+                "reference": "47cc7d6545450ef8a91f50c04e8c7b3b04fceae9"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/silexphp/Silex/zipball/47cc7d6545450ef8a91f50c04e8c7b3b04fceae9",
+                "reference": "47cc7d6545450ef8a91f50c04e8c7b3b04fceae9",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3",
+                "pimple/pimple": "~1.0",
+                "symfony/event-dispatcher": ">=2.3,<2.5-dev",
+                "symfony/http-foundation": ">=2.3,<2.5-dev",
+                "symfony/http-kernel": ">=2.3,<2.5-dev",
+                "symfony/routing": ">=2.3,<2.5-dev"
+            },
+            "require-dev": {
+                "doctrine/dbal": ">=2.2.0,<2.4.0-dev",
+                "monolog/monolog": "~1.4,>=1.4.1",
+                "phpunit/phpunit": "~3.7",
+                "swiftmailer/swiftmailer": "5.*",
+                "symfony/browser-kit": ">=2.3,<2.5-dev",
+                "symfony/config": ">=2.3,<2.5-dev",
+                "symfony/css-selector": ">=2.3,<2.5-dev",
+                "symfony/debug": ">=2.3,<2.5-dev",
+                "symfony/dom-crawler": ">=2.3,<2.5-dev",
+                "symfony/finder": ">=2.3,<2.5-dev",
+                "symfony/form": ">=2.3,<2.5-dev",
+                "symfony/locale": ">=2.3,<2.5-dev",
+                "symfony/monolog-bridge": ">=2.3,<2.5-dev",
+                "symfony/options-resolver": ">=2.3,<2.5-dev",
+                "symfony/process": ">=2.3,<2.5-dev",
+                "symfony/security": ">=2.3,<2.5-dev",
+                "symfony/serializer": ">=2.3,<2.5-dev",
+                "symfony/translation": ">=2.3,<2.5-dev",
+                "symfony/twig-bridge": ">=2.3,<2.5-dev",
+                "symfony/validator": ">=2.3,<2.5-dev",
+                "twig/twig": ">=1.8.0,<2.0-dev"
+            },
+            "suggest": {
+                "symfony/browser-kit": ">=2.3,<2.5-dev",
+                "symfony/css-selector": ">=2.3,<2.5-dev",
+                "symfony/dom-crawler": ">=2.3,<2.5-dev",
+                "symfony/form": ">=2.3,<2.5-dev"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "1.1.x-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Silex": "src/"
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Igor Wiedler",
+                    "email": "igor@wiedler.ch",
+                    "homepage": "http://wiedler.ch/igor/"
+                }
+            ],
+            "description": "The PHP micro-framework based on the Symfony2 Components",
+            "homepage": "http://silex.sensiolabs.org",
+            "keywords": [
+                "microframework"
+            ],
+            "time": "2013-10-30 08:53:26"
+        },
+        {
+            "name": "symfony/routing",
+            "version": "v2.4.1",
+            "target-dir": "Symfony/Component/Routing",
+            "source": {
+                "type": "git",
+                "url": "https://github.com/symfony/Routing.git",
+                "reference": "4abfb500aab8be458c9e3a227ea56b190584f78a"
+            },
+            "dist": {
+                "type": "zip",
+                "url": "https://api.github.com/repos/symfony/Routing/zipball/4abfb500aab8be458c9e3a227ea56b190584f78a",
+                "reference": "4abfb500aab8be458c9e3a227ea56b190584f78a",
+                "shasum": ""
+            },
+            "require": {
+                "php": ">=5.3.3"
+            },
+            "require-dev": {
+                "doctrine/annotations": "~1.0",
+                "psr/log": "~1.0",
+                "symfony/config": "~2.2",
+                "symfony/expression-language": "~2.4",
+                "symfony/yaml": "~2.0"
+            },
+            "suggest": {
+                "doctrine/annotations": "For using the annotation loader",
+                "symfony/config": "For using the all-in-one router or any loader",
+                "symfony/expression-language": "For using expression matching",
+                "symfony/yaml": "For using the YAML loader"
+            },
+            "type": "library",
+            "extra": {
+                "branch-alias": {
+                    "dev-master": "2.4-dev"
+                }
+            },
+            "autoload": {
+                "psr-0": {
+                    "Symfony\\Component\\Routing\\": ""
+                }
+            },
+            "notification-url": "https://packagist.org/downloads/",
+            "license": [
+                "MIT"
+            ],
+            "authors": [
+                {
+                    "name": "Fabien Potencier",
+                    "email": "fabien@symfony.com"
+                },
+                {
+                    "name": "Symfony Community",
+                    "homepage": "http://symfony.com/contributors"
+                }
+            ],
+            "description": "Symfony Routing Component",
+            "homepage": "http://symfony.com",
+            "keywords": [
+                "router",
+                "routing",
+                "uri",
+                "url"
+            ],
+            "time": "2014-01-05 02:10:50"
+        }
+    ],
+    "aliases": [
+
+    ],
+    "minimum-stability": "stable",
+    "stability-flags": [
+
+    ],
+    "platform": {
+        "php": ">=5.3.0"
+    },
+    "platform-dev": [
+
+    ]
+}
diff --git a/core/vendor/stack/builder/phpunit.xml.dist b/core/vendor/stack/builder/phpunit.xml.dist
new file mode 100644
index 0000000..a2437ec
--- /dev/null
+++ b/core/vendor/stack/builder/phpunit.xml.dist
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<phpunit backupGlobals="false"
+         colors="true"
+         bootstrap="vendor/autoload.php"
+>
+    <testsuites>
+        <testsuite name="unit">
+            <directory>./tests/unit/</directory>
+        </testsuite>
+    </testsuites>
+
+    <testsuites>
+        <testsuite name="integration">
+            <directory>./tests/integration/</directory>
+        </testsuite>
+    </testsuites>
+
+    <testsuites>
+        <testsuite name="functional">
+            <directory>./tests/functional/</directory>
+        </testsuite>
+    </testsuites>
+
+    <filter>
+        <whitelist>
+            <directory>./src/</directory>
+        </whitelist>
+    </filter>
+</phpunit>
diff --git a/core/vendor/stack/builder/src/Stack/Builder.php b/core/vendor/stack/builder/src/Stack/Builder.php
new file mode 100644
index 0000000..c7ee05a
--- /dev/null
+++ b/core/vendor/stack/builder/src/Stack/Builder.php
@@ -0,0 +1,63 @@
+<?php
+
+namespace Stack;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+class Builder
+{
+    private $specs;
+
+    public function __construct()
+    {
+        $this->specs = new \SplStack();
+    }
+
+    public function unshift(/*$kernelClass, $args...*/)
+    {
+        if (func_num_args() === 0) {
+            throw new \InvalidArgumentException("Missing argument(s) when calling unshift");
+        }
+
+        $spec = func_get_args();
+        $this->specs->unshift($spec);
+
+        return $this;
+    }
+
+    public function push(/*$kernelClass, $args...*/)
+    {
+        if (func_num_args() === 0) {
+            throw new \InvalidArgumentException("Missing argument(s) when calling push");
+        }
+
+        $spec = func_get_args();
+        $this->specs->push($spec);
+
+        return $this;
+    }
+
+    public function resolve(HttpKernelInterface $app)
+    {
+        $middlewares = array($app);
+
+        foreach ($this->specs as $spec) {
+            $args = $spec;
+            $firstArg = array_shift($args);
+
+            if (is_callable($firstArg)) {
+                $app = $firstArg($app);
+            } else {
+                $kernelClass = $firstArg;
+                array_unshift($args, $app);
+
+                $reflection = new \ReflectionClass($kernelClass);
+                $app = $reflection->newInstanceArgs($args);
+            }
+
+            array_unshift($middlewares, $app);
+        }
+
+        return new StackedHttpKernel($app, $middlewares);
+    }
+}
diff --git a/core/vendor/stack/builder/src/Stack/StackedHttpKernel.php b/core/vendor/stack/builder/src/Stack/StackedHttpKernel.php
new file mode 100644
index 0000000..2b96dd9
--- /dev/null
+++ b/core/vendor/stack/builder/src/Stack/StackedHttpKernel.php
@@ -0,0 +1,34 @@
+<?php
+
+namespace Stack;
+
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\TerminableInterface;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+
+class StackedHttpKernel implements HttpKernelInterface, TerminableInterface
+{
+    private $app;
+    private $middlewares = array();
+
+    public function __construct(HttpKernelInterface $app, array $middlewares)
+    {
+        $this->app = $app;
+        $this->middlewares = $middlewares;
+    }
+
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        return $this->app->handle($request, $type, $catch);
+    }
+
+    public function terminate(Request $request, Response $response)
+    {
+        foreach ($this->middlewares as $kernel) {
+            if ($kernel instanceof TerminableInterface) {
+                $kernel->terminate($request, $response);
+            }
+        }
+    }
+}
diff --git a/core/vendor/stack/builder/tests/functional/SilexApplicationTest.php b/core/vendor/stack/builder/tests/functional/SilexApplicationTest.php
new file mode 100644
index 0000000..5636336
--- /dev/null
+++ b/core/vendor/stack/builder/tests/functional/SilexApplicationTest.php
@@ -0,0 +1,60 @@
+<?php
+
+namespace functional;
+
+use Silex\Application;
+use Stack\Builder;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+class SilexApplicationTest extends \PHPUnit_Framework_TestCase
+{
+    public function testWithAppendMiddlewares()
+    {
+        $app = new Application();
+
+        $app->get('/foo', function () {
+            return 'bar';
+        });
+
+        $finished = false;
+
+        $app->finish(function () use (&$finished) {
+            $finished = true;
+        });
+
+        $stack = new Builder();
+        $stack
+            ->push('functional\Append', '.A')
+            ->push('functional\Append', '.B');
+
+        $app = $stack->resolve($app);
+
+        $request = Request::create('/foo');
+        $response = $app->handle($request);
+        $app->terminate($request, $response);
+
+        $this->assertSame('bar.B.A', $response->getContent());
+        $this->assertTrue($finished);
+    }
+}
+
+class Append implements HttpKernelInterface
+{
+    private $app;
+    private $appendix;
+
+    public function __construct(HttpKernelInterface $app, $appendix)
+    {
+        $this->app = $app;
+        $this->appendix = $appendix;
+    }
+
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        $response = clone $this->app->handle($request, $type, $catch);
+        $response->setContent($response->getContent().$this->appendix);
+
+        return $response;
+    }
+}
diff --git a/core/vendor/stack/builder/tests/unit/Stack/BuilderTest.php b/core/vendor/stack/builder/tests/unit/Stack/BuilderTest.php
new file mode 100644
index 0000000..4092d01
--- /dev/null
+++ b/core/vendor/stack/builder/tests/unit/Stack/BuilderTest.php
@@ -0,0 +1,215 @@
+<?php
+
+namespace Stack;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\TerminableInterface;
+
+/** @covers Stack\Builder */
+class BuilderTest extends \PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function withoutMiddlewaresItShouldReturnOriginalResponse()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertInstanceOf('Stack\StackedHttpKernel', $resolved);
+        $this->assertSame('ok', $response->getContent());
+    }
+
+    /** @test */
+    public function resolvedKernelShouldDelegateTerminateCalls()
+    {
+        $app = $this->getTerminableMock();
+
+        $stack = new Builder();
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = new Response('ok');
+
+        $resolved->handle($request);
+        $resolved->terminate($request, $response);
+    }
+
+    /** @test */
+    public function pushShouldReturnSelf()
+    {
+        $stack = new Builder();
+        $this->assertSame($stack, $stack->push('Stack\AppendA'));
+    }
+
+    /** @test */
+    public function pushShouldThrowOnInvalidInput()
+    {
+        $this->setExpectedException('InvalidArgumentException', 'Missing argument(s) when calling push');
+        $stack = new Builder();
+        $stack->push();
+    }
+
+    /** @test */
+    public function unshiftShouldReturnSelf()
+    {
+        $stack = new Builder();
+        $this->assertSame($stack, $stack->unshift('Stack\AppendA'));
+    }
+
+    /** @test */
+    public function unshiftShouldThrowOnInvalidInput()
+    {
+        $this->setExpectedException('InvalidArgumentException', 'Missing argument(s) when calling unshift');
+        $stack = new Builder();
+        $stack->unshift();
+    }
+
+    /** @test */
+    public function appendMiddlewareShouldAppendToBody()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $stack->push('Stack\AppendA');
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertSame('ok.A', $response->getContent());
+    }
+
+    /** @test */
+    public function unshiftMiddlewareShouldPutMiddlewareBeforePushed()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $stack->push('Stack\Append', '2.');
+        $stack->unshift('Stack\Append', '1.');
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertSame('ok2.1.', $response->getContent());
+    }
+
+    /** @test */
+    public function stackedMiddlewaresShouldWrapInReverseOrder()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $stack->push('Stack\AppendA');
+        $stack->push('Stack\AppendB');
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertSame('ok.B.A', $response->getContent());
+    }
+
+    /** @test */
+    public function resolveShouldPassPushArgumentsToMiddlewareConstructor()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $stack->push('Stack\Append', '.foo');
+        $stack->push('Stack\Append', '.bar');
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertSame('ok.bar.foo', $response->getContent());
+    }
+
+    /** @test */
+    public function resolveShouldCallSpecFactories()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+
+        $stack = new Builder();
+        $stack->push(function ($app) { return new Append($app, '.foo'); });
+        $stack->push(function ($app) { return new Append($app, '.bar'); });
+        $resolved = $stack->resolve($app);
+
+        $request = Request::create('/');
+        $response = $resolved->handle($request);
+
+        $this->assertSame('ok.bar.foo', $response->getContent());
+    }
+
+    private function getHttpKernelMock(Response $response)
+    {
+        $app = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
+        $app->expects($this->any())
+            ->method('handle')
+            ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
+            ->will($this->returnValue($response));
+
+        return $app;
+    }
+
+    private function getTerminableMock()
+    {
+        $app = $this->getMock('Stack\TerminableHttpKernel');
+        $app->expects($this->once())
+            ->method('terminate')
+            ->with(
+                $this->isInstanceOf('Symfony\Component\HttpFoundation\Request'),
+                $this->isInstanceOf('Symfony\Component\HttpFoundation\Response')
+            );
+
+        return $app;
+    }
+}
+
+abstract class TerminableHttpKernel implements HttpKernelInterface, TerminableInterface
+{
+}
+
+class Append implements HttpKernelInterface
+{
+    private $app;
+    private $appendix;
+
+    public function __construct(HttpKernelInterface $app, $appendix)
+    {
+        $this->app = $app;
+        $this->appendix = $appendix;
+    }
+
+    public function handle(Request $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
+    {
+        $response = clone $this->app->handle($request, $type, $catch);
+        $response->setContent($response->getContent().$this->appendix);
+
+        return $response;
+    }
+}
+
+class AppendA extends Append
+{
+    public function __construct(HttpKernelInterface $app)
+    {
+        parent::__construct($app, '.A');
+    }
+}
+
+class AppendB extends Append
+{
+    public function __construct(HttpKernelInterface $app)
+    {
+        parent::__construct($app, '.B');
+    }
+}
diff --git a/core/vendor/stack/builder/tests/unit/Stack/StackedHttpKernelTest.php b/core/vendor/stack/builder/tests/unit/Stack/StackedHttpKernelTest.php
new file mode 100644
index 0000000..e2ced54
--- /dev/null
+++ b/core/vendor/stack/builder/tests/unit/Stack/StackedHttpKernelTest.php
@@ -0,0 +1,80 @@
+<?php
+
+namespace Stack;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\TerminableInterface;
+
+class StackedHttpKernelTest extends \PHPUnit_Framework_TestCase
+{
+    /** @test */
+    public function handleShouldDelegateToApp()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+        $kernel = new StackedHttpKernel($app, array($app));
+
+        $request = Request::create('/');
+        $response = $kernel->handle($request);
+
+        $this->assertSame('ok', $response->getContent());
+    }
+
+    /** @test */
+    public function handleShouldStillDelegateToAppWithMiddlewares()
+    {
+        $app = $this->getHttpKernelMock(new Response('ok'));
+        $foo = $this->getHttpKernelMock(new Response('foo'));
+        $bar = $this->getHttpKernelMock(new Response('bar'));
+        $kernel = new StackedHttpKernel($app, array($app, $foo, $bar));
+
+        $request = Request::create('/');
+        $response = $kernel->handle($request);
+
+        $this->assertSame('ok', $response->getContent());
+    }
+
+    /** @test */
+    public function terminateShouldDelegateToMiddlewares()
+    {
+        $app = $this->getTerminableMock(new Response('ok'));
+        $foo = $this->getTerminableMock();
+        $bar = $this->getTerminableMock();
+        $kernel = new StackedHttpKernel($app, array($app, $foo, $bar));
+
+        $request = Request::create('/');
+        $response = $kernel->handle($request);
+        $kernel->terminate($request, $response);
+    }
+
+    private function getHttpKernelMock(Response $response)
+    {
+        $app = $this->getMock('Symfony\Component\HttpKernel\HttpKernelInterface');
+        $app->expects($this->any())
+            ->method('handle')
+            ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
+            ->will($this->returnValue($response));
+
+        return $app;
+    }
+
+    private function getTerminableMock(Response $response = null)
+    {
+        $app = $this->getMock('Stack\TerminableHttpKernel');
+        if ($response) {
+            $app->expects($this->any())
+                ->method('handle')
+                ->with($this->isInstanceOf('Symfony\Component\HttpFoundation\Request'))
+                ->will($this->returnValue($response));
+        }
+        $app->expects($this->once())
+            ->method('terminate')
+            ->with(
+                $this->isInstanceOf('Symfony\Component\HttpFoundation\Request'),
+                $this->isInstanceOf('Symfony\Component\HttpFoundation\Response')
+            );
+
+        return $app;
+    }
+}
