diff --git a/core/composer.json b/core/composer.json
index ddcd1ce..aa25fa2 100644
--- a/core/composer.json
+++ b/core/composer.json
@@ -52,6 +52,7 @@
         "drupal/big_pipe": "self.version",
         "drupal/block": "self.version",
         "drupal/block_content": "self.version",
+        "drupal/block_place": "self.version",
         "drupal/book": "self.version",
         "drupal/breakpoint": "self.version",
         "drupal/ckeditor": "self.version",
diff --git a/core/misc/icons/bebebe/place-block.svg b/core/misc/icons/bebebe/place-block.svg
new file mode 100644
index 0000000..26b8f73
--- /dev/null
+++ b/core/misc/icons/bebebe/place-block.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 3.8.2 (29753) - http://www.bohemiancoding.com/sketch -->
+    <title>Slice 1</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M8.68421053,6.31578947 L8.68421053,4.34718832 C8.68421053,3.68805839 8.15402141,3.15789474 7.5,3.15789474 C6.84141887,3.15789474 6.31578947,3.68859365 6.31578947,4.34324393 L6.31578947,4.83834566 L6.31578947,6.31578947 L4.34718832,6.31578947 C3.68805839,6.31578947 3.15789474,6.84597859 3.15789474,7.5 C3.15789474,8.15858113 3.69035961,8.68421053 4.34718832,8.68421053 L6.31578947,8.68421053 L6.31578947,10.6540129 C6.31578947,11.315685 6.84597859,11.8421053 7.5,11.8421053 C8.15858113,11.8421053 8.68421053,11.3096404 8.68421053,10.6528117 L8.68421053,8.68421053 L10.6528117,8.68421053 C11.3119416,8.68421053 11.8421053,8.15402141 11.8421053,7.5 C11.8421053,6.84141887 11.3096404,6.31578947 10.6528117,6.31578947 L8.68421053,6.31578947 Z M1.61516651,14.9867007 C0.733868391,14.9867007 0.0194351071,14.2730277 0.0194351071,13.3942515 L0.0194351071,10.2657586 C0.0194351071,9.1799139 1.61516652,9.20400779 1.61516652,10.2657586 C1.61516652,10.7369054 1.61516652,12.1763362 1.61516652,12.6571761 C1.61516652,13.3942515 1.61516652,13.3942515 2.35041478,13.3942515 C3.08566305,13.3942515 4.71999229,13.3942515 4.71999229,13.3942515 C5.78788773,13.3942515 5.84094267,14.9867007 4.71999229,14.9867007 L1.61516651,14.9867007 Z M5.31504665e-14,1.59814185 C5.31504665e-14,0.716843734 0.713673042,0.00241045032 1.59244924,0.00241045032 L4.72094215,0.00241045032 C5.80678683,0.00241045032 5.78269294,1.59814186 4.72094215,1.59814186 C4.24979529,1.59814186 2.8103645,1.59814186 2.32952461,1.59814186 C1.59244925,1.59814186 1.59244925,1.59814186 1.59244925,2.33339012 C1.59244925,3.06863839 1.59244925,4.70296763 1.59244925,4.70296763 C1.59244925,5.77086307 -1.40238698e-16,5.82391801 -1.40238698e-16,4.70296763 L5.31504665e-14,1.59814185 Z M13.4018581,5.32481769e-14 C14.2831563,5.31942129e-14 14.9975895,0.713673042 14.9975895,1.59244924 L14.9975895,4.72094215 C14.9975895,5.80678683 13.4018581,5.78269294 13.4018581,4.72094215 C13.4018581,4.24979529 13.4018581,2.8103645 13.4018581,2.32952461 C13.4018581,1.59244925 13.4018581,1.59244925 12.6666099,1.59244925 C11.9313616,1.59244925 10.2970324,1.59244925 10.2970324,1.59244925 C9.22913693,1.59244925 9.17608199,2.16225832e-16 10.2970324,1.47587417e-16 L13.4018581,5.32481769e-14 Z M15,13.3926268 C15,14.2739249 14.286327,14.9883582 13.4075508,14.9883582 L10.2790579,14.9883582 C9.19321317,14.9883582 9.21730706,13.3926268 10.2790579,13.3926268 C10.7502047,13.3926268 12.1896355,13.3926268 12.6704754,13.3926268 C13.4075508,13.3926268 13.4075508,13.3926268 13.4075508,12.6573785 C13.4075508,11.9221303 13.4075508,10.287801 13.4075508,10.287801 C13.4075508,9.21990557 15,9.16685064 15,10.287801 L15,13.3926268 Z" id="Combined-Shape" fill="#BEBEBE"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/core/misc/icons/ffffff/place-block.svg b/core/misc/icons/ffffff/place-block.svg
new file mode 100644
index 0000000..3ee9b28
--- /dev/null
+++ b/core/misc/icons/ffffff/place-block.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 3.8.2 (29753) - http://www.bohemiancoding.com/sketch -->
+    <title>Combined Shape</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M8.68421053,6.31578947 L8.68421053,4.34718832 C8.68421053,3.68805839 8.15402141,3.15789474 7.5,3.15789474 C6.84141887,3.15789474 6.31578947,3.68859365 6.31578947,4.34324393 L6.31578947,4.83834566 L6.31578947,6.31578947 L4.34718832,6.31578947 C3.68805839,6.31578947 3.15789474,6.84597859 3.15789474,7.5 C3.15789474,8.15858113 3.69035961,8.68421053 4.34718832,8.68421053 L6.31578947,8.68421053 L6.31578947,10.6540129 C6.31578947,11.315685 6.84597859,11.8421053 7.5,11.8421053 C8.15858113,11.8421053 8.68421053,11.3096404 8.68421053,10.6528117 L8.68421053,8.68421053 L10.6528117,8.68421053 C11.3119416,8.68421053 11.8421053,8.15402141 11.8421053,7.5 C11.8421053,6.84141887 11.3096404,6.31578947 10.6528117,6.31578947 L8.68421053,6.31578947 Z M1.61516651,14.9867007 C0.733868391,14.9867007 0.0194351071,14.2730277 0.0194351071,13.3942515 L0.0194351071,10.2657586 C0.0194351071,9.1799139 1.61516652,9.20400779 1.61516652,10.2657586 C1.61516652,10.7369054 1.61516652,12.1763362 1.61516652,12.6571761 C1.61516652,13.3942515 1.61516652,13.3942515 2.35041478,13.3942515 C3.08566305,13.3942515 4.71999229,13.3942515 4.71999229,13.3942515 C5.78788773,13.3942515 5.84094267,14.9867007 4.71999229,14.9867007 L1.61516651,14.9867007 Z M5.31504665e-14,1.59814185 C5.31504665e-14,0.716843734 0.713673042,0.00241045032 1.59244924,0.00241045032 L4.72094215,0.00241045032 C5.80678683,0.00241045032 5.78269294,1.59814186 4.72094215,1.59814186 C4.24979529,1.59814186 2.8103645,1.59814186 2.32952461,1.59814186 C1.59244925,1.59814186 1.59244925,1.59814186 1.59244925,2.33339012 C1.59244925,3.06863839 1.59244925,4.70296763 1.59244925,4.70296763 C1.59244925,5.77086307 -1.40238698e-16,5.82391801 -1.40238698e-16,4.70296763 L5.31504665e-14,1.59814185 Z M13.4018581,5.32481769e-14 C14.2831563,5.31942129e-14 14.9975895,0.713673042 14.9975895,1.59244924 L14.9975895,4.72094215 C14.9975895,5.80678683 13.4018581,5.78269294 13.4018581,4.72094215 C13.4018581,4.24979529 13.4018581,2.8103645 13.4018581,2.32952461 C13.4018581,1.59244925 13.4018581,1.59244925 12.6666099,1.59244925 C11.9313616,1.59244925 10.2970324,1.59244925 10.2970324,1.59244925 C9.22913693,1.59244925 9.17608199,2.16225832e-16 10.2970324,1.47587417e-16 L13.4018581,5.32481769e-14 Z M15,13.3926268 C15,14.2739249 14.286327,14.9883582 13.4075508,14.9883582 L10.2790579,14.9883582 C9.19321317,14.9883582 9.21730706,13.3926268 10.2790579,13.3926268 C10.7502047,13.3926268 12.1896355,13.3926268 12.6704754,13.3926268 C13.4075508,13.3926268 13.4075508,13.3926268 13.4075508,12.6573785 C13.4075508,11.9221303 13.4075508,10.287801 13.4075508,10.287801 C13.4075508,9.21990557 15,9.16685064 15,10.287801 L15,13.3926268 Z" id="Combined-Shape" fill="#FFFFFF"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/core/modules/block/src/Controller/BlockLibraryController.php b/core/modules/block/src/Controller/BlockLibraryController.php
index eb176d8..8268493 100644
--- a/core/modules/block/src/Controller/BlockLibraryController.php
+++ b/core/modules/block/src/Controller/BlockLibraryController.php
@@ -107,6 +107,7 @@ public function listBlocks(Request $request, $theme) {
     $definitions = $this->blockManager->getSortedDefinitions($definitions);
 
     $region = $request->query->get('region');
+    $destination = $request->query->get('destination');
     $rows = [];
     foreach ($definitions as $plugin_id => $plugin_definition) {
       $row = [];
@@ -132,6 +133,9 @@ public function listBlocks(Request $request, $theme) {
       if ($region) {
         $links['add']['query']['region'] = $region;
       }
+      if ($destination) {
+        $links['add']['query']['destination'] = $destination;
+      }
       $row['operations']['data'] = [
         '#type' => 'operations',
         '#links' => $links,
diff --git a/core/modules/block_place/block_place.info.yml b/core/modules/block_place/block_place.info.yml
new file mode 100644
index 0000000..8ae7226
--- /dev/null
+++ b/core/modules/block_place/block_place.info.yml
@@ -0,0 +1,8 @@
+name: Place Blocks
+type: module
+description: 'Allow administrators to place blocks from any Drupal page'
+package: Core (Experimental)
+version: VERSION
+core: 8.x
+dependencies:
+  - block
diff --git a/core/modules/block_place/block_place.libraries.yml b/core/modules/block_place/block_place.libraries.yml
new file mode 100644
index 0000000..38a32c7
--- /dev/null
+++ b/core/modules/block_place/block_place.libraries.yml
@@ -0,0 +1,5 @@
+drupal.block_place:
+  version: VERSION
+  css:
+    theme:
+      css/block-place.css: {}
diff --git a/core/modules/block_place/block_place.module b/core/modules/block_place/block_place.module
new file mode 100644
index 0000000..65474f8
--- /dev/null
+++ b/core/modules/block_place/block_place.module
@@ -0,0 +1,84 @@
+<?php
+
+/**
+ * @file
+ * Controls the placement of blocks from all pages.
+ */
+
+use Drupal\Core\Routing\RouteMatchInterface;
+use Drupal\Core\Url;
+
+/**
+ * Implements hook_help().
+ */
+function block_place_help($route_name, RouteMatchInterface $route_match) {
+  switch ($route_name) {
+    case 'help.page.block_place':
+      $output = '<h3>' . t('About') . '</h3>';
+      $output .= '<p>' . t('The Place Blocks module module allows you to place blocks from every page. For more information, see the <a href=":blocks-documentation">online documentation for the Place Blocks module</a>.', [':blocks-documentation' => 'https://www.drupal.org/documentation/modules/block_place/']) . '</p>';
+      $output .= '<h3>' . t('Uses') . '</h3>';
+      $output .= '<p>' . t('Block placement is specific to each theme on your site. This module allows you to place blocks in the context of your content pages') . '</p>';
+      return $output;
+  }
+}
+
+/**
+ * Implements hook_toolbar().
+ */
+function block_place_toolbar() {
+  // Link to the current page with a query parameter.
+  $query = \Drupal::request()->query->all();
+  $wrapper_class = '';
+  $status_class = '';
+  $description = '';
+  if (isset($query['block-place'])) {
+    $status_class = 'active';
+    $wrapper_class = 'is-active';
+    $description = t('Exit Place block mode.');
+    unset($query['block-place']);
+    unset($query['destination']);
+  }
+  else {
+    $status_class = 'inactive';
+    $description = t('Show regions to Place blocks.');
+    $query['block-place'] = '1';
+    // Setting destination is both a work-around for the toolbar "Back to site"
+    // link in escapeAdmin.js and used for the destination after picking a
+    // block.
+    $query['destination'] = Url::fromRoute('<current>')->toString();
+  }
+
+  // Remove on Admin routes.
+  $admin_route = \Drupal::service('router.admin_context')->isAdminRoute();
+  // Remove on Block Demo page.
+  $admin_demo = \Drupal::routeMatch()->getRouteName() === 'block.admin_demo';
+  $access = (\Drupal::currentUser()->hasPermission('administer blocks') && !$admin_route && !$admin_demo);
+
+  // The 'Place Block' tab is a simple link, with no corresponding tray.
+  $items['block_place'] = [
+    '#cache' => [
+      'contexts' => ['user.permissions', 'url.query_args'],
+    ],
+    '#type' => 'toolbar_item',
+    'tab' => [
+      '#access' => $access,
+      '#type' => 'link',
+      '#title' => t('Place block'),
+      '#url' => Url::fromRoute('<current>', [], ['query' => $query]),
+      '#attributes' => [
+        'title' => $description,
+        'class' => ['toolbar-icon', 'toolbar-icon-place-block-' . $status_class],
+      ],
+    ],
+    '#wrapper_attributes' => [
+      'class' => ['toolbar-tab', 'block-place-toolbar-tab', $wrapper_class],
+    ],
+    '#weight' => 100,
+    '#attached' => [
+      'library' => [
+        'block_place/drupal.block_place',
+      ],
+   ],
+  ];
+  return $items;
+}
diff --git a/core/modules/block_place/block_place.services.yml b/core/modules/block_place/block_place.services.yml
new file mode 100644
index 0000000..95d7375
--- /dev/null
+++ b/core/modules/block_place/block_place.services.yml
@@ -0,0 +1,6 @@
+services:
+  block_place.page_display_variant_subscriber.block:
+    class: Drupal\block_place\EventSubscriber\BlockPlaceEventSubscriber
+    arguments: ['@request_stack', '@current_user']
+    tags:
+      - { name: event_subscriber }
diff --git a/core/modules/block_place/css/block-place.css b/core/modules/block_place/css/block-place.css
new file mode 100644
index 0000000..7fc37a0
--- /dev/null
+++ b/core/modules/block_place/css/block-place.css
@@ -0,0 +1,62 @@
+/* relative position is required for z-index so it's always "in front" */
+.place-block-region {
+  position: relative;
+  height: 36px;
+}
+/* show the drop-zone for blocks */
+.place-block {
+  top: 6px;
+  width: 100%;
+  padding: 5px;
+  box-shadow: 0 0 0 1px rgba(255,255,255,0.75);
+  outline: 1px dashed rgba(0,0,0,0.5);
+  position: absolute;
+  z-index: 500;
+  text-align: center;
+  white-space: nowrap;
+  transition: all .5s;
+}
+/* !importants are needed to override theme styles for links */
+.place-block a,
+.place-block a.link  {
+  font: .75rem "Lucida Grande","Lucida Sans Unicode",sans-serif !important;
+  text-align: center !important;
+  color: #777 !important;
+  background-color: #fff !important;
+  box-shadow: 2px 1px 1px rgba(0, 0, 0, 0.15) !important;
+  border: 1px solid #ddd !important;
+  border-radius: 50px;
+  width: 75px;
+  display: inline-block;
+  padding: 3px 6px;
+  cursor: pointer;
+}
+/* semi-transparent grey background is visible against all backgrounds */
+.place-block:hover {
+  background-color: rgba(200,200,200,0.25);
+}
+.place-block a:focus,
+.place-block a.link:focus {
+  outline: none !important;
+}
+/* todo: figure out how to get the throbber to replace the text inside the button on click */
+
+/*
+ * Styling for toolbar icon.
+ */
+.toolbar .block-place-toolbar-tab.is-active {
+  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+}
+.toolbar .toolbar-bar .block-place-toolbar-tab {
+  float: right;
+}
+[dir="rtl"] .toolbar .toolbar-bar .block-place-toolbar-tab {
+  float: left;
+}
+.toolbar-bar .toolbar-icon-place-block-active:before {
+  background-image: url(../../../misc/icons/ffffff/place-block.svg);
+}
+.toolbar-bar .toolbar-icon-place-block-inactive:before {
+  background-image: url(../../../misc/icons/bebebe/place-block.svg);
+}
diff --git a/core/modules/block_place/src/EventSubscriber/BlockPlaceEventSubscriber.php b/core/modules/block_place/src/EventSubscriber/BlockPlaceEventSubscriber.php
new file mode 100644
index 0000000..da69a00
--- /dev/null
+++ b/core/modules/block_place/src/EventSubscriber/BlockPlaceEventSubscriber.php
@@ -0,0 +1,67 @@
+<?php
+
+namespace Drupal\block_place\EventSubscriber;
+
+use Drupal\Core\Render\PageDisplayVariantSelectionEvent;
+use Drupal\Core\Render\RenderEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+use Drupal\Core\Session\AccountInterface;
+
+/**
+ * @see \Drupal\block_place\Plugin\DisplayVariant\PlaceBlockPageVariant
+ */
+class BlockPlaceEventSubscriber implements EventSubscriberInterface {
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * The current user.
+   *
+   * @var \Drupal\Core\Session\AccountInterface
+   */
+  protected $account;
+
+  /**
+   * Constructs a \Drupal\block_place\EventSubscriber\BlockPlaceEventSubscriber object.
+   *
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The request stack used to retrieve the current request.
+   * @param \Drupal\Core\Session\AccountInterface $account
+   *   The current user.
+   */
+  public function __construct(RequestStack $request_stack, AccountInterface $account) {
+    $this->requestStack = $request_stack;
+    $this->account = $account;
+  }
+
+  /**
+   * Selects the block place override of the block page display variant.
+   *
+   * @param \Drupal\Core\Render\PageDisplayVariantSelectionEvent $event
+   *   The event to process.
+   */
+  public function onBlockPageDisplayVariantSelected(PageDisplayVariantSelectionEvent $event) {
+    if ($event->getPluginId() === 'block_page') {
+      if ($this->requestStack->getCurrentRequest()->query->has('block-place') && $this->account->hasPermission('administer blocks')) {
+        $event->setPluginId('block_place_page');
+      }
+      $event->addCacheContexts(['user.permissions', 'url.query_args']);
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    // Set a very low priority, so that it runs last.
+    $events[RenderEvents::SELECT_PAGE_DISPLAY_VARIANT][] = ['onBlockPageDisplayVariantSelected', -1000];
+    return $events;
+  }
+
+}
diff --git a/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php b/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php
new file mode 100644
index 0000000..99faec4
--- /dev/null
+++ b/core/modules/block_place/src/Plugin/DisplayVariant/PlaceBlockPageVariant.php
@@ -0,0 +1,140 @@
+<?php
+
+namespace Drupal\block_place\Plugin\DisplayVariant;
+
+use Drupal\block\BlockRepositoryInterface;
+use Drupal\block\Plugin\DisplayVariant\BlockPageVariant;
+use Drupal\Component\Serialization\Json;
+use Drupal\Core\Entity\EntityViewBuilderInterface;
+use Drupal\Core\Render\Element;
+use Drupal\Core\Theme\ThemeManagerInterface;
+use Drupal\Core\Link;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RequestStack;
+
+/**
+ * Allows blocks to be placed directly within a region.
+ *
+ * @PageDisplayVariant(
+ *   id = "block_place_page",
+ *   admin_label = @Translation("Page with blocks and place block buttons")
+ * )
+ */
+class PlaceBlockPageVariant extends BlockPageVariant {
+
+  /**
+   * The theme manager.
+   *
+   * @var \Drupal\Core\Theme\ThemeManagerInterface
+   */
+  protected $themeManager;
+
+  /**
+   * The request stack.
+   *
+   * @var \Symfony\Component\HttpFoundation\RequestStack
+   */
+  protected $requestStack;
+
+  /**
+   * Constructs a new PlaceBlockPageVariant.
+   *
+   * @param array $configuration
+   *   A configuration array containing information about the plugin instance.
+   * @param string $plugin_id
+   *   The plugin ID for the plugin instance.
+   * @param mixed $plugin_definition
+   *   The plugin implementation definition.
+   * @param \Drupal\block\BlockRepositoryInterface $block_repository
+   *   The block repository.
+   * @param \Drupal\Core\Entity\EntityViewBuilderInterface $block_view_builder
+   *   The block view builder.
+   * @param string[] $block_list_cache_tags
+   *   The Block entity type list cache tags.
+   * @param \Drupal\Core\Theme\ThemeManagerInterface $theme_manager
+   *   The theme manager.
+   * @param \Symfony\Component\HttpFoundation\RequestStack $request_stack
+   *   The current request stack.
+   */
+  public function __construct(array $configuration, $plugin_id, $plugin_definition, BlockRepositoryInterface $block_repository, EntityViewBuilderInterface $block_view_builder, array $block_list_cache_tags, ThemeManagerInterface $theme_manager, RequestStack $request_stack) {
+    parent::__construct($configuration, $plugin_id, $plugin_definition, $block_repository, $block_view_builder, $block_list_cache_tags);
+
+    $this->themeManager = $theme_manager;
+    $this->requestStack = $request_stack;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container, array $configuration, $plugin_id, $plugin_definition) {
+    return new static(
+      $configuration,
+      $plugin_id,
+      $plugin_definition,
+      $container->get('block.repository'),
+      $container->get('entity_type.manager')->getViewBuilder('block'),
+      $container->get('entity_type.manager')->getDefinition('block')->getListCacheTags(),
+      $container->get('theme.manager'),
+      $container->get('request_stack')
+    );
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function build() {
+    $build = parent::build();
+
+    $active_theme = $this->themeManager->getActiveTheme();
+    $theme_name = $active_theme->getName();
+    $visible_regions = $this->getVisibleRegionNames($theme_name);
+
+    // Build an array of the region names in the right order.
+    $build += array_fill_keys(array_keys($visible_regions), []);
+
+    foreach ($visible_regions as $region => $region_name) {
+      $destination = $this->requestStack->getCurrentRequest()->query->get('destination');
+      $query =  [
+        'region' => $region,
+      ];
+      if ($destination) {
+        $query['destination'] = $destination;
+      }
+      $title = $this->t('Place block<span class="visually-hidden"> in the %region region</span>', ['%region' => $region_name]);
+      $operations['block_description'] = [
+        '#type' => 'inline_template',
+        '#template' => '<div class="place-block-region"><div class="place-block">{{ link }}</div></div>',
+        '#context' => [
+          'link' => Link::createFromRoute($title, 'block.admin_library', ['theme' => $theme_name], [
+            'query' => $query,
+            'attributes' => [
+              'title' => $title,
+              'class' => ['use-ajax', 'link'],
+              'data-dialog-type' => 'modal',
+              'data-dialog-options' => Json::encode([
+                'width' => 700,
+              ]),
+            ],
+          ]),
+        ],
+      ];
+      $build[$region] = ['block_place_operations' => $operations] + $build[$region];
+    }
+    $build['#attached']['library'][] = 'block_place/drupal.block_place';
+    return $build;
+  }
+
+  /**
+   * Returns the human-readable list of regions keyed by machine name.
+   *
+   * @param string $theme
+   *   The name of the theme.
+   *
+   * @return array
+   *   An array of human-readable region names keyed by machine name.
+   */
+  protected function getVisibleRegionNames($theme) {
+    return system_region_list($theme, REGIONS_VISIBLE);
+  }
+
+}
diff --git a/core/modules/block_place/src/Tests/BlockPlaceTest.php b/core/modules/block_place/src/Tests/BlockPlaceTest.php
new file mode 100644
index 0000000..55acc02
--- /dev/null
+++ b/core/modules/block_place/src/Tests/BlockPlaceTest.php
@@ -0,0 +1,66 @@
+<?php
+
+namespace Drupal\block_place\Tests;
+
+use Drupal\Core\Url;
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Tests the placing a block.
+ *
+ * @group block_place
+ */
+class BlockPlaceTest extends WebTestBase {
+
+  /**
+   * Modules to install.
+   *
+   * @var array
+   */
+  public static $modules = ['block', 'block_place', 'toolbar'];
+
+  /**
+   * Tests placing blocks as an admin and anonymous user.
+   */
+  function testPlacingBlocks() {
+    // Create administrative user.
+    $this->drupalLogin($this->drupalCreateUser([
+      'access administration pages',
+      'access toolbar',
+      'administer blocks',
+      'view the administration theme',
+    ]));
+    $this->drupalGet(Url::fromRoute('<front>'));
+    $this->assertLink('Place block');
+    $this->clickLink('Place block');
+
+    // Each region should have one link to place a block.
+    $theme_name = $this->container->get('theme.manager')->getActiveTheme()->getName();
+    $visible_regions = system_region_list($theme_name, REGIONS_VISIBLE);
+    $this->assertTrue(count($visible_regions) > 0, 'At least one region is visible');
+    foreach ($visible_regions as $region => $name) {
+      $href = 'admin/structure/block/library/classy?region=' . $region;
+      $links = $this->xpath('//a[contains(@href, :href)]', [':href' => $href]);
+      $this->assertEqual(1, count($links), 'Found one matching link for region ' . $region);
+      list($path, $query_string) = explode('?', $links[0]['href'], 2);
+      parse_str($query_string, $query_parts);
+      $this->assertFalse(empty($query_parts['destination']), 'Destination query string is set in href');
+      /* Get the text inside the div->a->span->em */
+      $demo_block = $this->xpath('//div[@class="block-region demo-block"]/a[text()="Place block"]//em[text()="' . $name . '"]');
+      $this->assertEqual('1', count($demo_block), 'Found one matching DIV including the region name:  ' . $name);
+    }
+
+    // Create a user who cannot administer blocks.
+    $this->drupalLogin($this->drupalCreateUser([
+      'access administration pages',
+      'access toolbar',
+      'view the administration theme',
+    ]));
+    $this->drupalGet(Url::fromRoute('<front>'));
+    $this->assertNoLink('Place block');
+
+    $this->drupalGet('admin/structure/block/library/classy');
+    $this->assertResponse(403);
+  }
+
+}
diff --git a/core/themes/bartik/css/components/vertical-tabs.component.css b/core/themes/bartik/css/components/vertical-tabs.component.css
index ce4d6cd..b89b43a 100644
--- a/core/themes/bartik/css/components/vertical-tabs.component.css
+++ b/core/themes/bartik/css/components/vertical-tabs.component.css
@@ -14,3 +14,8 @@
   /* This is required to win specificity over [dir="rtl"] .region-content ul */
   padding: 0;
 }
+
+/* Fix vertical tabs rendered in a dialog from the main theme. */
+.ui-dialog .vertical-tabs__menu li {
+  left: 230px;
+}
diff --git a/core/themes/stable/css/block_place/block-place.css b/core/themes/stable/css/block_place/block-place.css
new file mode 100644
index 0000000..e9e1eae
--- /dev/null
+++ b/core/themes/stable/css/block_place/block-place.css
@@ -0,0 +1,62 @@
+/* relative position is required for z-index so it's always "in front" */
+.place-block-region {
+  position: relative;
+  height: 36px;
+}
+/* show the drop-zone for blocks */
+.place-block {
+  top: 6px;
+  width: 100%;
+  padding: 5px;
+  box-shadow: 0 0 0 1px rgba(255,255,255,0.75);
+  outline: 1px dashed rgba(0,0,0,0.5);
+  position: absolute;
+  z-index: 500;
+  text-align: center;
+  white-space: nowrap;
+  transition: all .5s;
+}
+/* !importants are needed to override theme styles for links */
+.place-block a,
+.place-block a.link  {
+  font: .75rem "Lucida Grande","Lucida Sans Unicode",sans-serif !important;
+  text-align: center !important;
+  color: #777 !important;
+  background-color: #fff !important;
+  box-shadow: 2px 1px 1px rgba(0, 0, 0, 0.15) !important;
+  border: 1px solid #ddd !important;
+  border-radius: 50px;
+  width: 75px;
+  display: inline-block;
+  padding: 3px 6px;
+  cursor: pointer;
+}
+/* semi-transparent grey background is visible against all backgrounds */
+.place-block:hover {
+  background-color: rgba(200,200,200,0.25);
+}
+.place-block a:focus,
+.place-block a.link:focus {
+  outline: none !important;
+}
+/* todo: figure out how to get the throbber to replace the text inside the button on click */
+
+/*
+ * Styling for toolbar icon.
+ */
+.toolbar .block-place-toolbar-tab.is-active {
+  background-image: -webkit-linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+  background-image: linear-gradient(rgba(255, 255, 255, 0.25) 20%, transparent 200%);
+}
+.toolbar .toolbar-bar .block-place-toolbar-tab {
+  float: right;
+}
+[dir="rtl"] .toolbar .toolbar-bar .block-place-toolbar-tab {
+  float: left;
+}
+.toolbar-bar .toolbar-icon-place-block-active:before {
+  background-image: url(../../images/core/icons/ffffff/place-block.svg);
+}
+.toolbar-bar .toolbar-icon-place-block-inactive:before {
+  background-image: url(../../images/core/icons/bebebe/place-block.svg);
+}
diff --git a/core/themes/stable/images/core/icons/bebebe/place-block.svg b/core/themes/stable/images/core/icons/bebebe/place-block.svg
new file mode 100644
index 0000000..26b8f73
--- /dev/null
+++ b/core/themes/stable/images/core/icons/bebebe/place-block.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 3.8.2 (29753) - http://www.bohemiancoding.com/sketch -->
+    <title>Slice 1</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M8.68421053,6.31578947 L8.68421053,4.34718832 C8.68421053,3.68805839 8.15402141,3.15789474 7.5,3.15789474 C6.84141887,3.15789474 6.31578947,3.68859365 6.31578947,4.34324393 L6.31578947,4.83834566 L6.31578947,6.31578947 L4.34718832,6.31578947 C3.68805839,6.31578947 3.15789474,6.84597859 3.15789474,7.5 C3.15789474,8.15858113 3.69035961,8.68421053 4.34718832,8.68421053 L6.31578947,8.68421053 L6.31578947,10.6540129 C6.31578947,11.315685 6.84597859,11.8421053 7.5,11.8421053 C8.15858113,11.8421053 8.68421053,11.3096404 8.68421053,10.6528117 L8.68421053,8.68421053 L10.6528117,8.68421053 C11.3119416,8.68421053 11.8421053,8.15402141 11.8421053,7.5 C11.8421053,6.84141887 11.3096404,6.31578947 10.6528117,6.31578947 L8.68421053,6.31578947 Z M1.61516651,14.9867007 C0.733868391,14.9867007 0.0194351071,14.2730277 0.0194351071,13.3942515 L0.0194351071,10.2657586 C0.0194351071,9.1799139 1.61516652,9.20400779 1.61516652,10.2657586 C1.61516652,10.7369054 1.61516652,12.1763362 1.61516652,12.6571761 C1.61516652,13.3942515 1.61516652,13.3942515 2.35041478,13.3942515 C3.08566305,13.3942515 4.71999229,13.3942515 4.71999229,13.3942515 C5.78788773,13.3942515 5.84094267,14.9867007 4.71999229,14.9867007 L1.61516651,14.9867007 Z M5.31504665e-14,1.59814185 C5.31504665e-14,0.716843734 0.713673042,0.00241045032 1.59244924,0.00241045032 L4.72094215,0.00241045032 C5.80678683,0.00241045032 5.78269294,1.59814186 4.72094215,1.59814186 C4.24979529,1.59814186 2.8103645,1.59814186 2.32952461,1.59814186 C1.59244925,1.59814186 1.59244925,1.59814186 1.59244925,2.33339012 C1.59244925,3.06863839 1.59244925,4.70296763 1.59244925,4.70296763 C1.59244925,5.77086307 -1.40238698e-16,5.82391801 -1.40238698e-16,4.70296763 L5.31504665e-14,1.59814185 Z M13.4018581,5.32481769e-14 C14.2831563,5.31942129e-14 14.9975895,0.713673042 14.9975895,1.59244924 L14.9975895,4.72094215 C14.9975895,5.80678683 13.4018581,5.78269294 13.4018581,4.72094215 C13.4018581,4.24979529 13.4018581,2.8103645 13.4018581,2.32952461 C13.4018581,1.59244925 13.4018581,1.59244925 12.6666099,1.59244925 C11.9313616,1.59244925 10.2970324,1.59244925 10.2970324,1.59244925 C9.22913693,1.59244925 9.17608199,2.16225832e-16 10.2970324,1.47587417e-16 L13.4018581,5.32481769e-14 Z M15,13.3926268 C15,14.2739249 14.286327,14.9883582 13.4075508,14.9883582 L10.2790579,14.9883582 C9.19321317,14.9883582 9.21730706,13.3926268 10.2790579,13.3926268 C10.7502047,13.3926268 12.1896355,13.3926268 12.6704754,13.3926268 C13.4075508,13.3926268 13.4075508,13.3926268 13.4075508,12.6573785 C13.4075508,11.9221303 13.4075508,10.287801 13.4075508,10.287801 C13.4075508,9.21990557 15,9.16685064 15,10.287801 L15,13.3926268 Z" id="Combined-Shape" fill="#BEBEBE"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/core/themes/stable/images/core/icons/ffffff/place-block.svg b/core/themes/stable/images/core/icons/ffffff/place-block.svg
new file mode 100644
index 0000000..3ee9b28
--- /dev/null
+++ b/core/themes/stable/images/core/icons/ffffff/place-block.svg
@@ -0,0 +1,10 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg width="15px" height="15px" viewBox="0 0 15 15" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 3.8.2 (29753) - http://www.bohemiancoding.com/sketch -->
+    <title>Combined Shape</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M8.68421053,6.31578947 L8.68421053,4.34718832 C8.68421053,3.68805839 8.15402141,3.15789474 7.5,3.15789474 C6.84141887,3.15789474 6.31578947,3.68859365 6.31578947,4.34324393 L6.31578947,4.83834566 L6.31578947,6.31578947 L4.34718832,6.31578947 C3.68805839,6.31578947 3.15789474,6.84597859 3.15789474,7.5 C3.15789474,8.15858113 3.69035961,8.68421053 4.34718832,8.68421053 L6.31578947,8.68421053 L6.31578947,10.6540129 C6.31578947,11.315685 6.84597859,11.8421053 7.5,11.8421053 C8.15858113,11.8421053 8.68421053,11.3096404 8.68421053,10.6528117 L8.68421053,8.68421053 L10.6528117,8.68421053 C11.3119416,8.68421053 11.8421053,8.15402141 11.8421053,7.5 C11.8421053,6.84141887 11.3096404,6.31578947 10.6528117,6.31578947 L8.68421053,6.31578947 Z M1.61516651,14.9867007 C0.733868391,14.9867007 0.0194351071,14.2730277 0.0194351071,13.3942515 L0.0194351071,10.2657586 C0.0194351071,9.1799139 1.61516652,9.20400779 1.61516652,10.2657586 C1.61516652,10.7369054 1.61516652,12.1763362 1.61516652,12.6571761 C1.61516652,13.3942515 1.61516652,13.3942515 2.35041478,13.3942515 C3.08566305,13.3942515 4.71999229,13.3942515 4.71999229,13.3942515 C5.78788773,13.3942515 5.84094267,14.9867007 4.71999229,14.9867007 L1.61516651,14.9867007 Z M5.31504665e-14,1.59814185 C5.31504665e-14,0.716843734 0.713673042,0.00241045032 1.59244924,0.00241045032 L4.72094215,0.00241045032 C5.80678683,0.00241045032 5.78269294,1.59814186 4.72094215,1.59814186 C4.24979529,1.59814186 2.8103645,1.59814186 2.32952461,1.59814186 C1.59244925,1.59814186 1.59244925,1.59814186 1.59244925,2.33339012 C1.59244925,3.06863839 1.59244925,4.70296763 1.59244925,4.70296763 C1.59244925,5.77086307 -1.40238698e-16,5.82391801 -1.40238698e-16,4.70296763 L5.31504665e-14,1.59814185 Z M13.4018581,5.32481769e-14 C14.2831563,5.31942129e-14 14.9975895,0.713673042 14.9975895,1.59244924 L14.9975895,4.72094215 C14.9975895,5.80678683 13.4018581,5.78269294 13.4018581,4.72094215 C13.4018581,4.24979529 13.4018581,2.8103645 13.4018581,2.32952461 C13.4018581,1.59244925 13.4018581,1.59244925 12.6666099,1.59244925 C11.9313616,1.59244925 10.2970324,1.59244925 10.2970324,1.59244925 C9.22913693,1.59244925 9.17608199,2.16225832e-16 10.2970324,1.47587417e-16 L13.4018581,5.32481769e-14 Z M15,13.3926268 C15,14.2739249 14.286327,14.9883582 13.4075508,14.9883582 L10.2790579,14.9883582 C9.19321317,14.9883582 9.21730706,13.3926268 10.2790579,13.3926268 C10.7502047,13.3926268 12.1896355,13.3926268 12.6704754,13.3926268 C13.4075508,13.3926268 13.4075508,13.3926268 13.4075508,12.6573785 C13.4075508,11.9221303 13.4075508,10.287801 13.4075508,10.287801 C13.4075508,9.21990557 15,9.16685064 15,10.287801 L15,13.3926268 Z" id="Combined-Shape" fill="#FFFFFF"></path>
+    </g>
+</svg>
\ No newline at end of file
diff --git a/core/themes/stable/stable.info.yml b/core/themes/stable/stable.info.yml
index 3476833..118cf78 100644
--- a/core/themes/stable/stable.info.yml
+++ b/core/themes/stable/stable.info.yml
@@ -12,6 +12,10 @@ libraries-override:
     css:
       theme:
         css/block.admin.css: css/block/block.admin.css
+  block_place/drupal.block_place:
+    css:
+      theme:
+        css/block-place.css: css/block_place/block-place.css
 
   ckeditor/drupal.ckeditor:
     css:
