diff --git a/core/modules/aggregator/aggregator.module b/core/modules/aggregator/aggregator.module
index 5021e57..3ccbb3c 100644
--- a/core/modules/aggregator/aggregator.module
+++ b/core/modules/aggregator/aggregator.module
@@ -541,7 +541,7 @@ function aggregator_filter_xss($value) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function aggregator_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'aggregator') {
diff --git a/core/modules/block/block.api.php b/core/modules/block/block.api.php
index c2bf7ff..93a113a 100644
--- a/core/modules/block/block.api.php
+++ b/core/modules/block/block.api.php
@@ -20,7 +20,7 @@
  * If the module wishes to act on the rendered HTML of the block rather than
  * the structured content array, it may use this hook to add a #post_render
  * callback. Alternatively, it could also implement hook_preprocess_HOOK() for
- * block.tpl.php. See drupal_render() and theme() documentation respectively
+ * block.html.twig. See drupal_render() and theme() documentation respectively
  * for details.
  *
  * In addition to hook_block_view_alter(), which is called for all blocks, there
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index db497e3..61e80a3 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -515,21 +515,23 @@ function block_rebuild() {
 }
 
 /**
- * Processes variables for block.tpl.php.
+ * Prepares variables for block templates.
+ *
+ * Default template: block.html.twig.
  *
  * Prepares the values passed to the theme_block function to be passed
  * into a pluggable template engine. Uses block properties to generate a
  * series of template file suggestions. If none are found, the default
- * block.tpl.php is used.
- *
- * Most themes utilize their own copy of block.tpl.php. The default is located
- * inside "modules/block/block.tpl.php". Look in there for the full list of
- * variables.
+ * block.html.twig is used.
  *
- * The $variables array contains the following arguments:
- * - $block
+ * Most themes use their own copy of block.html.twig. The default is located
+ * inside "core/modules/block/templates/block.html.twig". Look in there for the
+ * full list of available variables.
  *
- * @see block.tpl.php
+ * @param array $variables
+ *   An associative array containing:
+ *   - elements: An associative array containing the properties of the element.
+ *     Properties used: #block, #configuration, #children, #plugin_id.
  */
 function template_preprocess_block(&$variables) {
   $block_counter = &drupal_static(__FUNCTION__, array());
@@ -565,7 +567,7 @@ function template_preprocess_block(&$variables) {
   if ($id = $variables['elements']['#block']->id()) {
     $config_id = explode('.', $id);
     $machine_name = array_pop($config_id);
-    $variables['block_html_id'] = drupal_html_id('block-' . $machine_name);
+    $variables['attributes']['id'] = drupal_html_id('block-' . $machine_name);
     $variables['theme_hook_suggestions'][] = 'block__' . $machine_name;
   }
 }
diff --git a/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
index dfc3b61..c3fbca3 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockStorageUnitTest.php
@@ -135,11 +135,13 @@ protected function renderTests() {
     $entity = entity_load('block', 'stark.test_block');
     $output = entity_view($entity, 'block');
     $expected = array();
-    $expected[] = '  <div id="block-test-block"  class="block block-block-test">';
-    $expected[] = '';
+    $expected[] = '<div class="block block-block-test" id="block-test-block">';
+    $expected[] = '  ';
     $expected[] = '    ';
+    $expected[] = '';
     $expected[] = '  <div class="content">';
-    $expected[] = '      </div>';
+    $expected[] = '    ';
+    $expected[] = '  </div>';
     $expected[] = '</div>';
     $expected[] = '';
     $expected_output = implode("\n", $expected);
@@ -159,12 +161,14 @@ protected function renderTests() {
     $entity->save();
     $output = entity_view($entity, 'block');
     $expected = array();
-    $expected[] = '  <div id="block-test-block2"  class="block block-block-test">';
-    $expected[] = '';
-    $expected[] = '    <h2>Powered by Bananas</h2>';
+    $expected[] = '<div class="block block-block-test" id="block-test-block2">';
     $expected[] = '  ';
+    $expected[] = '      <h2>Powered by Bananas</h2>';
+    $expected[] = '    ';
+    $expected[] = '';
     $expected[] = '  <div class="content">';
-    $expected[] = '      </div>';
+    $expected[] = '    ';
+    $expected[] = '  </div>';
     $expected[] = '</div>';
     $expected[] = '';
     $expected_output = implode("\n", $expected);
diff --git a/core/modules/block/templates/block.html.twig b/core/modules/block/templates/block.html.twig
new file mode 100644
index 0000000..757f8f5
--- /dev/null
+++ b/core/modules/block/templates/block.html.twig
@@ -0,0 +1,55 @@
+{#
+/**
+ * @file
+ * Default theme implementation to display a block.
+ *
+ * Available variables:
+ * - plugin_id: The ID of the block implementation.
+ * - label: The configured label of the block if visible.
+ * - configuration: A list of the block's configuration values.
+ *   - label: The configured label for the block.
+ *   - label_display: The display settings for the label.
+ *   - module: The module that provided this block plugin.
+ *   - cache: The cache settings.
+ *   - Block plugin specific settings will also be stored here.
+ * - block - The full block entity.
+ *   - label_hidden: The hidden block title value if the block was
+ *     configured to hide the title ('label' is empty in this case).
+ *   - module: The module that generated the block.
+ *   - delta: An ID for the block, unique within each module.
+ *   - region: The block region embedding the current block.
+ * - content: The content of this block.
+ * - attributes: HTML attributes for the containing element.
+ *   - id: A valid HTML ID and guaranteed unique.
+ *   - class: Classes that can be used to style contextually through
+ *     CSS. These can be manipulated through preprocess functions. The default
+ *     values can be one or more of the following:
+ *     - block: The current template type, i.e., "theming hook".
+ *     - block-[module]: The module generating the block. For example, the user
+ *       module is responsible for handling the default user navigation block.
+ *       In that case the class would be 'block-user'.
+ * - title_attributes: HTML attributes for the title element.
+ * - content_attributes: HTML attributes for the content element.
+ * - title_prefix: Additional output populated by modules, intended to be
+ *   displayed in front of the main title tag that appears in the template.
+ * - title_suffix: Additional output populated by modules, intended to be
+ *   displayed after the main title tag that appears in the template.
+ *
+ * @see template_preprocess()
+ * @see template_preprocess_block()
+ *
+ * @ingroup themeable
+ */
+ @todo Remove the div around content as per http://drupal.org/node/1972122.
+#}
+<div{{ attributes }}>
+  {{ title_prefix }}
+  {% if label %}
+    <h2{{ title_attributes }}>{{ label }}</h2>
+  {% endif %}
+  {{ title_suffix }}
+
+  <div{{ content_attributes }}>
+    {{ content }}
+  </div>
+</div>
diff --git a/core/modules/block/templates/block.tpl.php b/core/modules/block/templates/block.tpl.php
deleted file mode 100644
index 106dd6b..0000000
--- a/core/modules/block/templates/block.tpl.php
+++ /dev/null
@@ -1,59 +0,0 @@
-<?php
-
-/**
- * @file
- * Default theme implementation to display a block.
- *
- * Available variables:
- * - $plugin_id: The ID of the block implementation.
- * - $label: The configured label of the block if visible.
- * - $configuration: An array of the block's configuration values.
- *   - label: The configured label for the block.
- *   - label_display: The display settings for the label.
- *   - module: The module that provided this block plugin.
- *   - cache: The cache settings.
- *   - Block plugin specific settings will also be stored here.
- * - $content: Block content.
- * - $attributes: An instance of Attributes class that can be manipulated as an
- *    array and printed as a string.
- *    It includes the 'class' information, which includes:
- *   - block: The current template type, i.e., "theming hook".
- *   - block-[module]: The module generating the block. For example, the user
- *     module is responsible for handling the default user navigation block. In
- *     that case the class would be 'block-user'.
- * - $title_prefix (array): An array containing additional output populated by
- *   modules, intended to be displayed in front of the main title tag that
- *   appears in the template.
- * - $title_suffix (array): An array containing additional output populated by
- *   modules, intended to be displayed after the main title tag that appears in
- *   the template.
- *
- * Helper variables:
- * - $is_front: Flags true when presented in the front page.
- * - $logged_in: Flags true when the current user is a logged-in member.
- * - $is_admin: Flags true when the current user is an administrator.
- * - $block_html_id: A valid HTML ID and guaranteed unique.
- *
- * @see template_preprocess()
- * @see template_preprocess_block()
- * @see template_process()
- *
- * @ingroup themeable
- */
-?>
-<?php if (isset($block_html_id)): ?>
-  <div id="<?php print $block_html_id; ?>" <?php print $attributes; ?>>
-<?php else: ?>
-  <div <?php print $attributes; ?>>
-<?php endif; ?>
-
-  <?php print render($title_prefix); ?>
-<?php if ($label): ?>
-  <h2<?php print $title_attributes; ?>><?php print $label; ?></h2>
-<?php endif;?>
-  <?php print render($title_suffix); ?>
-
-  <div<?php print $content_attributes; ?>>
-    <?php print render($content) ?>
-  </div>
-</div>
diff --git a/core/modules/book/book.module b/core/modules/book/book.module
index 887f95f..e2add7b 100644
--- a/core/modules/book/book.module
+++ b/core/modules/book/book.module
@@ -959,7 +959,7 @@ function _book_link_defaults($nid) {
 }
 
  /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function book_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'book') {
@@ -968,7 +968,7 @@ function book_preprocess_block(&$variables) {
 }
 
 /**
- * Processes variables for book-all-books-block.tpl.php.
+ * Processes variables for book-all-books-block.html.twig.
  *
  * All non-renderable elements are removed so that the template has full access
  * to the structured data but can also simply iterate over all elements and
@@ -978,7 +978,7 @@ function book_preprocess_block(&$variables) {
  *   An associative array containing the following key:
  *   - book_menus
  *
- * @see book-all-books-block.tpl.php
+ * @see book-all-books-block.html.twig
  */
 function template_preprocess_book_all_books_block(&$variables) {
   // Remove all non-renderable elements.
diff --git a/core/modules/comment/comment.module b/core/modules/comment/comment.module
index 3f6fdf5..279880e 100644
--- a/core/modules/comment/comment.module
+++ b/core/modules/comment/comment.module
@@ -1527,7 +1527,7 @@ function comment_preview(Comment $comment) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function comment_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'comment') {
diff --git a/core/modules/edit/edit.module b/core/modules/edit/edit.module
index 6a73d89..12a118d 100644
--- a/core/modules/edit/edit.module
+++ b/core/modules/edit/edit.module
@@ -157,7 +157,7 @@ function edit_preprocess_taxonomy_term(&$variables) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  *
  * @todo Remove this, handle in generic way: http://drupal.org/node/1972514.
  */
diff --git a/core/modules/forum/forum.module b/core/modules/forum/forum.module
index 20e8631..6110751 100644
--- a/core/modules/forum/forum.module
+++ b/core/modules/forum/forum.module
@@ -970,7 +970,7 @@ function forum_get_topics($tid, $sortby, $forum_per_page) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function forum_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'forum') {
diff --git a/core/modules/help/help.module b/core/modules/help/help.module
index d7042d3..4c347f9 100644
--- a/core/modules/help/help.module
+++ b/core/modules/help/help.module
@@ -66,7 +66,7 @@ function help_help($path, $arg) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function help_preprocess_block(&$variables) {
   if ($variables['plugin_id'] == 'system_help_block') {
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index 6294f31..1dd936f 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -760,7 +760,7 @@ function language_language_delete($language) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function language_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'language') {
diff --git a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php
index 8088f6a..47a61e7 100644
--- a/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php
+++ b/core/modules/language/lib/Drupal/language/Tests/LanguageSwitchingTest.php
@@ -59,7 +59,7 @@ function testLanguageBlock() {
     $this->assertText($block->label(), 'Language switcher block found.');
 
     // Assert that only the current language is marked as active.
-    list($language_switcher) = $this->xpath('//div[@id=:id]/div[@class="content"]', array(':id' => 'block-test-language-block'));
+    list($language_switcher) = $this->xpath('//div[@id=:id]/div[contains(@class, "content")]', array(':id' => 'block-test-language-block'));
     $links = array(
       'active' => array(),
       'inactive' => array(),
diff --git a/core/modules/menu/menu.module b/core/modules/menu/menu.module
index 93c2ed8..1b43a4e 100644
--- a/core/modules/menu/menu.module
+++ b/core/modules/menu/menu.module
@@ -713,7 +713,7 @@ function menu_get_menus($all = TRUE) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function menu_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'menu') {
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 0605169..db911d5 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1096,7 +1096,7 @@ function node_is_page(EntityInterface $node) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function node_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'node') {
diff --git a/core/modules/search/search.module b/core/modules/search/search.module
index f31488b..efaf031 100644
--- a/core/modules/search/search.module
+++ b/core/modules/search/search.module
@@ -135,7 +135,7 @@ function search_permission() {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function search_preprocess_block(&$variables) {
   if ($variables['plugin_id'] == 'search_form_block') {
diff --git a/core/modules/shortcut/shortcut.module b/core/modules/shortcut/shortcut.module
index d1458a8..2da3d26 100644
--- a/core/modules/shortcut/shortcut.module
+++ b/core/modules/shortcut/shortcut.module
@@ -447,7 +447,7 @@ function shortcut_renderable_links($shortcut_set = NULL) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function shortcut_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'shortcut') {
diff --git a/core/modules/statistics/statistics.module b/core/modules/statistics/statistics.module
index 9d0c19e..7b15281 100644
--- a/core/modules/statistics/statistics.module
+++ b/core/modules/statistics/statistics.module
@@ -234,7 +234,7 @@ function statistics_update_index() {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function statistics_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'statistics') {
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index c3c6584..7f3f6da 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2696,7 +2696,7 @@ function system_user_timezone(&$form, &$form_state) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function system_preprocess_block(&$variables) {
   // Derive the base plugin ID.
diff --git a/core/modules/user/user.module b/core/modules/user/user.module
index 3ae6154..54df039 100644
--- a/core/modules/user/user.module
+++ b/core/modules/user/user.module
@@ -660,7 +660,7 @@ function user_validate_current_pass(&$form, &$form_state) {
 }
 
 /**
- * Implements hook_preprocess_HOOK() for block.tpl.php.
+ * Implements hook_preprocess_HOOK() for block.html.twig.
  */
 function user_preprocess_block(&$variables) {
   if ($variables['configuration']['module'] == 'user') {
