diff --git a/core/modules/block/block.admin.inc b/core/modules/block/block.admin.inc
index 13f17ad..962b287 100644
--- a/core/modules/block/block.admin.inc
+++ b/core/modules/block/block.admin.inc
@@ -56,7 +56,7 @@ function block_admin_display_prepare_blocks($theme) {
   $blocks = _block_rehash($theme);
   $compare_theme = &drupal_static('_block_compare:theme');
   $compare_theme = $theme;
-  usort($blocks, '_block_compare');
+  uasort($blocks, '_block_compare');
   return $blocks;
 }
 
@@ -116,10 +116,6 @@ function block_admin_display_form($form, &$form_state, $blocks, $theme, $block_r
 
   foreach ($blocks as $key => $instance) {
     $block = $instance->getConfig();
-    $form['blocks'][$key]['config_id'] = array(
-      '#type' => 'value',
-      '#value' => $block['config_id'],
-    );
     $info = $instance->getDefinition();
     $form['blocks'][$key]['info'] = array(
       '#markup' => check_plain($info['subject']),
@@ -145,11 +141,11 @@ function block_admin_display_form($form, &$form_state, $blocks, $theme, $block_r
     );
     $links['configure'] = array(
       'title' => t('configure'),
-      'href' => 'admin/structure/block/manage/' . $block['config_id'] . '/' . $theme . '/configure',
+      'href' => 'admin/structure/block/manage/' . $block['id'] . '/' . $theme . '/configure',
     );
     $links['delete'] = array(
       'title' => t('delete'),
-      'href' => 'admin/structure/block/manage/' . $block['config_id'] . '/' . $theme . '/delete',
+      'href' => 'admin/structure/block/manage/' . $block['id'] . '/' . $theme . '/delete',
     );
     $form['blocks'][$key]['operations'] = array(
       '#type' => 'operations',
@@ -288,14 +284,6 @@ function block_admin_configure_validate($form, &$form_state) {
  */
 function block_admin_configure_submit($form, &$form_state) {
   $form['#instance']->submit($form, $form_state);
-  $config_values = $form['#instance']->getConfig();
-  $machine_name = 'plugin.core.block.' . $form_state['values']['theme'] . '.' . $form_state['values']['machine_name'];
-  $config = config($machine_name);
-  $config->set('id', $form['#instance']->getPluginId());
-  foreach ($config_values as $key => $value) {
-    $config->set($key, $value);
-  }
-  $config->save();
   drupal_set_message(t('The block configuration has been saved.'));
   cache_invalidate_tags(array('content' => TRUE));
   $form_state['redirect'] = 'admin/structure/block/list/block_plugin_ui:' . $form_state['values']['theme'];
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 31ef8db..7a0337c 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -358,7 +358,7 @@ function _block_rehash($theme = NULL) {
   $blocks = array();
   $instances = array();
   $theme = $theme ? $theme : variable_get('theme_default', 'stark');
-  $block_configs = config_get_storage_names_with_prefix('plugin.core.block.' . $theme);
+  $block_configs = config_get_storage_names_with_prefix('block.block.' . $theme);
   $regions = system_region_list($theme);
   foreach ($block_configs as $config) {
     $blocks[$config] = block_load($config);
@@ -474,11 +474,9 @@ function block_list($region) {
  *   A block object.
  */
 function block_load($plugin_id, array $conf = array()) {
-  $manager = drupal_container()->get('plugin.manager.block');
-  if (!$block = $manager->getInstance(array('config' => $plugin_id))) {
-    $block = $manager->createInstance($plugin_id, $conf);
+  if ($entity = entity_load('block', str_replace('block.block.', '', $plugin_id))) {
+    return $entity->getPlugin();
   }
-  return $block;
 }
 
 /**
@@ -488,14 +486,9 @@ function block_load($plugin_id, array $conf = array()) {
  *   An array of blocks grouped by region.
  */
 function _block_load_blocks() {
-  global $theme;
   $blocks = array();
-  $instances = config_get_storage_names_with_prefix('plugin.core.block.' . $theme);
-  $manager = drupal_container()->get('plugin.manager.block');
-  foreach ($instances as $plugin_id) {
-    $block = $manager->getInstance(array('config' => $plugin_id));
-    $config = $block->getConfig();
-    $blocks[$config['region']]["$plugin_id"] = $block;
+  foreach (entity_load_multiple('block') as $entity_id => $entity) {
+    $blocks[$entity->configuration['region']][$entity_id] = $entity->getPlugin();
   }
   return $blocks;
 }
@@ -658,21 +651,6 @@ function block_admin_paths() {
 }
 
 /**
- * Implements hook_modules_uninstalled().
- *
- * Cleans up any block configuration for uninstalled modules.
- */
-function block_modules_uninstalled($modules) {
-  $block_configs = config_get_storage_names_with_prefix('plugin.core.block');
-  foreach ($block_configs as $config_id) {
-    $config = config($config_id);
-    if (in_array($config->get('module'), $modules)) {
-      $config->delete();
-    }
-  }
-}
-
-/**
  * Implements hook_language_delete().
  *
  * Delete the potential block visibility settings of the deleted language.
diff --git a/core/modules/block/lib/Drupal/block/BlockBase.php b/core/modules/block/lib/Drupal/block/BlockBase.php
index b8f770d..8789a3c 100644
--- a/core/modules/block/lib/Drupal/block/BlockBase.php
+++ b/core/modules/block/lib/Drupal/block/BlockBase.php
@@ -538,6 +538,16 @@ public function submit($form, &$form_state) {
 
       // Perform block type-specific validation.
       $this->blockSubmit($form, $form_state);
+
+      $old_config = $this->configuration;
+      $old_config['id'] = $this->getPluginId();
+      unset($old_config['machine_name'], $old_config['theme'], $old_config['subject']);
+      $block = entity_create('block', array(
+        'id' => $form_state['values']['theme'] . '.' . $form_state['values']['machine_name'],
+        'label' => $form_state['values']['title'],
+        'configuration' => $old_config,
+      ));
+      $block->save();
     }
   }
 
@@ -582,9 +592,7 @@ public function build() {
     // hook_block_view_NAME_alter().
     $id = str_replace(':', '__', $this->getPluginId());
 
-    $config = $this->getConfig();
-    $config_id = explode('.', $config['config_id']);
-    $name = array_pop($config_id);
+    $name = '';
 
     $build = $this->blockBuild();
     drupal_alter(array('block_view', "block_view_$id", "block_view_$name"), $build, $this);
diff --git a/core/modules/block/lib/Drupal/block/BlockStorageController.php b/core/modules/block/lib/Drupal/block/BlockStorageController.php
new file mode 100644
index 0000000..eba8c33
--- /dev/null
+++ b/core/modules/block/lib/Drupal/block/BlockStorageController.php
@@ -0,0 +1,17 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block\BlockStorageController.
+ */
+
+namespace Drupal\block;
+
+use Drupal\Core\Config\Entity\ConfigStorageController;
+
+/**
+ * Defines the storage controller class for Block entities.
+ */
+class BlockStorageController extends ConfigStorageController {
+
+}
diff --git a/core/modules/block/lib/Drupal/block/Plugin/Core/Entity/Block.php b/core/modules/block/lib/Drupal/block/Plugin/Core/Entity/Block.php
new file mode 100644
index 0000000..974e2a2
--- /dev/null
+++ b/core/modules/block/lib/Drupal/block/Plugin/Core/Entity/Block.php
@@ -0,0 +1,101 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\block\Plugin\Core\Entity\Block.
+ */
+
+namespace Drupal\block\Plugin\Core\Entity;
+
+use Drupal\Core\Config\Entity\ConfigEntityBase;
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Defines a Block configuration entity class.
+ *
+ * @Plugin(
+ *   id = "block",
+ *   label = @Translation("Block"),
+ *   module = "block",
+ *   controller_class = "Drupal\block\BlockStorageController",
+ *   config_prefix = "block.block",
+ *   fieldable = FALSE,
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *     "uuid" = "uuid"
+ *   }
+ * )
+ */
+class Block extends ConfigEntityBase {
+
+  /**
+   * The id of the block.
+   *
+   * @var string
+   */
+  public $id;
+
+  /**
+   * The block label.
+   *
+   * @var string
+   */
+  public $label;
+
+  /**
+   * The block UUID.
+   *
+   * @var string
+   */
+  public $uuid;
+
+  /**
+   * @todo.
+   *
+   * @var array
+   */
+  public $configuration = array();
+
+  /**
+   * @todo.
+   *
+   * @var \Drupal\block\Plugin\Type\BlockManager
+   */
+  protected $manager;
+
+  public function __construct(array $values, $entity_type) {
+    parent::__construct($values, $entity_type);
+
+    $this->manager = drupal_container()->get('plugin.manager.block');
+  }
+
+  /**
+   * @todo.
+   *
+   * @return array
+   */
+  public function getConfig() {
+    return $this->configuration;
+  }
+
+  /**
+   * @todo.
+   *
+   * @return array
+   */
+  public function getDefinition() {
+    return $this->manager->getDefinition($this->configuration['id']) + $this->configuration;
+  }
+
+  /**
+   * @todo.
+   *
+   * @var \Drupal\block\BlockInterface
+   */
+  public function getPlugin() {
+    return $this->manager->createInstance($this->configuration['id'], $this->configuration);
+  }
+
+}
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.content.yml b/core/profiles/standard/config/block.block.bartik.content.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.bartik.content.yml
rename to core/profiles/standard/config/block.block.bartik.content.yml
index e10f903..460f0ff 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.content.yml
+++ b/core/profiles/standard/config/block.block.bartik.content.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: content
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.footer.yml b/core/profiles/standard/config/block.block.bartik.footer.yml
similarity index 92%
rename from core/profiles/standard/config/plugin.core.block.bartik.footer.yml
rename to core/profiles/standard/config/block.block.bartik.footer.yml
index 7b6f9b7..703274b 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.footer.yml
+++ b/core/profiles/standard/config/block.block.bartik.footer.yml
@@ -1,7 +1,7 @@
 id: 'system_menu_block:menu-footer'
 status: '1'
 cache: '-1'
-subject: 'Footer menu'
+label: 'Footer menu'
 visibility:
   path:
     visibility: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.help.yml b/core/profiles/standard/config/block.block.bartik.help.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.bartik.help.yml
rename to core/profiles/standard/config/block.block.bartik.help.yml
index a5c4467..2b05d11 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.help.yml
+++ b/core/profiles/standard/config/block.block.bartik.help.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: help
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.login.yml b/core/profiles/standard/config/block.block.bartik.login.yml
similarity index 93%
rename from core/profiles/standard/config/plugin.core.block.bartik.login.yml
rename to core/profiles/standard/config/block.block.bartik.login.yml
index 8d8923a..7153197 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.login.yml
+++ b/core/profiles/standard/config/block.block.bartik.login.yml
@@ -13,7 +13,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'User login'
+label: 'User login'
 module: user
 region: sidebar_first
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.navigation.yml b/core/profiles/standard/config/block.block.bartik.navigation.yml
similarity index 91%
rename from core/profiles/standard/config/plugin.core.block.bartik.navigation.yml
rename to core/profiles/standard/config/block.block.bartik.navigation.yml
index f16c6f4..33c9f68 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.navigation.yml
+++ b/core/profiles/standard/config/block.block.bartik.navigation.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'Main navigation'
+label: 'Main navigation'
 module: system
 region: sidebar_first
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.powered.yml b/core/profiles/standard/config/block.block.bartik.powered.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.bartik.powered.yml
rename to core/profiles/standard/config/block.block.bartik.powered.yml
index 3ef20d7..58f043c 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.powered.yml
+++ b/core/profiles/standard/config/block.block.bartik.powered.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: footer
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.search.yml b/core/profiles/standard/config/block.block.bartik.search.yml
similarity index 93%
rename from core/profiles/standard/config/plugin.core.block.bartik.search.yml
rename to core/profiles/standard/config/block.block.bartik.search.yml
index 466659b..bdc4b95 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.search.yml
+++ b/core/profiles/standard/config/block.block.bartik.search.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'Search'
+label: 'Search'
 module: search
 region: sidebar_first
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.bartik.tools.yml b/core/profiles/standard/config/block.block.bartik.tools.yml
similarity index 94%
rename from core/profiles/standard/config/plugin.core.block.bartik.tools.yml
rename to core/profiles/standard/config/block.block.bartik.tools.yml
index d6a38c9..2f9c968 100644
--- a/core/profiles/standard/config/plugin.core.block.bartik.tools.yml
+++ b/core/profiles/standard/config/block.block.bartik.tools.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'Tools'
+label: 'Tools'
 module: system
 region: sidebar_first
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.content.yml b/core/profiles/standard/config/block.block.seven.content.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.seven.content.yml
rename to core/profiles/standard/config/block.block.seven.content.yml
index 51b155f..fde0954 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.content.yml
+++ b/core/profiles/standard/config/block.block.seven.content.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: content
 weight: '-3'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.help.yml b/core/profiles/standard/config/block.block.seven.help.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.seven.help.yml
rename to core/profiles/standard/config/block.block.seven.help.yml
index a5c4467..2b05d11 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.help.yml
+++ b/core/profiles/standard/config/block.block.seven.help.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: help
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.login.yml b/core/profiles/standard/config/block.block.seven.login.yml
similarity index 92%
rename from core/profiles/standard/config/plugin.core.block.seven.login.yml
rename to core/profiles/standard/config/block.block.seven.login.yml
index 8352fab..98d21d6 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.login.yml
+++ b/core/profiles/standard/config/block.block.seven.login.yml
@@ -14,6 +14,6 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'User login'
+label: 'User login'
 module: user
 weight: '-3'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.navigation.yml b/core/profiles/standard/config/block.block.seven.navigation.yml
similarity index 91%
rename from core/profiles/standard/config/plugin.core.block.seven.navigation.yml
rename to core/profiles/standard/config/block.block.seven.navigation.yml
index 7fc3e2c..1d22e54 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.navigation.yml
+++ b/core/profiles/standard/config/block.block.seven.navigation.yml
@@ -13,6 +13,6 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'Main navigation'
+label: 'Main navigation'
 module: system
 weight: '-2'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.powered.yml b/core/profiles/standard/config/block.block.seven.powered.yml
similarity index 95%
rename from core/profiles/standard/config/plugin.core.block.seven.powered.yml
rename to core/profiles/standard/config/block.block.seven.powered.yml
index b9aac19..4a36302 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.powered.yml
+++ b/core/profiles/standard/config/block.block.seven.powered.yml
@@ -13,6 +13,6 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 weight: '0'
diff --git a/core/profiles/standard/config/plugin.core.block.seven.search.yml b/core/profiles/standard/config/block.block.seven.search.yml
similarity index 93%
rename from core/profiles/standard/config/plugin.core.block.seven.search.yml
rename to core/profiles/standard/config/block.block.seven.search.yml
index 081dfca..63d4c9f 100644
--- a/core/profiles/standard/config/plugin.core.block.seven.search.yml
+++ b/core/profiles/standard/config/block.block.seven.search.yml
@@ -13,6 +13,6 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: 'Search'
+label: 'Search'
 module: search
 weight: '-1'
diff --git a/core/profiles/testing/config/plugin.core.block.stark.admin.yml b/core/profiles/testing/config/block.block.stark.admin.yml
similarity index 96%
rename from core/profiles/testing/config/plugin.core.block.stark.admin.yml
rename to core/profiles/testing/config/block.block.stark.admin.yml
index 960e2cb..0ab86f8 100644
--- a/core/profiles/testing/config/plugin.core.block.stark.admin.yml
+++ b/core/profiles/testing/config/block.block.stark.admin.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: sidebar_first
 weight: '0'
diff --git a/core/profiles/testing/config/plugin.core.block.stark.online.yml b/core/profiles/testing/config/block.block.stark.online.yml
similarity index 93%
rename from core/profiles/testing/config/plugin.core.block.stark.online.yml
rename to core/profiles/testing/config/block.block.stark.online.yml
index 3b3f5c5..a2b070d 100644
--- a/core/profiles/testing/config/plugin.core.block.stark.online.yml
+++ b/core/profiles/testing/config/block.block.stark.online.yml
@@ -5,7 +5,7 @@ seconds_online: '900'
 max_list_count: '10'
 status: '1'
 cache: '-1'
-subject: 'Who''s online'
+label: 'Who''s online'
 visibility:
   path:
     visibility: '0'
diff --git a/core/profiles/testing/config/plugin.core.block.stark.tools.yml b/core/profiles/testing/config/block.block.stark.tools.yml
similarity index 96%
rename from core/profiles/testing/config/plugin.core.block.stark.tools.yml
rename to core/profiles/testing/config/block.block.stark.tools.yml
index 5e8b188..9d160e6 100644
--- a/core/profiles/testing/config/plugin.core.block.stark.tools.yml
+++ b/core/profiles/testing/config/block.block.stark.tools.yml
@@ -12,7 +12,7 @@ visibility:
       article: '0'
       page: '0'
   visibility__active_tab: edit-visibility-path
-subject: ''
+label: ''
 module: system
 region: sidebar_first
 weight: '0'
