diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index e959bf9..e961b05 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -301,11 +301,15 @@
 
 /**
  * Flag for drupal_set_title(); text is not sanitized, so run check_plain().
+ *
+ * @deprecated
  */
 const CHECK_PLAIN = 0;
 
 /**
  * Flag for drupal_set_title(); text has already been sanitized.
+ *
+ * @deprecated
  */
 const PASS_THROUGH = -1;
 
@@ -1899,6 +1903,8 @@ function drupal_get_messages($type = NULL, $clear_queue = TRUE) {
  *
  * The title is displayed on the page and in the title bar.
  *
+ * @deprecated
+ *
  * @return
  *   The current page's title.
  */
diff --git a/core/includes/common.inc b/core/includes/common.inc
index f4c7e00..c3ba51b 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -2521,6 +2521,7 @@ function drupal_add_html_head_link($attributes, $header = FALSE) {
  * @return
  *   An array of queued cascading stylesheets.
  *
+ * @deprecated
  * @see drupal_get_css()
  */
 function drupal_add_css($data = NULL, $options = NULL) {
@@ -2616,8 +2617,6 @@ function drupal_add_css($data = NULL, $options = NULL) {
  *
  * @return
  *   A string of XHTML CSS tags.
- *
- * @see drupal_add_css()
  */
 function drupal_get_css($css = NULL, $skip_alter = FALSE) {
   global $theme_info;
@@ -3663,6 +3662,7 @@ function drupal_region_class($region) {
  *   including Drupal defaults, anything previously added with calls to
  *   drupal_add_js(), and this function call's additions.
  *
+ * @deprecated
  * @see drupal_get_js()
  */
 function drupal_add_js($data = NULL, $options = NULL) {
@@ -3738,6 +3738,7 @@ function drupal_add_js($data = NULL, $options = NULL) {
  *
  * @see drupal_get_js()
  * @see drupal_add_js()
+ * @deprecated
  */
 function drupal_js_defaults($data = NULL) {
   return array(
diff --git a/core/lib/Drupal/Core/CoreBundle.php b/core/lib/Drupal/Core/CoreBundle.php
index 16faeef..8de383a 100644
--- a/core/lib/Drupal/Core/CoreBundle.php
+++ b/core/lib/Drupal/Core/CoreBundle.php
@@ -214,6 +214,8 @@ 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')
+      ->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..26cdc3e
--- /dev/null
+++ b/core/lib/Drupal/Core/EventSubscriber/HtmlViewSubscriber.php
@@ -0,0 +1,98 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\Core\EventSubscriber\HtmlViewSubscriber.
+ */
+
+namespace Drupal\Core\EventSubscriber;
+
+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;
+
+use Drupal\Core\PartialResponse;
+use Drupal\Core\Asset\AssetBag;
+
+/**
+ * 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, ContainerAwareInterface {
+
+  protected $negotiation;
+
+  /**
+   * The dependency injection container.
+   *
+   * @var \Symfony\Component\DependencyInjection\ContainerInterface
+   */
+  protected $container;
+
+  /**
+   * Sets the Container.
+   *
+   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
+   *   A ContainerInterface instance.
+   */
+  public function setContainer(ContainerInterface $container = NULL) {
+    $this->container = $container;
+  }
+
+  /**
+   * 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 three cheers for hacky passthroughs.
+    $vars = array(
+      'page' => array(
+        '#type' => 'markup',
+        '#markup' => $response->getContent(),
+      ),
+      'response' => $response,
+    );
+
+    // Stop propagation, as the ViewSubscriber will handle this poorly.
+    $event->stopPropagation();
+
+    return new Response(theme('html', $vars));
+  }
+
+  /**
+   * 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;
+  }
+}
