diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 4681b8a..554d1b5 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -85,14 +85,7 @@ function block_page_build(&$page) {
 
   // Fetch a list of regions for the current theme.
   $all_regions = system_region_list($theme);
-  if (\Drupal::routeMatch()->getRouteName() != 'block.admin_demo') {
-    // Create a full page display variant, which will load blocks into their
-    // regions.
-    $page += \Drupal::service('plugin.manager.display_variant')
-      ->createInstance('full_page')
-      ->build();
-  }
-  else {
+  if (\Drupal::routeMatch()->getRouteName() == 'block.admin_demo') {
     // Append region description if we are rendering the regions demo page.
     $visible_regions = array_keys(system_region_list($theme, REGIONS_VISIBLE));
     foreach ($visible_regions as $region) {
diff --git a/core/modules/block/block.services.yml b/core/modules/block/block.services.yml
index e5e58d1..358edd3 100644
--- a/core/modules/block/block.services.yml
+++ b/core/modules/block/block.services.yml
@@ -21,3 +21,6 @@ services:
     arguments: ['@current_route_match']
     tags:
       - { name: 'event_subscriber' }
+  block.fragment_renderer:
+    class: Drupal\block\BlockHtmlFragmentRenderer
+    arguments: ['@language_manager', '@plugin.manager.display_variant', '@current_route_match']
diff --git a/core/modules/block/src/BlockHtmlFragmentRenderer.php b/core/modules/block/src/BlockHtmlFragmentRenderer.php
new file mode 100644
index 0000000..7599d0b
--- /dev/null
+++ b/core/modules/block/src/BlockHtmlFragmentRenderer.php
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block\BlockHtmlFragmentRenderer.
+ */
+
+namespace Drupal\block;
+
+use Drupal\Component\Plugin\PluginManagerInterface;
+use Drupal\Core\Language\LanguageManager;
+use Drupal\Core\Page\DefaultHtmlFragmentRenderer;
+use Drupal\Core\Page\HtmlPage;
+use Drupal\Core\Routing\RouteMatchInterface;
+
+/**
+ * Provides block-specific rendering.
+ */
+class BlockHtmlFragmentRenderer extends DefaultHtmlFragmentRenderer {
+
+  /**
+   * The variant manager.
+   *
+   * @var \Drupal\Component\Plugin\PluginManagerInterface
+   */
+  protected $variantManager;
+
+  /**
+   * The current route match.
+   *
+   * @var \Drupal\Core\Routing\RouteMatchInterface
+   */
+  protected $routeMatch;
+
+  /**
+   * @param \Drupal\Core\Language\LanguageManager $language_manager
+   *   The language manager.
+   * @param \Drupal\Component\Plugin\PluginManagerInterface $variant_manager
+   *   The variant manager.
+   * @param \Drupal\Core\Routing\RouteMatchInterface $route_match
+   *   The current route match.
+   */
+  public function __construct(LanguageManager $language_manager, PluginManagerInterface $variant_manager, RouteMatchInterface $route_match) {
+    parent::__construct($language_manager);
+    $this->variantManager = $variant_manager;
+    $this->routeMatch = $route_match;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preparePage(HtmlPage $page, &$page_array) {
+    if ($this->routeMatch->getRouteName() != 'block.admin_demo') {
+      $build = $this->variantManager->createInstance('full_page')->build();
+      // @todo Use NestedArray::mergeDeep().
+      $page_array = $build + $page_array;
+    }
+    return parent::preparePage($page, $page_array);
+  }
+
+}
diff --git a/core/modules/block/src/BlockServiceProvider.php b/core/modules/block/src/BlockServiceProvider.php
new file mode 100644
index 0000000..dc45ec3
--- /dev/null
+++ b/core/modules/block/src/BlockServiceProvider.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block\BlockServiceProvider.
+ */
+
+namespace Drupal\block;
+
+use Drupal\Core\DependencyInjection\ContainerBuilder;
+use Drupal\Core\DependencyInjection\ServiceModifierInterface;
+
+/**
+ * Swaps out the default HTML fragment renderer for a block-specific version.
+ */
+class BlockServiceProvider implements ServiceModifierInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function alter(ContainerBuilder $container) {
+    $container->setDefinition('html_fragment_renderer', $container->getDefinition('block.fragment_renderer'));
+  }
+
+}
