diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 16faeef..33dd3f9 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -214,6 +214,10 @@ public function build(ContainerBuilder $container) {
       ->addArgument(new Reference('router'))
       ->addTag('event_subscriber');
     $container->register('content_negotiation', 'Drupal\Core\ContentNegotiation');
+    $container->register('html_view_subscriber', 'Drupal\Core\EventSubscriber\HtmlViewSubscriber')
+      // @todo for some reason, this injection fails during test runs.
+      // ->addArgument(new Reference('module_handler'))
+      ->addTag('event_subscriber');
     $container->register('view_subscriber', 'Drupal\Core\EventSubscriber\ViewSubscriber')
       ->addArgument(new Reference('content_negotiation'))
       ->addTag('event_subscriber');
diff --git a/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
new file mode 100644
index 0000000..f483d3a
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
@@ -0,0 +1,104 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\EventSubscriber\HtmlViewSubscriber.
+ */
+
+namespace Drupal\Core\EventSubscriber;
+
+use Drupal\Core\PartialResponse;
+use Drupal\Core\Asset\AssetBag;
+use Drupal\Core\Extension\ModuleHandlerInterface;
+use Symfony\Component\DependencyInjection\ContainerAwareInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\KernelEvents;
+use Symfony\Component\HttpKernel\HttpKernelInterface;
+use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Subscriber for for VIEW HTTP events that finishes a Drupal HTML response.
+ *
+ * This subscriber takes a partial response, the sort generated by a block or
+ * layout-driven route, and marshals it into a full Response object by dealing
+ * with assets and wrapping the in the skeletal HTML, primarily the <head> tag
+ * and its contents.
+ *
+ * @todo making this work for blocks, which are inherently partial responses, is a little weird.
+ */
+class HtmlViewSubscriber implements EventSubscriberInterface {
+
+  /**
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+// @todo for some reason, this injection fails during test runs.
+//  public function __construct(ModuleHandlerInterface $moduleHandler) {
+//    $this->moduleHandler = $moduleHandler;
+//  }
+
+  /**
+   * Processes a specialized Drupal Response into fully-formed HTML.
+   *
+   * This subscriber only acts if presented with a specialized Response object
+   * that contains a partial HTML page, plus the metadata necessary to construct
+   * the remainder of the page.
+   *
+   * @todo we're ignoring content negotiation and assuming HTML. could be JSON, at least...
+   *
+   * @param \Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent $event
+   *   The Event to process.
+   *
+   * @return \Symfony\Component\HttpFoundation\Response;
+   */
+  public function onPartialHtmlResponse(GetResponseForControllerResultEvent $event) {
+    // Only act if we have a specialized Drupal response to work with.
+    if (!($response = $event->getControllerResult()) instanceof PartialResponse) {
+      return;
+    }
+
+    // @todo this is really lazy, but the easiest way to get $page_{top,bottom}. this can be removed once the responsibility is shifted into displays/controllers
+    $page = element_info('page');
+
+    // Modules can add elements to $page as needed in hook_page_build().
+    foreach (module_implements('page_build') as $module) {
+    // foreach ($this->moduleHandler->getImplementations('page_build') as $module) {
+      $function = $module . '_page_build';
+      $function($page);
+    }
+
+    drupal_alter('page', $page);
+    // $this->moduleHandler->alter('page', $page);
+
+    // @todo three cheers for hacky passthroughs.
+    $vars = array(
+      'page' => array(
+        '#type' => 'markup',
+        '#markup' => $response->getContent(),
+        '#children' => $response->getContent(),
+        'page_top' => empty($page['page_top']) ? array(): $page['page_top'],
+        'page_bottom' => empty($page['page_bottom']) ? array(): $page['page_bottom'],
+      ),
+      'response' => $response,
+    );
+
+    $event->setResponse(new Response(theme('html', $vars)));
+    // Stop propagation, as the ViewSubscriber will handle this poorly.
+    $event->stopPropagation();
+  }
+
+  /**
+   * Registers the methods in this class that should be listeners.
+   *
+   * @return array
+   *   An array of event listener definitions.
+   */
+  static function getSubscribedEvents() {
+    $events[KernelEvents::VIEW][] = array('onPartialHtmlResponse', 40);
+
+    return $events;
+  }
+}
diff --git a/core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php
index ac48bc8..ccdb595 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ViewSubscriber.php
@@ -152,7 +152,7 @@ public function onHtml(GetResponseForControllerResultEvent $event) {
    *   An array of event listener definitions.
    */
   static function getSubscribedEvents() {
-    $events[KernelEvents::VIEW][] = array('onView');
+    $events[KernelEvents::VIEW][] = array('onView', 30);
 
     return $events;
   }
diff --git a/core/lib/Drupal/Core/PartialResponse.php b/core/lib/Drupal/Core/PartialResponse.php
new file mode 100644
index 0000000..d4ef068
--- /dev/null
+++ b/core/lib/Drupal/Core/PartialResponse.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\PartialResponse.
+ */
+
+namespace Drupal\Core;
+
+/**
+ * Response object that contains variables for injection into the html template.
+ *
+ * @todo move these methods into an interface.
+ * @todo add method replacements for *all* data sourced by html.tpl.php
+ */
+class PartialResponse {
+
+  /**
+   * HTML content string.
+   *
+   * @var string
+   */
+  protected $content;
+
+  public function __construct($content = '') {
+    $this->content = $content;
+  }
+
+  /**
+   * Sets the response content.
+   *
+   * This should be the bulk of the page content, and will ultimately be placed
+   * within the <body> tag in final HTML output.
+   *
+   * Valid types are strings, numbers, and objects that implement a __toString()
+   * method.
+   *
+   * @param mixed $content
+   *
+   * @return PartialResponse
+   */
+  public function setContent($content) {
+    $this->content = $content;
+    return $this;
+  }
+
+  /**
+   * Gets the main content of this Response.
+   *
+   * @return string
+   */
+  public function getContent() {
+    return $this->content;
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Common/PartialResponseTest.php b/core/modules/system/lib/Drupal/system/Tests/Common/PartialResponseTest.php
new file mode 100644
index 0000000..ded6f23
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Common/PartialResponseTest.php
@@ -0,0 +1,47 @@
+<?php
+/**
+ * @file
+ * Contains Drupal\system\Tests\Common\HtmlViewSubscriberTest.
+ */
+
+namespace Drupal\system\Tests\Common;
+
+// @todo once everything is encapsulated onto the PartialResponse, we ought to be able to make this a UnitTestCase
+use Drupal\simpletest\WebTestBase;
+use Drupal\Core\PartialResponse;
+use Drupal\Core\EventSubscriber\HtmlViewSubscriber;
+use Symfony\Component\HttpKernel\Event\GetResponseForControllerResultEvent;
+use Symfony\Component\HttpFoundation\Request;
+use Symfony\Component\HttpFoundation\Response;
+use Symfony\Component\HttpKernel\HttpKernel;
+
+class PartialResponseTest extends WebTestBase {
+
+  public static $modules = array('html_test');
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Partial Response to HTML',
+      'description' => 'Tests that PartialResponse data is properly rendered into the html template.',
+      'group' => 'Common', // @todo put me somewhere better
+    );
+  }
+
+  /**
+   * Tests that a PartialResponse object is rendered correctly.
+   */
+  public function testPartialResponseRendering() {
+    // First, test it with a direct request.
+    $this->drupalGet('html_test');
+    $this->assertRaw('hello world');
+
+    // Now, mock up a kernel and test it that way, too.
+    $kernel = drupal_container()->get('http_kernel');
+    $request = Request::create('/foo');
+    $response = new PartialResponse('hello world');
+    $subscriber = new HtmlViewSubscriber(drupal_container()->get('module_handler'));
+    $event = new GetResponseForControllerResultEvent($kernel, $request, HttpKernel::MASTER_REQUEST, $response);
+    $subscriber->onPartialHtmlResponse($event);
+    $this->assertTrue(preg_match('/hello world/', $event->getResponse()->getContent()), 'Expected raw output found within HTML response.');
+  }
+}
diff --git a/core/modules/system/tests/modules/html_test/html_test.info b/core/modules/system/tests/modules/html_test/html_test.info
new file mode 100644
index 0000000..6408ea4
--- /dev/null
+++ b/core/modules/system/tests/modules/html_test/html_test.info
@@ -0,0 +1,6 @@
+name = "HTML test"
+description = "Support module for testing finalized HTML rendering."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/system/tests/modules/html_test/html_test.module b/core/modules/system/tests/modules/html_test/html_test.module
new file mode 100644
index 0000000..52c8e36
--- /dev/null
+++ b/core/modules/system/tests/modules/html_test/html_test.module
@@ -0,0 +1,4 @@
+<?php
+/**
+ * Empty file; only the controller is needed.
+ */
\ No newline at end of file
diff --git a/core/modules/system/tests/modules/html_test/html_test.routing.yml b/core/modules/system/tests/modules/html_test/html_test.routing.yml
new file mode 100644
index 0000000..fa2d033
--- /dev/null
+++ b/core/modules/system/tests/modules/html_test/html_test.routing.yml
@@ -0,0 +1,6 @@
+html_test_1:
+  pattern: '/html_test'
+  defaults:
+    _controller: '\Drupal\html_test\TestController::testPartialResponse'
+  requirements:
+    _access: 'TRUE'
diff --git a/core/modules/system/tests/modules/html_test/lib/Drupal/html_test/TestController.php b/core/modules/system/tests/modules/html_test/lib/Drupal/html_test/TestController.php
new file mode 100644
index 0000000..c3da26d
--- /dev/null
+++ b/core/modules/system/tests/modules/html_test/lib/Drupal/html_test/TestController.php
@@ -0,0 +1,18 @@
+<?php
+/**
+ * @file
+ * Contains Drupal\html_test\TestControllers.
+ */
+
+namespace Drupal\html_test;
+
+use Drupal\Core\PartialResponse;
+
+/**
+ * Controller for testing partial HTML responses.
+ */
+class TestController {
+  public function testPartialResponse() {
+    return new PartialResponse('<p>hello world</p>');
+  }
+}
