diff --git a/core/modules/block/block.install b/core/modules/block/block.install
new file mode 100644
index 0000000..8f98cbc
--- /dev/null
+++ b/core/modules/block/block.install
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * @file
+ * Update functions for the block module.
+ */
+
+/**
+ * Disables blocks that are placed into the "disabled" region.
+ */
+function block_update_8001() {
+  // Find all blocks in the disabled region.
+  /** @var \Drupal\block\BlockInterface[] $blocks */
+  $block_ids = \Drupal::entityManager()
+    ->getStorage('block')
+    ->getQuery()
+    ->condition('region', -1)
+    ->execute();
+
+  $config_factory = \Drupal::configFactory();
+
+  // Disable each block and assign them to the default region.
+  foreach ($block_ids as $block_id) {
+    $block_config = $config_factory->getEditable('block.block.' . $block_id);
+    $block_config
+      ->set('region', system_default_region($block_config->get('theme')))
+      ->set('status', FALSE)
+      ->save();
+  }
+}
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 9ce0ac2..ddd2191 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -142,17 +142,9 @@ function block_rebuild() {
       $blocks = entity_load_multiple_by_properties('block', ['theme' => $theme]);
       foreach ($blocks as $block_id => $block) {
         // Disable blocks in invalid regions.
-        $region = $block->getRegion();
-        if ($region !== BlockInterface::BLOCK_REGION_NONE) {
-          if (!empty($region) && !isset($regions[$region]) && $block->status()) {
-            drupal_set_message(t('The block %info was assigned to the invalid region %region and has been disabled.', ['%info' => $block_id, '%region' => $region]), 'warning');
-            $block->disable();
-          }
-          // Set region to none if not enabled.
-          if (!$block->status()) {
-            $block->setRegion(BlockInterface::BLOCK_REGION_NONE);
-            $block->save();
-          }
+        if (!isset($regions[$block->getRegion()]) && $block->status()) {
+          drupal_set_message(t('The block %info was assigned to the invalid region %region and has been disabled.', ['%info' => $block_id, '%region' => $block->getRegion()]), 'warning');
+          $block->disable()->save();
         }
       }
     }
diff --git a/core/modules/block/block.routing.yml b/core/modules/block/block.routing.yml
index 396bf0d..e12cd8b 100644
--- a/core/modules/block/block.routing.yml
+++ b/core/modules/block/block.routing.yml
@@ -25,6 +25,22 @@ entity.block.edit_form:
   requirements:
     _entity_access: 'block.update'
 
+entity.block.enable:
+  path: '/admin/structure/block/manage/{block}/enable'
+  defaults:
+    _controller: '\Drupal\block\Controller\BlockController::performOperation'
+    op: enable
+  requirements:
+    _entity_access: 'block.enable'
+
+entity.block.disable:
+  path: '/admin/structure/block/manage/{block}/disable'
+  defaults:
+    _controller: '\Drupal\block\Controller\BlockController::performOperation'
+    op: disable
+  requirements:
+    _entity_access: 'block.disable'
+
 block.admin_display:
   path: '/admin/structure/block'
   defaults:
diff --git a/core/modules/block/css/block.admin.css b/core/modules/block/css/block.admin.css
index 2b9eb45..8aafce8 100644
--- a/core/modules/block/css/block.admin.css
+++ b/core/modules/block/css/block.admin.css
@@ -39,3 +39,7 @@ a.block-demo-backlink:hover {
 .block-form .form-item-settings-admin-label label:after {
   content: ':';
 }
+.block-disabled:not(:hover) {
+  background: #fcfcfa;
+  opacity: 0.675;
+}
diff --git a/core/modules/block/src/BlockForm.php b/core/modules/block/src/BlockForm.php
index 8c13bbb..22548e3 100644
--- a/core/modules/block/src/BlockForm.php
+++ b/core/modules/block/src/BlockForm.php
@@ -177,7 +177,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#title' => $this->t('Region'),
       '#description' => $this->t('Select the region where this block should be displayed.'),
       '#default_value' => $region,
-      '#empty_value' => BlockInterface::BLOCK_REGION_NONE,
+      '#required' => TRUE,
       '#options' => system_region_list($theme, REGIONS_VISIBLE),
       '#prefix' => '<div id="edit-block-region-wrapper">',
       '#suffix' => '</div>',
diff --git a/core/modules/block/src/BlockInterface.php b/core/modules/block/src/BlockInterface.php
index 8955be1..02cede6 100644
--- a/core/modules/block/src/BlockInterface.php
+++ b/core/modules/block/src/BlockInterface.php
@@ -20,11 +20,6 @@
   const BLOCK_LABEL_VISIBLE = 'visible';
 
   /**
-   * Denotes that a block is not enabled in any region and should not be shown.
-   */
-  const BLOCK_REGION_NONE = -1;
-
-  /**
    * Returns the plugin instance.
    *
    * @return \Drupal\Core\Block\BlockPluginInterface
diff --git a/core/modules/block/src/BlockListBuilder.php b/core/modules/block/src/BlockListBuilder.php
index 43d7a1c..ba01528 100644
--- a/core/modules/block/src/BlockListBuilder.php
+++ b/core/modules/block/src/BlockListBuilder.php
@@ -162,6 +162,7 @@ protected function buildBlocksForm() {
         'weight' => $entity->getWeight(),
         'entity' => $entity,
         'category' => $definition['category'],
+        'status' => $entity->status(),
       );
     }
 
@@ -193,7 +194,7 @@ protected function buildBlocksForm() {
     // Loop over each region and build blocks.
     $regions = $this->systemRegionList($this->getThemeName(), REGIONS_VISIBLE);
     $block_regions_with_disabled = $regions + array(BlockInterface::BLOCK_REGION_NONE => $this->t('Disabled', array(), array('context' => 'Plural')));
-    foreach ($block_regions_with_disabled as $region => $title) {
+    foreach ($regions as $region => $title) {
       $form['#tabledrag'][] = array(
         'action' => 'match',
         'relationship' => 'sibling',
@@ -216,6 +217,7 @@ protected function buildBlocksForm() {
       );
       $form['region-' . $region]['title'] = array(
         '#prefix' => $region != BlockInterface::BLOCK_REGION_NONE ? $title : $block_regions_with_disabled[$region],
+        '#markup' => $title,
         '#type' => 'link',
         '#title' => $this->t('Place block <span class="visually-hidden">in the %region region</span>', ['%region' => $block_regions_with_disabled[$region]]),
         '#url' => Url::fromRoute('block.admin_library', ['theme' => $this->getThemeName()], ['query' => ['region' => $region]]),
@@ -256,12 +258,13 @@ protected function buildBlocksForm() {
               'class' => array('draggable'),
             ),
           );
+          $form[$entity_id]['#attributes']['class'][] = $info['status'] ? 'block-enabled' : 'block-disabled';
           if ($placement && $placement == Html::getClass($entity_id)) {
             $form[$entity_id]['#attributes']['class'][] = 'color-warning';
             $form[$entity_id]['#attributes']['class'][] = 'js-block-placed';
           }
           $form[$entity_id]['info'] = array(
-            '#markup' => SafeMarkup::checkPlain($info['label']),
+            '#markup' => $info['status'] ? SafeMarkup::checkPlain($info['label']) : SafeMarkup::format('@label (disabled)', ['@label' => $info['label']]),
             '#wrapper_attributes' => array(
               'class' => array('block'),
             ),
@@ -272,7 +275,7 @@ protected function buildBlocksForm() {
           $form[$entity_id]['region-theme']['region'] = array(
             '#type' => 'select',
             '#default_value' => $region,
-            '#empty_value' => BlockInterface::BLOCK_REGION_NONE,
+            '#required' => TRUE,
             '#title' => $this->t('Region for @block block', array('@block' => $info['label'])),
             '#title_display' => 'invisible',
             '#options' => $regions,
@@ -362,12 +365,6 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
       $entity_values = $form_state->getValue(array('blocks', $entity_id));
       $entity->setWeight($entity_values['weight']);
       $entity->setRegion($entity_values['region']);
-      if ($entity->getRegion() == BlockInterface::BLOCK_REGION_NONE) {
-        $entity->disable();
-      }
-      else {
-        $entity->enable();
-      }
       $entity->save();
     }
     drupal_set_message(t('The block settings have been updated.'));
diff --git a/core/modules/block/src/Controller/BlockController.php b/core/modules/block/src/Controller/BlockController.php
index 66ecbbd..2265e2f 100644
--- a/core/modules/block/src/Controller/BlockController.php
+++ b/core/modules/block/src/Controller/BlockController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\block\Controller;
 
+use Drupal\block\BlockInterface;
 use Drupal\Core\Controller\ControllerBase;
 use Drupal\Core\Extension\ThemeHandler;
 use Drupal\Core\Extension\ThemeHandlerInterface;
@@ -45,6 +46,23 @@ public static function create(ContainerInterface $container) {
   }
 
   /**
+   * Calls a method on a block and reloads the listing page.
+   *
+   * @param \Drupal\block\BlockInterface $block
+   *   The block being acted upon.
+   * @param string $op
+   *   The operation to perform, e.g., 'enable' or 'disable'.
+   *
+   * @return \Symfony\Component\HttpFoundation\RedirectResponse
+   *   A redirect back to the listing page.
+   */
+  public function performOperation(BlockInterface $block, $op) {
+    $block->$op()->save();
+    drupal_set_message($this->t('The block settings have been updated.'));
+    return $this->redirect('block.admin_display');
+  }
+
+  /**
    * Returns a block theme demo page.
    *
    * @param string $theme
diff --git a/core/modules/block/src/Entity/Block.php b/core/modules/block/src/Entity/Block.php
index d2b3031..c4992f2 100644
--- a/core/modules/block/src/Entity/Block.php
+++ b/core/modules/block/src/Entity/Block.php
@@ -33,11 +33,14 @@
  *   },
  *   admin_permission = "administer blocks",
  *   entity_keys = {
- *     "id" = "id"
+ *     "id" = "id",
+ *     "status" = "status"
  *   },
  *   links = {
  *     "delete-form" = "/admin/structure/block/manage/{block}/delete",
- *     "edit-form" = "/admin/structure/block/manage/{block}"
+ *     "edit-form" = "/admin/structure/block/manage/{block}",
+ *     "enable" = "/admin/structure/block/manage/{block}/enable",
+ *     "disable" = "/admin/structure/block/manage/{block}/disable",
  *   },
  *   config_export = {
  *     "id",
@@ -75,7 +78,7 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
    *
    * @var string
    */
-  protected $region = self::BLOCK_REGION_NONE;
+  protected $region;
 
   /**
    * The block weight.
@@ -214,13 +217,13 @@ public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b)
     if ($status !== 0) {
       return $status;
     }
-    // Sort by weight, unless disabled.
-    if ($a->getRegion() != static::BLOCK_REGION_NONE) {
-      $weight = $a->getWeight() - $b->getWeight();
-      if ($weight) {
-        return $weight;
-      }
+
+    // Sort by weight.
+    $weight = $a->getWeight() - $b->getWeight();
+    if ($weight) {
+      return $weight;
     }
+
     // Sort by label.
     return strcmp($a->label(), $b->label());
   }
diff --git a/core/modules/block/src/Tests/BlockStorageUnitTest.php b/core/modules/block/src/Tests/BlockStorageUnitTest.php
index f1d435a..1c57c34 100644
--- a/core/modules/block/src/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/src/Tests/BlockStorageUnitTest.php
@@ -90,7 +90,7 @@ protected function createTests() {
       'dependencies' => array('module' => array('block_test'), 'theme' => array('stark')),
       'id' => 'test_block',
       'theme' => 'stark',
-      'region' => '-1',
+      'region' => NULL,
       'weight' => NULL,
       'provider' => NULL,
       'plugin' => 'test_html',
@@ -120,7 +120,7 @@ protected function loadTests() {
     $this->assertTrue($entity instanceof Block, 'The loaded entity is a Block.');
 
     // Verify several properties of the block.
-    $this->assertEqual($entity->getRegion(), '-1');
+    $this->assertEqual($entity->getRegion(), NULL);
     $this->assertTrue($entity->status());
     $this->assertEqual($entity->getTheme(), 'stark');
     $this->assertTrue($entity->uuid());
diff --git a/core/modules/block/src/Tests/BlockTest.php b/core/modules/block/src/Tests/BlockTest.php
index 8c65bc3..8e4e5e4 100644
--- a/core/modules/block/src/Tests/BlockTest.php
+++ b/core/modules/block/src/Tests/BlockTest.php
@@ -155,10 +155,9 @@ function testBlock() {
       $this->moveBlockToRegion($block, $region);
     }
 
-    // Set the block to the disabled region.
-    $edit = array();
-    $edit['blocks[' . $block['id'] . '][region]'] = -1;
-    $this->drupalPostForm('admin/structure/block', $edit, t('Save blocks'));
+    // Disable the block.
+    $this->drupalGet('admin/structure/block');
+    $this->clickLink('Disable');
 
     // Confirm that the block is now listed as disabled.
     $this->assertText(t('The block settings have been updated.'), 'Block successfully move to disabled region.');
diff --git a/core/modules/block/src/Tests/BlockUiTest.php b/core/modules/block/src/Tests/BlockUiTest.php
index 37fce6e..abd93aa 100644
--- a/core/modules/block/src/Tests/BlockUiTest.php
+++ b/core/modules/block/src/Tests/BlockUiTest.php
@@ -186,12 +186,15 @@ public function testMachineNameSuggestion() {
     $url = 'admin/structure/block/add/test_block_instantiation/classy';
     $this->drupalGet($url);
     $this->assertFieldByName('id', 'displaymessage', 'Block form uses raw machine name suggestion when no instance already exists.');
-    $this->drupalPostForm($url, array(), 'Save block');
+    $edit = ['region' => 'content'];
+    $this->drupalPostForm($url, $edit, 'Save block');
+    $this->assertText('The block configuration has been saved.');
 
     // Now, check to make sure the form starts by autoincrementing correctly.
     $this->drupalGet($url);
     $this->assertFieldByName('id', 'displaymessage_2', 'Block form appends _2 to plugin-suggested machine name when an instance already exists.');
-    $this->drupalPostForm($url, array(), 'Save block');
+    $this->drupalPostForm($url, $edit, 'Save block');
+    $this->assertText('The block configuration has been saved.');
 
     // And verify that it continues working beyond just the first two.
     $this->drupalGet($url);
diff --git a/core/modules/block/src/Tests/Views/DisplayBlockTest.php b/core/modules/block/src/Tests/Views/DisplayBlockTest.php
index 880f68c..e2519f0 100644
--- a/core/modules/block/src/Tests/Views/DisplayBlockTest.php
+++ b/core/modules/block/src/Tests/Views/DisplayBlockTest.php
@@ -185,8 +185,10 @@ public function testViewsBlockForm() {
     // Test that that machine name field is hidden from display and has been
     // saved as expected from the default value.
     $this->assertNoFieldById('edit-machine-name', 'views_block__test_view_block_1', 'The machine name is hidden on the views block form.');
+
     // Save the block.
-    $this->drupalPostForm(NULL, array(), t('Save block'));
+    $edit = ['region' => 'content'];
+    $this->drupalPostForm(NULL, $edit, t('Save block'));
     $storage = $this->container->get('entity.manager')->getStorage('block');
     $block = $storage->load('views_block__test_view_block_block_1');
     // This will only return a result if our new block has been created with the
@@ -195,7 +197,7 @@ public function testViewsBlockForm() {
 
     for ($i = 2; $i <= 3; $i++) {
       // Place the same block again and make sure we have a new ID.
-      $this->drupalPostForm('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme, array(), t('Save block'));
+      $this->drupalPostForm('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme, $edit, t('Save block'));
       $block = $storage->load('views_block__test_view_block_block_1_' . $i);
       // This will only return a result if our new block has been created with the
       // expected machine name.
@@ -204,7 +206,7 @@ public function testViewsBlockForm() {
 
     // Tests the override capability of items per page.
     $this->drupalGet('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme);
-    $edit = array();
+    $edit = ['region' => 'content'];
     $edit['settings[override][items_per_page]'] = 10;
 
     $this->drupalPostForm('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme, $edit, t('Save block'));
@@ -222,7 +224,7 @@ public function testViewsBlockForm() {
     $this->assertEqual(5, $config['items_per_page'], "'Items per page' is properly saved.");
 
     // Tests the override of the label capability.
-    $edit = array();
+    $edit = ['region' => 'content'];
     $edit['settings[views_label_checkbox]'] = 1;
     $edit['settings[views_label]'] = 'Custom title';
     $this->drupalPostForm('admin/structure/block/add/views_block:test_view_block-block_1/' . $default_theme, $edit, t('Save block'));
diff --git a/core/modules/block_content/src/Tests/BlockContentCreationTest.php b/core/modules/block_content/src/Tests/BlockContentCreationTest.php
index 6bf250c..bda0bea 100644
--- a/core/modules/block_content/src/Tests/BlockContentCreationTest.php
+++ b/core/modules/block_content/src/Tests/BlockContentCreationTest.php
@@ -104,6 +104,7 @@ public function testBlockContentCreationMultipleViewModes() {
     $this->assertFieldByXPath('//select[@name="settings[view_mode]"]', NULL, 'View mode setting shown because multiple exist');
 
     // Change the view mode.
+    $view_mode['region'] = 'content';
     $view_mode['settings[view_mode]'] = 'test_view_mode';
     $this->drupalPostForm(NULL, $view_mode, t('Save block'));
 
diff --git a/core/modules/block_content/src/Tests/BlockContentTypeTest.php b/core/modules/block_content/src/Tests/BlockContentTypeTest.php
index 20dc1a2..1fae68c 100644
--- a/core/modules/block_content/src/Tests/BlockContentTypeTest.php
+++ b/core/modules/block_content/src/Tests/BlockContentTypeTest.php
@@ -207,7 +207,7 @@ public function testsBlockContentAddTypes() {
         if (!empty($blocks)) {
           $block = reset($blocks);
           $this->assertUrl(\Drupal::url('block.admin_add', array('plugin_id' => 'block_content:' . $block->uuid(), 'theme' => $theme), array('absolute' => TRUE)));
-          $this->drupalPostForm(NULL, array(), t('Save block'));
+          $this->drupalPostForm(NULL, ['region' => 'content'], t('Save block'));
           $this->assertUrl(\Drupal::url('block.admin_display_theme', array('theme' => $theme), array('absolute' => TRUE, 'query' => array('block-placement' => Html::getClass($edit['info[0][value]'])))));
         }
         else {
diff --git a/core/modules/system/src/Tests/System/AccessDeniedTest.php b/core/modules/system/src/Tests/System/AccessDeniedTest.php
index 0f37320..810cd87 100644
--- a/core/modules/system/src/Tests/System/AccessDeniedTest.php
+++ b/core/modules/system/src/Tests/System/AccessDeniedTest.php
@@ -58,7 +58,7 @@ function testAccessDenied() {
     $this->drupalPostForm('admin/config/system/site-information', $edit, t('Save configuration'));
 
     // Enable the user login block.
-    $this->drupalPlaceBlock('user_login_block', array('id' => 'login'));
+    $block = $this->drupalPlaceBlock('user_login_block', array('id' => 'login'));
 
     // Log out and check that the user login block is shown on custom 403 pages.
     $this->drupalLogout();
@@ -83,10 +83,7 @@ function testAccessDenied() {
     // Log back in, set the custom 403 page to /user/login and remove the block
     $this->drupalLogin($this->adminUser);
     $this->config('system.site')->set('page.403', '/user/login')->save();
-    $edit = [
-      'region' => -1,
-    ];
-    $this->drupalPostForm('admin/structure/block/manage/login', $edit, t('Save block'));
+    $block->disable()->save();
 
     // Check that we can log in from the 403 page.
     $this->drupalLogout();
