diff --git a/core/modules/block/block.api.php b/core/modules/block/block.api.php
index 954402a..7f5269f52 100644
--- a/core/modules/block/block.api.php
+++ b/core/modules/block/block.api.php
@@ -154,8 +154,8 @@ function hook_block_view_BASE_BLOCK_ID_alter(array &$build, \Drupal\Core\Block\B
 function hook_block_access(\Drupal\block\Entity\Block $block, $operation, \Drupal\user\Entity\User $account, $langcode) {
   // Example code that would prevent displaying the 'Powered by Drupal' block in
   // a region different than the footer.
-  if ($operation == 'view' && $block->get('plugin') == 'system_powered_by_block') {
-    return AccessResult::forbiddenIf($block->get('region') != 'footer')->cacheUntilEntityChanges($block);
+  if ($operation == 'view' && $block->getPluginId() == 'system_powered_by_block') {
+    return AccessResult::forbiddenIf($block->getRegion() != 'footer')->cacheUntilEntityChanges($block);
   }
 
   // No opinion.
diff --git a/core/modules/block/block.module b/core/modules/block/block.module
index 39e15ea..49c0126 100644
--- a/core/modules/block/block.module
+++ b/core/modules/block/block.module
@@ -124,7 +124,7 @@ function _block_rehash($theme = NULL) {
       unset($blocks[$block_id]);
       continue;
     }
-    $region = $block->get('region');
+    $region = $block->getRegion();
     $status = $block->status();
     // Disable blocks in invalid regions.
     if (!empty($region) && $region != BlockInterface::BLOCK_REGION_NONE && !isset($regions[$region]) && $status) {
@@ -135,7 +135,7 @@ function _block_rehash($theme = NULL) {
     }
     // Set region to none if not enabled.
     if (!$status && $region != BlockInterface::BLOCK_REGION_NONE) {
-      $block->set('region', BlockInterface::BLOCK_REGION_NONE);
+      $block->setRegion(BlockInterface::BLOCK_REGION_NONE);
       $block->save();
     }
   }
@@ -180,13 +180,11 @@ function block_theme_initialize($theme) {
       else {
         $id = $theme . '_' . $default_theme_block_id;
       }
-      $block = $default_theme_block->createDuplicate();
-      $block->set('id', $id);
-      $block->set('theme', $theme);
+      $block = $default_theme_block->createDuplicate($id, $theme);
       // If the region isn't supported by the theme, assign the block to the
       // theme's default region.
-      if (!isset($regions[$block->get('region')])) {
-        $block->set('region', system_default_region($theme));
+      if (!isset($regions[$block->getRegion()])) {
+        $block->setRegion(system_default_region($theme));
       }
       $block->save();
     }
@@ -303,7 +301,7 @@ function block_user_role_delete($role) {
 function block_menu_delete(Menu $menu) {
   if (!$menu->isSyncing()) {
     foreach (Block::loadMultiple() as $block) {
-      if ($block->get('plugin') == 'system_menu_block:' . $menu->id()) {
+      if ($block->getPluginId() == 'system_menu_block:' . $menu->id()) {
         $block->delete();
       }
     }
diff --git a/core/modules/block/src/BlockForm.php b/core/modules/block/src/BlockForm.php
index 73e7ea4..fe55d94 100644
--- a/core/modules/block/src/BlockForm.php
+++ b/core/modules/block/src/BlockForm.php
@@ -58,7 +58,7 @@ public function form(array $form, FormStateInterface $form_state) {
     $entity = $this->entity;
 
     // Store theme settings in $form_state for use below.
-    if (!$theme = $entity->get('theme')) {
+    if (!$theme = $entity->getTheme()) {
       $theme = $this->config('system.theme')->get('default');
     }
     $form_state->set('block_theme', $theme);
@@ -82,7 +82,7 @@ public function form(array $form, FormStateInterface $form_state) {
     );
 
     // Theme settings.
-    if ($entity->get('theme')) {
+    if ($entity->getTheme()) {
       $form['theme'] = array(
         '#type' => 'value',
         '#value' => $theme,
@@ -112,7 +112,7 @@ public function form(array $form, FormStateInterface $form_state) {
       '#type' => 'select',
       '#title' => $this->t('Region'),
       '#description' => $this->t('Select the region where this block should be displayed.'),
-      '#default_value' => $entity->get('region'),
+      '#default_value' => $entity->getRegion(),
       '#empty_value' => BlockInterface::BLOCK_REGION_NONE,
       '#options' => system_region_list($theme, REGIONS_VISIBLE),
       '#prefix' => '<div id="edit-block-region-wrapper">',
diff --git a/core/modules/block/src/BlockInterface.php b/core/modules/block/src/BlockInterface.php
index 432e799..bb83b34 100644
--- a/core/modules/block/src/BlockInterface.php
+++ b/core/modules/block/src/BlockInterface.php
@@ -33,6 +33,30 @@
   public function getPlugin();
 
   /**
+   * Returns the plugin id.
+   *
+   * @return string
+   *   The plugin id for this block.
+   */
+  public function getPluginId();
+
+  /**
+   * Returns the region this block is placed in.
+   *
+   * @return string
+   *   The region this block is placed in.
+   */
+  public function getRegion();
+
+  /**
+   * Returns the theme id.
+   *
+   * @return string
+   *   The theme id for this block instance.
+   */
+  public function getTheme();
+
+  /**
    * Returns an array of visibility condition configurations.
    *
    * @return array
@@ -40,4 +64,32 @@ public function getPlugin();
    */
   public function getVisibility();
 
+  /**
+   * Returns the weight of this block (used for sorting).
+   *
+   * @return int
+   *   The block weight.
+   */
+  public function getWeight();
+
+  /**
+   * Sets the region this block is placed in.
+   *
+   * @param string $region
+   *   The region to place this block in.
+   *
+   * @return $this
+   */
+  public function setRegion($region);
+
+  /**
+   * Sets the block weight.
+   *
+   * @param int $weight
+   *   The desired weight.
+   *
+   * @return $this
+   */
+  public function setWeight($weight);
+
 }
diff --git a/core/modules/block/src/BlockListBuilder.php b/core/modules/block/src/BlockListBuilder.php
index 1d11f99..1d094d6 100644
--- a/core/modules/block/src/BlockListBuilder.php
+++ b/core/modules/block/src/BlockListBuilder.php
@@ -185,10 +185,10 @@ public function buildForm(array $form, FormStateInterface $form_state) {
     // Build blocks first for each region.
     foreach ($entities as $entity_id => $entity) {
       $definition = $entity->getPlugin()->getPluginDefinition();
-      $blocks[$entity->get('region')][$entity_id] = array(
+      $blocks[$entity->getRegion()][$entity_id] = array(
         'label' => $entity->label(),
         'entity_id' => $entity_id,
-        'weight' => $entity->get('weight'),
+        'weight' => $entity->getWeight(),
         'entity' => $entity,
         'category' => $definition['category'],
       );
@@ -402,9 +402,9 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     $entities = $this->storage->loadMultiple(array_keys($form_state->getValue('blocks')));
     foreach ($entities as $entity_id => $entity) {
       $entity_values = $form_state->getValue(array('blocks', $entity_id));
-      $entity->set('weight', $entity_values['weight']);
-      $entity->set('region', $entity_values['region']);
-      if ($entity->get('region') == BlockInterface::BLOCK_REGION_NONE) {
+      $entity->setWeight($entity_values['weight']);
+      $entity->setRegion($entity_values['region']);
+      if ($entity->getRegion() == BlockInterface::BLOCK_REGION_NONE) {
         $entity->disable();
       }
       else {
diff --git a/core/modules/block/src/BlockViewBuilder.php b/core/modules/block/src/BlockViewBuilder.php
index 8c781c1..6f2a71d 100644
--- a/core/modules/block/src/BlockViewBuilder.php
+++ b/core/modules/block/src/BlockViewBuilder.php
@@ -57,7 +57,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
             'route_parameters' => array('block' => $entity->id()),
           ),
         ),
-        '#weight' => $entity->get('weight'),
+        '#weight' => $entity->getWeight(),
         '#configuration' => $configuration,
         '#plugin_id' => $plugin_id,
         '#base_plugin_id' => $base_id,
diff --git a/core/modules/block/src/Entity/Block.php b/core/modules/block/src/Entity/Block.php
index 6f7f276..04baa7a 100644
--- a/core/modules/block/src/Entity/Block.php
+++ b/core/modules/block/src/Entity/Block.php
@@ -68,7 +68,7 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
    *
    * @var int
    */
-  public $weight;
+  protected $weight;
 
   /**
    * The plugin instance ID.
@@ -85,6 +85,13 @@ class Block extends ConfigEntityBase implements BlockInterface, EntityWithPlugin
   protected $pluginCollection;
 
   /**
+   * The theme that includes the block plugin for this entity.
+   *
+   * @var string
+   */
+  protected $theme;
+
+  /**
    * {@inheritdoc}
    */
   public function getPlugin() {
@@ -112,6 +119,34 @@ public function getPluginCollections() {
   }
 
   /**
+   * {@inheritdoc}
+   */
+  public function getPluginId(){
+    return $this->plugin;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRegion() {
+    return $this->region;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getTheme() {
+    return $this->theme;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getWeight() {
+    return $this->weight;
+  }
+
+  /**
    * Overrides \Drupal\Core\Entity\Entity::label();
    */
   public function label() {
@@ -130,13 +165,13 @@ public function label() {
    */
   public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
     // Separate enabled from disabled.
-    $status = $b->get('status') - $a->get('status');
-    if ($status) {
+    $status = (int) $b->status() - (int) $a->status();
+    if ($status !== 0) {
       return $status;
     }
     // Sort by weight, unless disabled.
-    if ($a->get('region') != static::BLOCK_REGION_NONE) {
-      $weight = $a->get('weight') - $b->get('weight');
+    if ($a->getRegion() != static::BLOCK_REGION_NONE) {
+      $weight = $a->getWeight() - $b->getWeight();
       if ($weight) {
         return $weight;
       }
@@ -190,4 +225,39 @@ public function getVisibility() {
     return $this->getPlugin()->getVisibilityConditions()->getConfiguration();
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function setRegion($region) {
+    $this->region = $region;
+    return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setWeight($weight) {
+      $this->weight = $weight;
+      return $this;
+  }
+
+  /**
+   * {@inheritdoc}
+   *
+   * @param string $new_id
+   *   (optional) Sets a new id on the duplicate block.
+   * @param null $new_theme
+   *   (optional) Sets a the theme on the duplicate block.
+   */
+  public function createDuplicate($new_id = NULL, $new_theme = NULL) {
+    $duplicate = parent::createDuplicate();
+    if (!empty($new_id)) {
+      $duplicate->id = $new_id;
+    }
+    if (!empty($new_theme)) {
+      $duplicate->theme = $new_theme;
+    }
+    return $duplicate;
+  }
+
 }
diff --git a/core/modules/block/src/Plugin/DisplayVariant/FullPageVariant.php b/core/modules/block/src/Plugin/DisplayVariant/FullPageVariant.php
index 7243362..2c77e29 100644
--- a/core/modules/block/src/Plugin/DisplayVariant/FullPageVariant.php
+++ b/core/modules/block/src/Plugin/DisplayVariant/FullPageVariant.php
@@ -155,7 +155,7 @@ protected function getRegionAssignments() {
 
     $full = array();
     foreach ($this->blockStorage->loadByProperties(array('theme' => $this->getTheme())) as $block_id => $block) {
-      $full[$block->get('region')][$block_id] = $block;
+      $full[$block->getRegion()][$block_id] = $block;
     }
 
     // Merge it with the actual values to maintain the region ordering.
diff --git a/core/modules/block/src/Tests/BlockInvalidRegionTest.php b/core/modules/block/src/Tests/BlockInvalidRegionTest.php
index 246684b..43075d1 100644
--- a/core/modules/block/src/Tests/BlockInvalidRegionTest.php
+++ b/core/modules/block/src/Tests/BlockInvalidRegionTest.php
@@ -42,7 +42,7 @@ protected function setUp() {
   function testBlockInInvalidRegion() {
     // Enable a test block and place it in an invalid region.
     $block = $this->drupalPlaceBlock('test_html');
-    $block->set('region', 'invalid_region');
+    $block->setRegion('invalid_region');
     $block->save();
 
     $warning_message = t('The block %info was assigned to the invalid region %region and has been disabled.', array('%info' => $block->id(), '%region' => 'invalid_region'));
@@ -57,7 +57,7 @@ function testBlockInInvalidRegion() {
 
     // Place disabled test block in the invalid region of the default theme.
     $block = Block::load($block->id());
-    $block->set('region', 'invalid_region');
+    $block->setRegion('invalid_region');
     $block->save();
 
     // Clear the cache to check if the warning message is not triggered.
diff --git a/core/modules/block/src/Tests/BlockRenderOrderTest.php b/core/modules/block/src/Tests/BlockRenderOrderTest.php
index b21d5f0..5024afc 100644
--- a/core/modules/block/src/Tests/BlockRenderOrderTest.php
+++ b/core/modules/block/src/Tests/BlockRenderOrderTest.php
@@ -71,8 +71,8 @@ function testBlockRenderOrder() {
 
     $controller = $this->container->get('entity.manager')->getStorage('block');
     foreach ($controller->loadMultiple() as $return_block) {
-      $id = $return_block->get('id');
-      if ($return_block_weight = $return_block->get('weight')) {
+      $id = $return_block->id();
+      if ($return_block_weight = $return_block->getWeight()) {
         $this->assertTrue($test_blocks[$id]['weight'] == $return_block_weight, 'Block weight is set as "' . $return_block_weight  . '" for ' . $id . ' block.');
         $position[$id] = strpos($test_content, drupal_html_class('block-' . $test_blocks[$id]['id']));
       }
diff --git a/core/modules/block/src/Tests/BlockStorageUnitTest.php b/core/modules/block/src/Tests/BlockStorageUnitTest.php
index 5fb4e8b..c886788 100644
--- a/core/modules/block/src/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/src/Tests/BlockStorageUnitTest.php
@@ -120,9 +120,9 @@ protected function loadTests() {
     $this->assertTrue($entity instanceof Block, 'The loaded entity is a Block.');
 
     // Verify several properties of the block.
-    $this->assertEqual($entity->get('region'), '-1');
-    $this->assertTrue($entity->get('status'));
-    $this->assertEqual($entity->get('theme'), 'stark');
+    $this->assertEqual($entity->getRegion(), '-1');
+    $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 1996c9b..9b504d0 100644
--- a/core/modules/block/src/Tests/BlockTest.php
+++ b/core/modules/block/src/Tests/BlockTest.php
@@ -314,7 +314,7 @@ public function testBlockCacheTags() {
     $this->assertIdentical($cache_entry->tags, $expected_cache_tags);
 
     // The "Powered by Drupal" block is modified; verify a cache miss.
-    $block->set('region', 'content');
+    $block->setRegion('content');
     $block->save();
     $this->drupalGet('<front>');
     $this->assertEqual($this->drupalGetHeader('X-Drupal-Cache'), 'MISS');
diff --git a/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/FullPageVariantTest.php b/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/FullPageVariantTest.php
index 1cbcfe5..91c0697 100644
--- a/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/FullPageVariantTest.php
+++ b/core/modules/block/tests/src/Unit/Plugin/DisplayVariant/FullPageVariantTest.php
@@ -108,12 +108,14 @@ public function testBuild() {
         ->method('access')
         ->will($this->returnValue($block_config[0]));
       $block->expects($this->any())
-        ->method('get')
-        ->will($this->returnValueMap(array(
-          array('region', $block_config[1]),
-          array('weight', $block_config[2]),
-          array('status', TRUE),
-        )));
+        ->method('getRegion')
+        ->willReturn($block_config[1]);
+      $block->expects($this->any())
+        ->method('getWeight')
+        ->willReturn($block_config[2]);
+      $block->expects($this->any())
+        ->method('status')
+        ->willReturn(TRUE);
       $blocks[$block_id] = $block;
     }
 
diff --git a/core/modules/language/language.module b/core/modules/language/language.module
index a605360..b0a2b84 100644
--- a/core/modules/language/language.module
+++ b/core/modules/language/language.module
@@ -71,7 +71,7 @@ function language_help($route_name, RouteMatchInterface $route_match) {
       return $output;
 
     case 'entity.block.edit_form':
-      if (($block = $route_match->getParameter('block')) && $block->get('plugin') == 'language_block:language_interface') {
+      if (($block = $route_match->getParameter('block')) && $block->getPluginId() == 'language_block:language_interface') {
         return '<p>' . t('With multiple languages added, registered users can select their preferred language and authors can assign a specific language to content.') . '</p>';
       }
       break;
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
index 4b15b05..53c2bd3 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateBlockTest.php
@@ -88,77 +88,77 @@ public function testBlockMigration() {
     // User blocks
     $test_block_user = $blocks['user'];
     $this->assertNotNull($test_block_user);
-    $this->assertEqual('sidebar_first', $test_block_user->get('region'));
-    $this->assertEqual('bartik', $test_block_user->get('theme'));
+    $this->assertEqual('sidebar_first', $test_block_user->getRegion());
+    $this->assertEqual('bartik', $test_block_user->getTheme());
     $visibility = $test_block_user->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(0, $test_block_user->weight);
+    $this->assertEqual(0, $test_block_user->getWeight());
 
     $test_block_user_1 = $blocks['user_1'];
     $this->assertNotNull($test_block_user_1);
-    $this->assertEqual('sidebar_first', $test_block_user_1->get('region'));
-    $this->assertEqual('bartik', $test_block_user_1->get('theme'));
+    $this->assertEqual('sidebar_first', $test_block_user_1->getRegion());
+    $this->assertEqual('bartik', $test_block_user_1->getTheme());
     $visibility = $test_block_user_1->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(0, $test_block_user_1->weight);
+    $this->assertEqual(0, $test_block_user_1->getWeight());
 
     // Check system block
     $test_block_system = $blocks['system'];
     $this->assertNotNull($test_block_system);
-    $this->assertEqual('footer', $test_block_system->get('region'));
-    $this->assertEqual('bartik', $test_block_system->get('theme'));
+    $this->assertEqual('footer', $test_block_system->getRegion());
+    $this->assertEqual('bartik', $test_block_system->getTheme());
     $visibility = $test_block_system->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-5, $test_block_system->weight);
+    $this->assertEqual(-5, $test_block_system->getWeight());
 
     // Check menu blocks
     $test_block_menu = $blocks['menu'];
     $this->assertNotNull($test_block_menu);
-    $this->assertEqual('header', $test_block_menu->get('region'));
-    $this->assertEqual('bartik', $test_block_menu->get('theme'));
+    $this->assertEqual('header', $test_block_menu->getRegion());
+    $this->assertEqual('bartik', $test_block_menu->getTheme());
     $visibility = $test_block_menu->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-5, $test_block_menu->weight);
+    $this->assertEqual(-5, $test_block_menu->getWeight());
 
     // Check custom blocks
     $test_block_block = $blocks['block'];
     $this->assertNotNull($test_block_block);
-    $this->assertEqual('content', $test_block_block->get('region'));
-    $this->assertEqual('bartik', $test_block_block->get('theme'));
+    $this->assertEqual('content', $test_block_block->getRegion());
+    $this->assertEqual('bartik', $test_block_block->getTheme());
     $visibility = $test_block_block->getVisibility();
     $this->assertEqual(FALSE, $visibility['request_path']['negate']);
     $this->assertEqual('<front>', $visibility['request_path']['pages']);
-    $this->assertEqual(0, $test_block_block->weight);
+    $this->assertEqual(0, $test_block_block->getWeight());
 
     $test_block_block_1 = $blocks['block_1'];
     $this->assertNotNull($test_block_block_1);
-    $this->assertEqual('right', $test_block_block_1->get('region'));
-    $this->assertEqual('bluemarine', $test_block_block_1->get('theme'));
+    $this->assertEqual('right', $test_block_block_1->getRegion());
+    $this->assertEqual('bluemarine', $test_block_block_1->getTheme());
     $visibility = $test_block_block_1->getVisibility();
     $this->assertEqual(FALSE, $visibility['request_path']['negate']);
     $this->assertEqual('node', $visibility['request_path']['pages']);
-    $this->assertEqual(-4, $test_block_block_1->weight);
+    $this->assertEqual(-4, $test_block_block_1->getWeight());
 
     $test_block_block_2 = $blocks['block_2'];
     $this->assertNotNull($test_block_block_2);
-    $this->assertEqual('right', $test_block_block_2->get('region'));
-    $this->assertEqual('test_theme', $test_block_block_2->get('theme'));
+    $this->assertEqual('right', $test_block_block_2->getRegion());
+    $this->assertEqual('test_theme', $test_block_block_2->getTheme());
     $visibility = $test_block_block_2->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-7, $test_block_block_2->weight);
+    $this->assertEqual(-7, $test_block_block_2->getWeight());
 
     $test_block_block_3 = $blocks['block_3'];
     $this->assertNotNull($test_block_block_3);
-    $this->assertEqual('left', $test_block_block_3->get('region'));
-    $this->assertEqual('test_theme', $test_block_block_3->get('theme'));
+    $this->assertEqual('left', $test_block_block_3->getRegion());
+    $this->assertEqual('test_theme', $test_block_block_3->getTheme());
     $visibility = $test_block_block_3->getVisibility();
     $this->assertEqual(TRUE, $visibility['request_path']['negate']);
     $this->assertEqual('', $visibility['request_path']['pages']);
-    $this->assertEqual(-2, $test_block_block_3->weight);
+    $this->assertEqual(-2, $test_block_block_3->getWeight());
   }
 }
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 0d41bba..c901edd 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -128,7 +128,7 @@ function system_help($route_name, RouteMatchInterface $route_match) {
       return '<p>' . t('The uninstall process removes all data related to a module.') . '</p>';
 
     case 'entity.block.edit_form':
-      if (($block = $route_match->getParameter('block')) && $block->get('plugin') == 'system_powered_by_block') {
+      if (($block = $route_match->getParameter('block')) && $block->getPluginId() == 'system_powered_by_block') {
         return '<p>' . t('The <em>Powered by Drupal</em> block is an optional link to the home page of the Drupal project. While there is absolutely no requirement that sites feature this link, it may be used to show support for Drupal.') . '</p>';
       }
       break;
