diff --git a/core/config/schema/core.data_types.schema.yml b/core/config/schema/core.data_types.schema.yml
index 3d4f3a0..99980cc 100644
--- a/core/config/schema/core.data_types.schema.yml
+++ b/core/config/schema/core.data_types.schema.yml
@@ -295,13 +295,6 @@ block_settings:
     label_display:
       type: string
       label: 'Display title'
-    cache:
-      type: mapping
-      label: 'Cache settings'
-      mapping:
-        max_age:
-          type: integer
-          label: 'Maximum age'
     status:
       type: boolean
       label: 'Status'
diff --git a/core/lib/Drupal/Core/Block/BlockBase.php b/core/lib/Drupal/Core/Block/BlockBase.php
index 8c97809..f9d6719 100644
--- a/core/lib/Drupal/Core/Block/BlockBase.php
+++ b/core/lib/Drupal/Core/Block/BlockBase.php
@@ -9,13 +9,11 @@
 
 use Drupal\block\BlockInterface;
 use Drupal\Core\Access\AccessResult;
-use Drupal\Core\Cache\CacheableDependencyInterface;
 use Drupal\Core\Form\FormStateInterface;
 use Drupal\Core\Plugin\ContextAwarePluginBase;
 use Drupal\Component\Utility\Unicode;
 use Drupal\Component\Utility\NestedArray;
 use Drupal\Core\Language\LanguageInterface;
-use Drupal\Core\Cache\Cache;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\Component\Transliteration\TransliterationInterface;
 
@@ -89,10 +87,6 @@ protected function baseConfigurationDefaults() {
       'label' => '',
       'provider' => $this->pluginDefinition['provider'],
       'label_display' => BlockInterface::BLOCK_LABEL_VISIBLE,
-      'cache' => array(
-        // Blocks are cacheable by default.
-        'max_age' => Cache::PERMANENT,
-      ),
     );
   }
 
@@ -180,23 +174,6 @@ public function buildConfigurationForm(array $form, FormStateInterface $form_sta
       '#default_value' => ($this->configuration['label_display'] === BlockInterface::BLOCK_LABEL_VISIBLE),
       '#return_value' => BlockInterface::BLOCK_LABEL_VISIBLE,
     );
-    // Identical options to the ones for page caching.
-    // @see \Drupal\system\Form\PerformanceForm::buildForm()
-    $period = array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400);
-    $period = array_map(array(\Drupal::service('date.formatter'), 'formatInterval'), array_combine($period, $period));
-    $period[0] = '<' . $this->t('no caching') . '>';
-    $period[\Drupal\Core\Cache\Cache::PERMANENT] = $this->t('Forever');
-    $form['cache'] = array(
-      '#type' => 'details',
-      '#title' => $this->t('Cache settings'),
-    );
-    $form['cache']['max_age'] = array(
-      '#type' => 'select',
-      '#title' => $this->t('Maximum age'),
-      '#description' => $this->t('The maximum time this block may be cached.'),
-      '#default_value' => $this->configuration['cache']['max_age'],
-      '#options' => $period,
-    );
 
     // Add plugin-specific settings for this block type.
     $form += $this->blockForm($form, $form_state);
@@ -244,7 +221,6 @@ public function submitConfigurationForm(array &$form, FormStateInterface $form_s
       $this->configuration['label'] = $form_state->getValue('label');
       $this->configuration['label_display'] = $form_state->getValue('label_display');
       $this->configuration['provider'] = $form_state->getValue('provider');
-      $this->configuration['cache'] = $form_state->getValue('cache');
       $this->blockSubmit($form, $form_state);
     }
   }
@@ -273,16 +249,6 @@ public function getMachineNameSuggestion() {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function getCacheMaxAge() {
-    $max_age = parent::getCacheMaxAge();
-    // @todo Configurability of this will be removed in
-    //   https://www.drupal.org/node/2458763.
-    return Cache::mergeMaxAges($max_age, (int) $this->configuration['cache']['max_age']);
-  }
-
-  /**
    * Wraps the transliteration service.
    *
    * @return \Drupal\Component\Transliteration\TransliterationInterface
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php
index c8348e0..0c79a28 100644
--- a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php
+++ b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalActionsBlock.php
@@ -94,22 +94,6 @@ public function build() {
   /**
    * {@inheritdoc}
    */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // The "Primary admin actions" block is never cacheable because hooks creating local
-    // actions don't provide cacheability metadata.
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['#description'] = $this->t('This block is never cacheable.');
-    $form['cache']['max_age']['#value'] = 0;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getCacheMaxAge() {
     // @todo Remove after https://www.drupal.org/node/2511516 has landed.
     return 0;
diff --git a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php
index 6edfc6b..64d9a85 100644
--- a/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php
+++ b/core/lib/Drupal/Core/Menu/Plugin/Block/LocalTasksBlock.php
@@ -119,22 +119,6 @@ public function build() {
   /**
    * {@inheritdoc}
    */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // The "Page actions" block is never cacheable because of hooks creating
-    // local tasks doesn't provide cacheability metadata.
-    // @todo Remove after https://www.drupal.org/node/2511516 has landed.
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['#description'] = $this->t('This block is never cacheable.');
-    $form['cache']['max_age']['#value'] = 0;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getCacheMaxAge() {
     // @todo Remove after https://www.drupal.org/node/2511516 has landed.
     return 0;
diff --git a/core/modules/block/block.install b/core/modules/block/block.install
index 9abe82e..106815c 100644
--- a/core/modules/block/block.install
+++ b/core/modules/block/block.install
@@ -103,5 +103,26 @@ function block_update_8002() {
 }
 
 /**
+ * Remove 'cache' setting.
+ */
+function block_update_8003() {
+  $config_factory = \Drupal::configFactory();
+  foreach ($config_factory->listAll('block.block.') as $block_config_name) {
+    $block = $config_factory->getEditable($block_config_name);
+
+    // Remove the 'cache' setting.
+    $settings = $block->get('settings');
+    unset($settings['cache']);
+    $block->set('settings', $settings);
+
+    // Mark the resulting configuration as trusted data. This avoids issues with
+    // future schema changes.
+    $block->save(TRUE);
+  }
+
+  return t('Block settings updated.');
+}
+
+/**
  * @} End of "addtogroup updates-8.0.0-beta".
  */
diff --git a/core/modules/block/src/Tests/BlockCacheTest.php b/core/modules/block/src/Tests/BlockCacheTest.php
index b118e84..856dbb4 100644
--- a/core/modules/block/src/Tests/BlockCacheTest.php
+++ b/core/modules/block/src/Tests/BlockCacheTest.php
@@ -148,9 +148,7 @@ function testCachePermissions() {
    * Test non-cacheable block.
    */
   function testNoCache() {
-    $this->setBlockCacheConfig(array(
-      'max_age' => 0,
-    ));
+    \Drupal::state()->set('block_test.cache_max_age', 0);
 
     $current_content = $this->randomMachineName();
     \Drupal::state()->set('block_test.content', $current_content);
@@ -219,13 +217,4 @@ function testCachePerPage() {
     $this->assertText($old_content, 'Block content cached for the test page.');
   }
 
-  /**
-   * Private helper method to set the test block's cache configuration.
-   */
-  private function setBlockCacheConfig($cache_config) {
-    $block = $this->block->getPlugin();
-    $block->setConfigurationValue('cache', $cache_config);
-    $this->block->save();
-  }
-
 }
diff --git a/core/modules/block/src/Tests/BlockInterfaceTest.php b/core/modules/block/src/Tests/BlockInterfaceTest.php
index 7215765..2e172a0 100644
--- a/core/modules/block/src/Tests/BlockInterfaceTest.php
+++ b/core/modules/block/src/Tests/BlockInterfaceTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\block\Tests;
 
-use Drupal\Core\Cache\Cache;
 use Drupal\Core\Form\FormState;
 use Drupal\simpletest\KernelTestBase;
 use Drupal\block\BlockInterface;
@@ -44,9 +43,6 @@ public function testBlockInterface() {
       'label' => 'Custom Display Message',
       'provider' => 'block_test',
       'label_display' => BlockInterface::BLOCK_LABEL_VISIBLE,
-      'cache' => array(
-        'max_age' => Cache::PERMANENT,
-      ),
       'display_message' => 'no message set',
     );
     // Initial configuration of the block at construction time.
@@ -60,10 +56,6 @@ public function testBlockInterface() {
     $this->assertIdentical($display_block->getConfiguration(), $expected_configuration, 'The block configuration was updated correctly.');
     $definition = $display_block->getPluginDefinition();
 
-    $period = array(0, 60, 180, 300, 600, 900, 1800, 2700, 3600, 10800, 21600, 32400, 43200, 86400);
-    $period = array_map(array(\Drupal::service('date.formatter'), 'formatInterval'), array_combine($period, $period));
-    $period[0] = '<' . t('no caching') . '>';
-    $period[\Drupal\Core\Cache\Cache::PERMANENT] = t('Forever');
     $expected_form = array(
       'provider' => array(
         '#type' => 'value',
@@ -87,17 +79,6 @@ public function testBlockInterface() {
         '#default_value' => TRUE,
         '#return_value' => 'visible',
       ),
-      'cache' => array(
-        '#type' => 'details',
-        '#title' => t('Cache settings'),
-        'max_age' => array(
-          '#type' => 'select',
-          '#title' => t('Maximum age'),
-          '#description' => t('The maximum time this block may be cached.'),
-          '#default_value' => Cache::PERMANENT,
-          '#options' => $period,
-        ),
-      ),
       'display_message' => array(
         '#type' => 'textfield',
         '#title' => t('Display message'),
diff --git a/core/modules/block/src/Tests/BlockStorageUnitTest.php b/core/modules/block/src/Tests/BlockStorageUnitTest.php
index f1d435a..140f746 100644
--- a/core/modules/block/src/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/src/Tests/BlockStorageUnitTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\block\Tests;
 
-use Drupal\Core\Cache\Cache;
 use Drupal\Core\Config\Entity\ConfigEntityStorage;
 use Drupal\simpletest\KernelTestBase;
 use Drupal\block_test\Plugin\Block\TestHtmlBlock;
@@ -99,9 +98,6 @@ protected function createTests() {
         'label' => '',
         'provider' => 'block_test',
         'label_display' => BlockInterface::BLOCK_LABEL_VISIBLE,
-        'cache' => array(
-          'max_age' => Cache::PERMANENT,
-        ),
       ),
       'visibility' => array(),
     );
diff --git a/core/modules/block/tests/modules/block_test/src/Plugin/Block/TestCacheBlock.php b/core/modules/block/tests/modules/block_test/src/Plugin/Block/TestCacheBlock.php
index abe4cc7..157acb4 100644
--- a/core/modules/block/tests/modules/block_test/src/Plugin/Block/TestCacheBlock.php
+++ b/core/modules/block/tests/modules/block_test/src/Plugin/Block/TestCacheBlock.php
@@ -8,6 +8,7 @@
 namespace Drupal\block_test\Plugin\Block;
 
 use Drupal\Core\Block\BlockBase;
+use Drupal\Core\Cache\Cache;
 
 /**
  * Provides a block to test caching.
@@ -39,4 +40,11 @@ public function getCacheContexts() {
     return \Drupal::state()->get('block_test.cache_contexts', []);
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getCacheMaxAge() {
+    return \Drupal::state()->get('block_test.cache_max_age', parent::getCacheMaxAge());
+  }
+
 }
diff --git a/core/modules/node/src/Plugin/Block/SyndicateBlock.php b/core/modules/node/src/Plugin/Block/SyndicateBlock.php
index 9e5834b..1e40332 100644
--- a/core/modules/node/src/Plugin/Block/SyndicateBlock.php
+++ b/core/modules/node/src/Plugin/Block/SyndicateBlock.php
@@ -50,27 +50,4 @@ public function build() {
     );
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // @see ::getCacheMaxAge()
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['max_age']['#value'] = Cache::PERMANENT;
-    $form['cache']['#description'] = $this->t('This block is always cached forever, it is not configurable.');
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheMaxAge() {
-    // The 'Syndicate' block is permanently cacheable, because its
-    // contents can never change.
-    return Cache::PERMANENT;
-  }
-
 }
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index fcdb00a..3acb74b 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -410,7 +410,6 @@ protected function drupalBuildEntityView(EntityInterface $entity, $view_mode = '
    *   - region: 'sidebar_first'.
    *   - theme: The default theme.
    *   - visibility: Empty array.
-   *   - cache: array('max_age' => Cache::PERMANENT).
    *
    * @return \Drupal\block\Entity\Block
    *   The block entity.
@@ -427,9 +426,6 @@ protected function drupalPlaceBlock($plugin_id, array $settings = array()) {
       'label' => $this->randomMachineName(8),
       'visibility' => array(),
       'weight' => 0,
-      'cache' => array(
-        'max_age' => Cache::PERMANENT,
-      ),
     );
     $values = [];
     foreach (array('region', 'id', 'theme', 'plugin', 'weight', 'visibility') as $key) {
diff --git a/core/modules/system/src/Plugin/Block/SystemMainBlock.php b/core/modules/system/src/Plugin/Block/SystemMainBlock.php
index f164f66..92475ab 100644
--- a/core/modules/system/src/Plugin/Block/SystemMainBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemMainBlock.php
@@ -43,17 +43,4 @@ public function build() {
     return $this->mainContent;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['#description'] = $this->t("This block's maximum age cannot be configured, because it depends on the contents.");
-    $form['cache']['max_age']['#value'] = Cache::PERMANENT;
-
-    return $form;
-  }
-
 }
diff --git a/core/modules/system/src/Plugin/Block/SystemMessagesBlock.php b/core/modules/system/src/Plugin/Block/SystemMessagesBlock.php
index 11f312a..c1d78fb 100644
--- a/core/modules/system/src/Plugin/Block/SystemMessagesBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemMessagesBlock.php
@@ -43,20 +43,6 @@ public function build() {
   /**
    * {@inheritdoc}
    */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // @see ::getCacheMaxAge()
-    $form['cache']['#description'] = $this->t('This block is cacheable forever, it is not configurable.');
-    $form['cache']['max_age']['#value'] = Cache::PERMANENT;
-    $form['cache']['max_age']['#disabled'] = TRUE;
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getCacheMaxAge() {
     // The messages are session-specific and hence aren't cacheable, but the
     // block itself *is* cacheable because it uses a #lazy_builder callback and
diff --git a/core/modules/system/src/Plugin/Block/SystemPoweredByBlock.php b/core/modules/system/src/Plugin/Block/SystemPoweredByBlock.php
index c768e21..b9adca8 100644
--- a/core/modules/system/src/Plugin/Block/SystemPoweredByBlock.php
+++ b/core/modules/system/src/Plugin/Block/SystemPoweredByBlock.php
@@ -28,27 +28,4 @@ public function build() {
     return array('#markup' => '<span>' . $this->t('Powered by <a href="@poweredby">Drupal</a>', array('@poweredby' => 'https://www.drupal.org')) . '</span>');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function buildConfigurationForm(array $form, FormStateInterface $form_state) {
-    $form = parent::buildConfigurationForm($form, $form_state);
-
-    // @see ::getCacheMaxAge()
-    $form['cache']['#disabled'] = TRUE;
-    $form['cache']['max_age']['#value'] = Cache::PERMANENT;
-    $form['cache']['#description'] = $this->t('This block is always cached forever, it is not configurable.');
-
-    return $form;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getCacheMaxAge() {
-    // The 'Powered by Drupal' block is permanently cacheable, because its
-    // contents can never change.
-    return Cache::PERMANENT;
-  }
-
 }
diff --git a/core/modules/system/src/Tests/Ajax/AjaxFormCacheTest.php b/core/modules/system/src/Tests/Ajax/AjaxFormCacheTest.php
index 4ebeed6..92e3644 100644
--- a/core/modules/system/src/Tests/Ajax/AjaxFormCacheTest.php
+++ b/core/modules/system/src/Tests/Ajax/AjaxFormCacheTest.php
@@ -49,7 +49,7 @@ public function testBlockForms() {
     $this->drupalLogin($this->rootUser);
 
     $this->drupalPlaceBlock('search_form_block', ['weight' => -5]);
-    $this->drupalPlaceBlock('ajax_forms_test_block', ['cache' => ['max_age' => 0]]);
+    $this->drupalPlaceBlock('ajax_forms_test_block');
 
     $this->drupalGet('');
     $this->drupalPostAjaxForm(NULL, ['test1' => 'option1'], 'test1');
@@ -66,7 +66,7 @@ public function testQueryString() {
     $this->container->get('module_installer')->install(['block']);
     $this->drupalLogin($this->rootUser);
 
-    $this->drupalPlaceBlock('ajax_forms_test_block', ['cache' => ['max_age' => 0]]);
+    $this->drupalPlaceBlock('ajax_forms_test_block');
 
     $url = Url::fromRoute('entity.user.canonical', ['user' => $this->rootUser->id()], ['query' => ['foo' => 'bar']]);
     $this->drupalGet($url);
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 6ade317..73c51d5 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1496,7 +1496,6 @@ function system_update_8006() {
     'region' => 'content',
     'settings.label' => 'Site Branding',
     'settings.label_display' => 0,
-    'settings.cache.max_age' => 0,
     'visibility' => [],
     'weight' => 0,
     'langcode' => $langcode,
diff --git a/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php b/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
index 4d08d3a..71e278f 100644
--- a/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
+++ b/core/modules/views/src/Tests/Plugin/BlockDependenciesTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\views\Tests\Plugin;
 
-use Drupal\Core\Cache\Cache;
 use Drupal\views\Tests\ViewKernelTestBase;
 
 /**
@@ -83,7 +82,6 @@ public function testViewsBlock() {
    *   - region: 'sidebar_first'.
    *   - theme: The default theme.
    *   - visibility: Empty array.
-   *   - cache: array('max_age' => Cache::PERMANENT).
    *
    * @return \Drupal\block\Entity\Block
    *   The block entity.
@@ -97,9 +95,6 @@ protected function createBlock($plugin_id, array $settings = array()) {
       'label' => $this->randomMachineName(8),
       'visibility' => array(),
       'weight' => 0,
-      'cache' => array(
-        'max_age' => Cache::PERMANENT,
-      ),
     );
     $values = [];
     foreach (array('region', 'id', 'theme', 'plugin', 'weight', 'visibility') as $key) {
