diff --git a/composer.json b/composer.json
index d6cdc7f..4969900 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 e1f9771..2942066 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": "2b2309c748ec92230880579aaedfa1e6",
+    "hash": "3078e9f3fe7fb2ecc1a95e5bf4071fca",
     "packages": [
         {
             "name": "doctrine/annotations",
@@ -1406,6 +1406,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.1.0",
             "target-dir": "Symfony/Cmf/Component/Routing",
@@ -2425,8 +2475,12 @@
             "time": "2013-06-12 19:46:58"
         }
     ],
-    "packages-dev": [],
-    "aliases": [],
+    "packages-dev": [
+
+    ],
+    "aliases": [
+
+    ],
     "minimum-stability": "stable",
     "stability-flags": {
         "symfony/yaml": 20,
@@ -2436,9 +2490,10 @@
         "symfony-cmf/routing": 15,
         "phpunit/phpunit-mock-objects": 20
     },
-    "prefer-stable": false,
     "platform": {
         "php": ">=5.4.2"
     },
-    "platform-dev": []
+    "platform-dev": [
+
+    ]
 }
diff --git a/core/core.services.yml b/core/core.services.yml
index fd9028c..be548f1 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -335,6 +335,15 @@ 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
+    tags:
+      - { name: service_collector, tag: http_middleware, call: push, interface: \Symfony\Component\HttpKernel\HttpKernelInterface }
+  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/DependencyInjection/Compiler/TaggedHandlersPass.php b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php
index 18927ca..8344f49 100644
--- a/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php
+++ b/core/lib/Drupal/Core/DependencyInjection/Compiler/TaggedHandlersPass.php
@@ -80,6 +80,7 @@ public function process(ContainerBuilder $container) {
       foreach ($passes as $pass) {
         $tag = isset($pass['tag']) ? $pass['tag'] : $consumer_id;
         $method_name = isset($pass['call']) ? $pass['call'] : 'addHandler';
+        $interface = isset($pass['interface']) ? $pass['interface'] : NULL;
 
         // Determine parameters.
         $consumer = $container->getDefinition($consumer_id);
@@ -92,6 +93,7 @@ public function process(ContainerBuilder $container) {
         foreach ($params as $pos => $param) {
           if ($param->getClass()) {
             $interface = $param->getClass();
+            $interface = $interface->getName();
           }
           if ($param->getName() == 'id') {
             $id_pos = $pos;
@@ -109,7 +111,6 @@ public function process(ContainerBuilder $container) {
             $method_name,
           )));
         }
-        $interface = $interface->getName();
 
         // Find all tagged handlers.
         $handlers = array();
diff --git a/core/lib/Drupal/Core/Form/FormBuilder.php b/core/lib/Drupal/Core/Form/FormBuilder.php
index c92f2d6..181bedf 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/lib/Drupal/Core/HttpKernel/TestMiddleware.php b/core/lib/Drupal/Core/HttpKernel/TestMiddleware.php
new file mode 100644
index 0000000..7513077
--- /dev/null
+++ b/core/lib/Drupal/Core/HttpKernel/TestMiddleware.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\HttpKernel\TestMiddleware.
+ */
+
+namespace Drupal\Core\HttpKernel;
+
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+
+/**
+ * Provides an example middleware.
+ */
+class TestMiddleware Implements HttpKernelInterface {
+
+  /**
+   * The wrapped HTTP kernel.
+   *
+   * @var \Symfony\Component\HttpKernel\HttpKernelInterface
+   */
+  protected $kernel;
+
+  /**
+   * Constructs a new TestMiddleware object.
+   *
+   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $kernel
+   *   The wrapped HTTP kernel.
+   */
+  public function __construct(HttpKernelInterface $kernel = NULL) {
+    $this->kernel = $kernel;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
+    $request->attributes->set('_hello', 'world');
+    return $this->kernel->handle($request, $type, $catch);
+  }
+
+}
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..e942da4
--- /dev/null
+++ b/core/modules/system/src/Tests/HttpKernel/StackKernelIntegrationTest.php
@@ -0,0 +1,40 @@
+<?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');
+
+  /**
+   * 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->get('_hello'), 'world');
+  }
+
+}
+
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..77aea07
--- /dev/null
+++ b/core/modules/system/tests/modules/httpkernel_test/httpkernel_test.services.yml
@@ -0,0 +1,5 @@
+services:
+  httpkernel_test.test_middleware:
+    class: Drupal\httpkernel_test\HttpKernel\TestMiddleware
+    tags:
+      - { name: http_middleware }
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..54a1ac0
--- /dev/null
+++ b/core/modules/system/tests/modules/httpkernel_test/src/HttpKernel/TestMiddleware.php
@@ -0,0 +1,43 @@
+<?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;
+
+  /**
+   * Constructs a new TestMiddleware object.
+   *
+   * @param \Symfony\Component\HttpKernel\HttpKernelInterface $kernel
+   *   The decorated kernel.
+   */
+  public function __construct(HttpKernelInterface $kernel) {
+   $this->kernel = $kernel;
+ }
+
+ /**
+  * {@inheritdoc}
+  */
+ public function handle(Request $request, $type = self::MASTER_REQUEST, $catch = TRUE) {
+   $request->attributes->set('_hello', 'world');
+   return $this->kernel->handle($request, $type, $catch);
+ }
+
+}
diff --git a/core/vendor/composer/ClassLoader.php b/core/vendor/composer/ClassLoader.php
index 4433649..88684c5 100644
--- a/core/vendor/composer/ClassLoader.php
+++ b/core/vendor/composer/ClassLoader.php
@@ -143,8 +143,6 @@ public function add($prefix, $paths, $prepend = false)
      * @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 \InvalidArgumentException
      */
     public function addPsr4($prefix, $paths, $prepend = false)
     {
@@ -206,8 +204,6 @@ public function set($prefix, $paths)
      *
      * @param string       $prefix The prefix/namespace, with trailing '\\'
      * @param array|string $paths  The PSR-4 base directories
-     *
-     * @throws \InvalidArgumentException
      */
     public function setPsr4($prefix, $paths)
     {
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 fbc00eb..167751f 100644
--- a/core/vendor/composer/installed.json
+++ b/core/vendor/composer/installed.json
@@ -2504,5 +2504,57 @@
         ],
         "description": "Symfony Serializer Component",
         "homepage": "http://symfony.com"
+    },
+    {
+        "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;
+    }
+}
