diff --git a/config/schema/page_manager.schema.yml b/config/schema/page_manager.schema.yml
index 6b963d4..80ff988 100644
--- a/config/schema/page_manager.schema.yml
+++ b/config/schema/page_manager.schema.yml
@@ -77,3 +77,13 @@ display_variant.plugin.http_status_code:
     status_code:
       type: integer
       label: 'Status code'
+
+page_manager.page.*.third_party.page_manager:
+  type: sequence
+  label: 'Per-variant custom settings'
+  sequence:
+    type: mapping
+    mapping:
+      no_blocks:
+        type: boolean
+        label: 'Disable blocks'
diff --git a/page_manager.module b/page_manager.module
new file mode 100644
index 0000000..f683c9e
--- /dev/null
+++ b/page_manager.module
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * Contains hook implementations for Page Manager.
+ */
+
+use Drupal\Core\Form\FormStateInterface;
+
+/**
+ * Implements hook_form_BASE_FORM_ID_alter() for page_manager_display_variant_form.
+ */
+function page_manager_form_page_manager_display_variant_form_alter(array &$form, FormStateInterface $form_state, $form_id) {
+  /** @var \Drupal\page_manager\Form\DisplayVariantFormInterface $variant_form */
+  $variant_form = $form_state->getFormObject();
+
+  $settings = $variant_form->getPage()->getThirdPartySetting('page_manager', $variant_form->getDisplayVariant()->getPluginId());
+  $form['conf']['no_blocks'] = array(
+    '#type' => 'checkbox',
+    '#default_value' => isset($settings['no_blocks']) ? $settings['no_blocks'] : FALSE,
+    '#title' => t('Disable Drupal blocks/regions'),
+    '#description' => t('Check this to have the page disable all regions displayed in the theme. Note that some themes support this setting better than others. If in doubt, try with stock themes to see.'),
+  );
+  // Ensure this runs before the page is saved.
+  array_unshift($form['#submit'], 'page_manager_form_page_manager_display_variant_form_submit');
+}
+
+/**
+ * Saves the third party settings for a page display variant.
+ *
+ * @see page_manager_form_page_manager_display_variant_form_alter()
+ */
+function page_manager_form_page_manager_display_variant_form_submit(array &$form, FormStateInterface $form_state) {
+  /** @var \Drupal\page_manager\Form\DisplayVariantFormInterface $variant_form */
+  $variant_form = $form_state->getFormObject();
+
+  $page = $variant_form->getPage();
+  $display_variant_id = $variant_form->getDisplayVariant()->getPluginId();
+
+  $settings = $page->getThirdPartySetting('page_manager', $display_variant_id);
+  $settings['no_blocks'] = $form_state->getValue('no_blocks');
+  $page->setThirdPartySetting('page_manager', $display_variant_id, $settings);
+}
diff --git a/page_manager.services.yml b/page_manager.services.yml
index 62b4dad..3e245ab 100644
--- a/page_manager.services.yml
+++ b/page_manager.services.yml
@@ -16,3 +16,7 @@ services:
       - { name: 'event_subscriber' }
   page_manager.executable_factory:
     class: Drupal\page_manager\PageExecutableFactory
+  page_manager.page_display_variant_subscriber:
+    class: Drupal\page_manager\EventSubscriber\DisableBlocksDisplayVariantSubscriber
+    tags:
+      - { name: event_subscriber }
diff --git a/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php b/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php
new file mode 100644
index 0000000..8536cd1
--- /dev/null
+++ b/src/EventSubscriber/DisableBlocksDisplayVariantSubscriber.php
@@ -0,0 +1,51 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\page_manager\EventSubscriber\DisableBlocksDisplayVariantSubscriber.
+ */
+
+namespace Drupal\page_manager\EventSubscriber;
+
+use Drupal\Core\Render\PageDisplayVariantSelectionEvent;
+use Drupal\Core\Render\RenderEvents;
+use Symfony\Component\EventDispatcher\EventSubscriberInterface;
+
+/**
+ * Disables page-level blocks for variants that select that option.
+ */
+class DisableBlocksDisplayVariantSubscriber implements EventSubscriberInterface {
+
+  /**
+   * Selects the block page display variant.
+   *
+   * @param \Drupal\Core\Render\PageDisplayVariantSelectionEvent $event
+   *   The event to process.
+   */
+  public function onSelectPageDisplayVariant(PageDisplayVariantSelectionEvent $event) {
+    // If this is a page manager page, the route match will have the entity as
+    // a parameter.
+    /** @var \Drupal\page_manager\PageInterface $page */
+    if ($page = $event->getRouteMatch()->getParameter('page_manager_page')) {
+      // Find the selected variant for this page.
+      if ($variant = $page->getExecutable()->selectDisplayVariant()) {
+        // Check to see if this variant is configured to disable blocks.
+        $settings = $page->getThirdPartySetting('page_manager', $variant->getPluginId());
+        if (!empty($settings['no_blocks'])) {
+          // If so, set the page display variant to use the simple page, which
+          // replaces the block-based page display.
+          $event->setPluginId('simple_page');
+        }
+      }
+    }
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function getSubscribedEvents() {
+    $events[RenderEvents::SELECT_PAGE_DISPLAY_VARIANT][] = ['onSelectPageDisplayVariant', -10];
+    return $events;
+  }
+
+}
diff --git a/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php b/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php
new file mode 100644
index 0000000..4ef9a7b
--- /dev/null
+++ b/tests/src/Unit/DisableBlocksDisplayVariantSubscriberTest.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @file
+ * Contains
+ *   \Drupal\Tests\page_manager\Unit\DisableBlocksDisplayVariantSubscriberTest.
+ */
+
+namespace Drupal\Tests\page_manager\Unit;
+
+use Drupal\Core\Render\PageDisplayVariantSelectionEvent;
+use Drupal\Core\Routing\RouteMatch;
+use Drupal\page_manager\EventSubscriber\DisableBlocksDisplayVariantSubscriber;
+use Drupal\Tests\UnitTestCase;
+use Symfony\Component\Routing\Route;
+
+/**
+ * @coversDefaultClass \Drupal\page_manager\EventSubscriber\DisableBlocksDisplayVariantSubscriber
+ *
+ * @group PageManager
+ */
+class DisableBlocksDisplayVariantSubscriberTest extends UnitTestCase {
+
+  /**
+   * @covers ::onSelectPageDisplayVariant
+   */
+  public function testNoRouteSlug() {
+    $page = $this->getMock('\Drupal\page_manager\PageInterface');
+    $page->expects($this->never())
+      ->method('getExecutable');
+    $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/no/page_manager_page'), ['page_manager_page' => $page]);
+    $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match);
+    $subscriber = new DisableBlocksDisplayVariantSubscriber();
+    $subscriber->onSelectPageDisplayVariant($event);
+    $this->assertSame('not_overridden', $event->getPluginId());
+  }
+
+  /**
+   * @covers ::onSelectPageDisplayVariant
+   */
+  public function testNoSelectedVariant() {
+    $executable = $this->getMock('\Drupal\page_manager\PageExecutableInterface');
+    $page = $this->getMock('\Drupal\page_manager\PageInterface');
+    $page->expects($this->once())
+      ->method('getExecutable')
+      ->willReturn($executable);
+    $page->expects($this->never())
+      ->method('getThirdPartySetting');
+    $executable->expects($this->once())
+      ->method('selectDisplayVariant')
+      ->willReturn(NULL);
+    $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/a/{page_manager_page}'), ['page_manager_page' => $page]);
+    $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match);
+
+    (new DisableBlocksDisplayVariantSubscriber())->onSelectPageDisplayVariant($event);
+    $this->assertSame('not_overridden', $event->getPluginId());
+  }
+
+  /**
+   * @covers ::onSelectPageDisplayVariant
+   *
+   * @dataProvider providerNoBlocksSettings
+   */
+  public function testNoBlocksSettings($settings, $expected) {
+    $executable = $this->getMock('\Drupal\page_manager\PageExecutableInterface');
+    $page = $this->getMock('\Drupal\page_manager\PageInterface');
+    $page->expects($this->once())
+      ->method('getExecutable')
+      ->willReturn($executable);
+    $page->expects($this->once())
+      ->method('getThirdPartySetting')
+      ->with('page_manager', 'the_plugin_id')
+      ->willReturn($settings);
+
+    $variant = $this->getMock('\Drupal\Core\Display\VariantInterface');
+    $variant->expects($this->once())
+      ->method('getPluginId')
+      ->willReturn('the_plugin_id');
+    $executable->expects($this->once())
+      ->method('selectDisplayVariant')
+      ->willReturn($variant);
+
+    $route_match = new RouteMatch('the_route_name', new Route('/the/path/has/a/{page_manager_page}'), ['page_manager_page' => $page]);
+    $event = new PageDisplayVariantSelectionEvent('not_overridden', $route_match);
+
+    (new DisableBlocksDisplayVariantSubscriber())->onSelectPageDisplayVariant($event);
+    $this->assertSame($expected, $event->getPluginId());
+  }
+
+  public function providerNoBlocksSettings() {
+    $data = [];
+    $data[] = [
+      NULL,
+      'not_overridden',
+    ];
+    $data[] = [
+      [],
+      'not_overridden',
+    ];
+    $data[] = [
+      ['no_blocks' => NULL],
+      'not_overridden',
+    ];
+    $data[] = [
+      ['no_blocks' => FALSE],
+      'not_overridden',
+    ];
+    $data[] = [
+      ['no_blocks' => TRUE],
+      'simple_page',
+    ];
+    return $data;
+  }
+
+}
