diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
index 318ad7a..b79c3d2 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigEntityBase.php
@@ -10,6 +10,7 @@
 use Drupal\Component\Plugin\ConfigurablePluginInterface;
 use Drupal\Component\Utility\String;
 use Drupal\Core\Cache\Cache;
+use Drupal\Core\Config\Schema\SchemaIncompleteException;
 use Drupal\Core\Entity\Entity;
 use Drupal\Core\Config\ConfigDuplicateUUIDException;
 use Drupal\Core\Entity\EntityStorageInterface;
@@ -240,20 +241,36 @@ public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b)
    * {@inheritdoc}
    */
   public function toArray() {
-    // Configuration objects do not have a schema. Extract all key names from
-    // class properties.
-    $class_info = new \ReflectionClass($this);
     $properties = array();
-    foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
-      $name = $property->getName();
-      $properties[$name] = $this->get($name);
+    $config_name = $this->getEntityType()->getConfigPrefix() . '.' . $this->id();
+    $definition = $this->getTypedConfig()->getDefinition($config_name);
+    if (!isset($definition['mapping'])) {
+      throw new SchemaIncompleteException(String::format('Incomplete or missing schema for @config_name', array('@config_name' => $config_name)));
+    }
+    $id_key = $this->getEntityType()->getKey('id');
+    foreach (array_keys($definition['mapping']) as $name) {
+      // Special handling for IDs so that computed compound IDs work.
+      // @see \Drupal\entity\EntityDisplayBase::id()
+      if ($name == $id_key) {
+        $properties[$name] = $this->id();
+      }
+      else {
+        $properties[$name] = $this->get($name);
+      }
     }
-    // Add protected dependencies property.
-    $properties['dependencies'] = $this->dependencies;
     return $properties;
   }
 
   /**
+   * Gets the typed config manager.
+   *
+   * @return \Drupal\Core\Config\TypedConfigManagerInterface
+   */
+  protected function getTypedConfig() {
+    return \Drupal::service('config.typed');
+  }
+
+  /**
    * {@inheritdoc}
    */
   public function preSave(EntityStorageInterface $storage) {
diff --git a/core/modules/block/src/Entity/Block.php b/core/modules/block/src/Entity/Block.php
index de6c971..a3a592b 100644
--- a/core/modules/block/src/Entity/Block.php
+++ b/core/modules/block/src/Entity/Block.php
@@ -135,25 +135,6 @@ public function label() {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'theme',
-      'region',
-      'weight',
-      'plugin',
-      'settings',
-      'visibility',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
    * Sorts active blocks by weight; sorts inactive blocks by name.
    */
   public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
diff --git a/core/modules/block/src/Tests/BlockStorageUnitTest.php b/core/modules/block/src/Tests/BlockStorageUnitTest.php
index 65d67f6..e0dc29c 100644
--- a/core/modules/block/src/Tests/BlockStorageUnitTest.php
+++ b/core/modules/block/src/Tests/BlockStorageUnitTest.php
@@ -91,12 +91,12 @@ protected function createTests() {
     // Ensure that default values are filled in.
     $expected_properties = array(
       'id' => 'test_block',
-      'weight' => NULL,
-      'status' => TRUE,
-      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
-      'dependencies' => array('module' => array('block_test'), 'theme' => array('stark')),
       'theme' => 'stark',
       'region' => '-1',
+      'weight' => NULL,
+      'provider' => NULL,
+      'status' => TRUE,
+      'visibility' => NULL,
       'plugin' => 'test_html',
       'settings' => array(
         'id' => 'test_html',
@@ -108,7 +108,8 @@ protected function createTests() {
           'contexts' => array(),
         ),
       ),
-      'visibility' => NULL,
+      'langcode' => \Drupal::languageManager()->getDefaultLanguage()->id,
+      'dependencies' => array('module' => array('block_test'), 'theme' => array('stark')),
     );
     $this->assertIdentical($actual_properties, $expected_properties);
 
diff --git a/core/modules/breakpoint/src/Entity/BreakpointGroup.php b/core/modules/breakpoint/src/Entity/BreakpointGroup.php
index 02d6e29..0b585e2 100644
--- a/core/modules/breakpoint/src/Entity/BreakpointGroup.php
+++ b/core/modules/breakpoint/src/Entity/BreakpointGroup.php
@@ -214,29 +214,6 @@ public function getBreakpointById($id) {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $names = array(
-      'id',
-      'uuid',
-      'name',
-      'label',
-      'breakpoint_ids',
-      'source',
-      'sourceType',
-      'status',
-      'langcode',
-      'dependencies',
-    );
-    $properties = array();
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function calculateDependencies() {
     parent::calculateDependencies();
 
diff --git a/core/modules/config/src/Tests/ConfigEntityTest.php b/core/modules/config/src/Tests/ConfigEntityTest.php
index f3ca94f..776c6ee 100644
--- a/core/modules/config/src/Tests/ConfigEntityTest.php
+++ b/core/modules/config/src/Tests/ConfigEntityTest.php
@@ -47,7 +47,6 @@ function testCRUD() {
     $default_langcode = \Drupal::languageManager()->getDefaultLanguage()->id;
     // Verify default properties on a newly created empty entity.
     $empty = entity_create('config_test');
-    $this->assertIdentical($empty->id, NULL);
     $this->assertTrue($empty->uuid);
     $this->assertIdentical($empty->label, NULL);
     $this->assertIdentical($empty->style, NULL);
@@ -106,7 +105,6 @@ function testCRUD() {
       'label' => $this->randomString(),
       'style' => $this->randomName(),
     ));
-    $this->assertIdentical($config_test->id, $expected['id']);
     $this->assertTrue($config_test->uuid);
     $this->assertNotEqual($config_test->uuid, $empty->uuid);
     $this->assertIdentical($config_test->label, $expected['label']);
@@ -160,7 +158,7 @@ function testCRUD() {
     try {
       $id_length_config_test->save();
       $this->pass(String::format("config_test entity with ID length @length was saved.", array(
-        '@length' => strlen($id_length_config_test->id))
+        '@length' => strlen($id_length_config_test->id()))
       ));
     }
     catch (ConfigEntityIdLengthException $e) {
@@ -174,7 +172,7 @@ function testCRUD() {
     try {
       $id_length_config_test->save();
       $this->pass(String::format("config_test entity with ID length @length was saved.", array(
-        '@length' => strlen($id_length_config_test->id),
+        '@length' => strlen($id_length_config_test->id()),
       )));
     }
     catch (ConfigEntityIdLengthException $e) {
@@ -188,13 +186,13 @@ function testCRUD() {
     try {
       $status = $id_length_config_test->save();
       $this->fail(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max saved successfully", array(
-        '@length' => strlen($id_length_config_test->id),
+        '@length' => strlen($id_length_config_test->id()),
         '@max' => static::MAX_ID_LENGTH,
       )));
     }
     catch (ConfigEntityIdLengthException $e) {
       $this->pass(String::format("config_test entity with ID length @length exceeding the maximum allowed length of @max failed to save", array(
-        '@length' => strlen($id_length_config_test->id),
+        '@length' => strlen($id_length_config_test->id()),
         '@max' => static::MAX_ID_LENGTH,
       )));
     }
@@ -222,7 +220,7 @@ function testCRUD() {
       $this->assertIdentical($config_test->getOriginalId(), $old_id);
 
       // Rename.
-      $config_test->id = $new_id;
+      $config_test->set('id', $new_id);
       $this->assertIdentical($config_test->id(), $new_id);
       $status = $config_test->save();
       $this->assertIdentical($status, SAVED_UPDATED);
diff --git a/core/modules/config/tests/config_test/config/schema/config_test.schema.yml b/core/modules/config/tests/config_test/config/schema/config_test.schema.yml
index 6a585d3..33662e6 100644
--- a/core/modules/config/tests/config_test/config/schema/config_test.schema.yml
+++ b/core/modules/config/tests/config_test/config/schema/config_test.schema.yml
@@ -1,12 +1,11 @@
 # Schema for the configuration files of the Configuration Test module.
 
-config_test.dynamic.*:
+config_test_dynamic:
   type: mapping
-  label: 'Config test entity'
   mapping:
     id:
       type: string
-      label: 'Machine name'
+      label: 'ID'
     label:
       type: label
       label: 'Label'
@@ -15,20 +14,22 @@ config_test.dynamic.*:
       label: 'Weight'
     style:
       type: string
-      label: 'Image style'
-    protected_property:
+      label: 'style'
+    test_dependencies:
+      type: config_dependencies
+      label: 'Configuration dependencies'
+    status:
+      type: boolean
+      label: 'Status'
+    uuid:
       type: string
-      label: 'Protected property'
-
-config_test_dynamic:
-  type: config_entity
-  mapping:
-    weight:
-      type: integer
-      label: 'Weight'
-    style:
+      label: 'UUID'
+    langcode:
       type: string
-      label: 'style'
+      label: 'Default language'
+    dependencies:
+      type: config_dependencies
+      label: 'Configuration dependencies'
     protected_property:
       type: string
       label: 'Protected property'
@@ -41,6 +42,36 @@ config_test.dynamic.*.*:
   type: config_test_dynamic
   label: 'Config test dynamic settings'
 
+config_test.query.*:
+  type: mapping
+  mapping:
+    id:
+      type: string
+      label: 'ID'
+    uuid:
+      type: string
+      label: 'UUID'
+    label:
+      type: label
+      label: 'Label'
+    array:
+      type: sequence
+      label: 'Array'
+      sequence:
+        - type: string
+    number:
+      type: integer
+      label: 'number'
+    status:
+      type: boolean
+      label: 'Status'
+    langcode:
+      type: string
+      label: 'Default language'
+    dependencies:
+      type: config_dependencies
+      label: 'Configuration dependencies'
+
 config_test.types:
   type: mapping
   label: 'Configuration type'
diff --git a/core/modules/config/tests/config_test/src/Entity/ConfigTest.php b/core/modules/config/tests/config_test/src/Entity/ConfigTest.php
index 07ec50a..b5f2dea 100644
--- a/core/modules/config/tests/config_test/src/Entity/ConfigTest.php
+++ b/core/modules/config/tests/config_test/src/Entity/ConfigTest.php
@@ -48,7 +48,7 @@ class ConfigTest extends ConfigEntityBase implements ConfigTestInterface {
    *
    * @var string
    */
-  public $id;
+  protected $id;
 
   /**
    * The human-readable name of the configuration entity.
@@ -86,20 +86,6 @@ class ConfigTest extends ConfigEntityBase implements ConfigTestInterface {
   protected $protected_property;
 
   /**
-   * {@inheritdoc}
-   */
-  public function toArray() {
-    $properties = parent::toArray();
-    $protected_names = array(
-      'protected_property',
-    );
-    foreach ($protected_names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
    * Overrides \Drupal\Core\Config\Entity\ConfigEntityBase::sort().
    */
   public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b) {
diff --git a/core/modules/editor/src/Entity/Editor.php b/core/modules/editor/src/Entity/Editor.php
index d555db7..29f7350 100644
--- a/core/modules/editor/src/Entity/Editor.php
+++ b/core/modules/editor/src/Entity/Editor.php
@@ -176,21 +176,4 @@ public function setImageUploadSettings(array $image_upload_settings) {
     return $this;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'format',
-      'editor',
-      'settings',
-      'image_upload',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
 }
diff --git a/core/modules/entity/config/schema/entity.schema.yml b/core/modules/entity/config/schema/entity.schema.yml
index 4583093..6f53272 100644
--- a/core/modules/entity/config/schema/entity.schema.yml
+++ b/core/modules/entity/config/schema/entity.schema.yml
@@ -80,9 +80,12 @@ entity.form_display.*.*.*:
     mode:
       type: string
       label: 'View or form mode machine name'
+    status:
+      type: boolean
+      label: 'Enabled'
     content:
       type: sequence
-      label: 'Field form display formatters'
+      label: 'Field display formatters'
       sequence:
         - type: entity_form_display.field.[type]
     hidden:
@@ -91,6 +94,9 @@ entity.form_display.*.*.*:
       sequence:
         - type: boolean
           label: 'Component'
+    dependencies:
+      type: config_dependencies
+      label: 'Dependencies'
 
 # Default schema for entity display field with undefined type.
 entity_view_display.field.*:
diff --git a/core/modules/entity/src/EntityDisplayBase.php b/core/modules/entity/src/EntityDisplayBase.php
index 34dc815..a9b99d2 100644
--- a/core/modules/entity/src/EntityDisplayBase.php
+++ b/core/modules/entity/src/EntityDisplayBase.php
@@ -200,23 +200,7 @@ public function postSave(EntityStorageInterface $storage, $update = TRUE) {
    * {@inheritdoc}
    */
   public function toArray() {
-    $names = array(
-      'uuid',
-      'targetEntityType',
-      'bundle',
-      'mode',
-      'content',
-      'hidden',
-      'status',
-      'dependencies'
-    );
-    $properties = array(
-      'id' => $this->id(),
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-
+    $properties = parent::toArray();
     // Do not store options for fields whose display is not set to be
     // configurable.
     foreach ($this->getFieldDefinitions() as $field_name => $definition) {
diff --git a/core/modules/field/src/Entity/FieldConfig.php b/core/modules/field/src/Entity/FieldConfig.php
index 3f5b787..7336e70 100644
--- a/core/modules/field/src/Entity/FieldConfig.php
+++ b/core/modules/field/src/Entity/FieldConfig.php
@@ -226,34 +226,6 @@ public function id() {
   }
 
   /**
-   * {@inheritdoc}
-   */
-  public function toArray() {
-    $names = array(
-      'uuid',
-      'status',
-      'langcode',
-      'name',
-      'entity_type',
-      'type',
-      'settings',
-      'module',
-      'locked',
-      'cardinality',
-      'translatable',
-      'indexes',
-      'dependencies',
-    );
-    $properties = array(
-      'id' => $this->id(),
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
    * Overrides \Drupal\Core\Entity\Entity::preSave().
    *
    * @throws \Drupal\field\FieldException
@@ -725,7 +697,10 @@ public function entityCount($as_bool = FALSE) {
    */
   public function __sleep() {
     // Only serialize properties from self::toArray().
-    return array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
+    $properties = array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
+    // Serialize $entityTypeId property so that toArray() works when waking up.
+    $properties[] = 'entityTypeId';
+    return $properties;
   }
 
   /**
diff --git a/core/modules/field/src/Entity/FieldInstanceConfig.php b/core/modules/field/src/Entity/FieldInstanceConfig.php
index ab7dd47..b315f40 100644
--- a/core/modules/field/src/Entity/FieldInstanceConfig.php
+++ b/core/modules/field/src/Entity/FieldInstanceConfig.php
@@ -286,29 +286,7 @@ public function id() {
    * {@inheritdoc}
    */
   public function toArray() {
-    $names = array(
-      'uuid',
-      'status',
-      'langcode',
-      'field_uuid',
-      'field_name',
-      'entity_type',
-      'bundle',
-      'label',
-      'description',
-      'required',
-      'default_value',
-      'default_value_function',
-      'settings',
-      'dependencies',
-    );
-    $properties = array(
-      'id' => $this->id(),
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-
+    $properties = parent::toArray();
     // Additionally, include the field type, that is needed to be able to
     // generate the field-type-dependant parts of the config schema.
     if (isset($this->field->type)) {
@@ -657,7 +635,10 @@ public function targetBundle() {
    */
   public function __sleep() {
     // Only serialize properties from self::toArray().
-    return array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
+    $properties = array_keys(array_intersect_key($this->toArray(), get_object_vars($this)));
+    // Serialize $entityTypeId property so that toArray() works when waking up.
+    $properties[] = 'entityTypeId';
+    return $properties;
   }
 
   /**
diff --git a/core/modules/filter/src/Entity/FilterFormat.php b/core/modules/filter/src/Entity/FilterFormat.php
index 6f5f807..1a915d7 100644
--- a/core/modules/filter/src/Entity/FilterFormat.php
+++ b/core/modules/filter/src/Entity/FilterFormat.php
@@ -169,13 +169,9 @@ public function setFilterConfig($instance_id, array $configuration) {
    */
   public function toArray() {
     $properties = parent::toArray();
-    // @todo Make self::$weight and self::$cache protected and add them here.
-    $names = array(
-      'filters',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
+    // The 'roles' property is only used during install and should never
+    // actually be saved.
+    unset($properties['roles']);
     return $properties;
   }
 
diff --git a/core/modules/image/src/Entity/ImageStyle.php b/core/modules/image/src/Entity/ImageStyle.php
index 9dbe17f..843e522 100644
--- a/core/modules/image/src/Entity/ImageStyle.php
+++ b/core/modules/image/src/Entity/ImageStyle.php
@@ -357,20 +357,6 @@ public function saveImageEffect(array $configuration) {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'effects',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getReplacementID() {
     return $this->get('replacementID');
   }
diff --git a/core/modules/migrate/src/Entity/Migration.php b/core/modules/migrate/src/Entity/Migration.php
index 5adea09..c892ccb 100644
--- a/core/modules/migrate/src/Entity/Migration.php
+++ b/core/modules/migrate/src/Entity/Migration.php
@@ -339,4 +339,18 @@ public function checkRequirements() {
     return TRUE;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function toArray() {
+    // @todo Remove once migration config entities have schema
+    //   https://drupal.org/node/2183957.
+    $class_info = new \ReflectionClass($this);
+    foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
+      $name = $property->getName();
+      $properties[$name] = $this->get($name);
+    }
+    return $properties;
+  }
+
 }
diff --git a/core/modules/rdf/src/Entity/RdfMapping.php b/core/modules/rdf/src/Entity/RdfMapping.php
index e5783b7..76607ec 100644
--- a/core/modules/rdf/src/Entity/RdfMapping.php
+++ b/core/modules/rdf/src/Entity/RdfMapping.php
@@ -136,30 +136,6 @@ public function id() {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $names = array(
-      'uuid',
-      'targetEntityType',
-      'bundle',
-      'types',
-      'fieldMappings',
-    );
-    $properties = array(
-      'id' => $this->id(),
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    if (!empty($this->dependencies)) {
-      // Add protected dependencies property if set.
-      $properties['dependencies'] = $this->dependencies;
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function calculateDependencies() {
     parent::calculateDependencies();
     $entity_type = \Drupal::entityManager()->getDefinition($this->targetEntityType);
diff --git a/core/modules/responsive_image/src/Entity/ResponsiveImageMapping.php b/core/modules/responsive_image/src/Entity/ResponsiveImageMapping.php
index d94d376..4a9a369 100644
--- a/core/modules/responsive_image/src/Entity/ResponsiveImageMapping.php
+++ b/core/modules/responsive_image/src/Entity/ResponsiveImageMapping.php
@@ -189,24 +189,6 @@ public function hasMappings() {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $names = array(
-      'id',
-      'uuid',
-      'label',
-      'mappings',
-      'breakpointGroup',
-    );
-    $properties = array();
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function setMappings(array $mappings) {
     $this->set('mappings', $mappings);
     return $this;
diff --git a/core/modules/search/src/Entity/SearchPage.php b/core/modules/search/src/Entity/SearchPage.php
index f1b92cd..7341221 100644
--- a/core/modules/search/src/Entity/SearchPage.php
+++ b/core/modules/search/src/Entity/SearchPage.php
@@ -169,23 +169,6 @@ public function getWeight() {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'path',
-      'weight',
-      'plugin',
-      'configuration',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function postCreate(EntityStorageInterface $storage) {
     parent::postCreate($storage);
 
diff --git a/core/modules/system/src/Entity/Action.php b/core/modules/system/src/Entity/Action.php
index 642933a..e48f335 100644
--- a/core/modules/system/src/Entity/Action.php
+++ b/core/modules/system/src/Entity/Action.php
@@ -148,20 +148,4 @@ public static function sort(ConfigEntityInterface $a, ConfigEntityInterface $b)
     return parent::sort($a, $b);
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'type',
-      'plugin',
-      'configuration',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
 }
diff --git a/core/modules/system/src/Entity/DateFormat.php b/core/modules/system/src/Entity/DateFormat.php
index 360c6b5..766ebf9 100644
--- a/core/modules/system/src/Entity/DateFormat.php
+++ b/core/modules/system/src/Entity/DateFormat.php
@@ -70,21 +70,6 @@ class DateFormat extends ConfigEntityBase implements DateFormatInterface {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'locked',
-      'pattern',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function getPattern() {
     return $this->pattern;
   }
diff --git a/core/modules/system/src/Entity/Menu.php b/core/modules/system/src/Entity/Menu.php
index 2ea8dd1..756728f 100644
--- a/core/modules/system/src/Entity/Menu.php
+++ b/core/modules/system/src/Entity/Menu.php
@@ -60,22 +60,6 @@ class Menu extends ConfigEntityBase implements MenuInterface {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $properties = parent::toArray();
-    // @todo Make $description protected and include it here, see
-    //   https://drupal.org/node/2030645.
-    $names = array(
-      'locked',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function isLocked() {
     return (bool) $this->locked;
   }
diff --git a/core/modules/tour/src/Entity/Tour.php b/core/modules/tour/src/Entity/Tour.php
index 1361942..d8271ac 100644
--- a/core/modules/tour/src/Entity/Tour.php
+++ b/core/modules/tour/src/Entity/Tour.php
@@ -123,21 +123,6 @@ public function getTips() {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $properties = parent::toArray();
-    $names = array(
-      'routes',
-      'tips',
-    );
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function hasMatchingRoute($route_name, $route_params) {
     if (!isset($this->keyedRoutes)) {
       $this->keyedRoutes = array();
diff --git a/core/modules/views/src/Entity/View.php b/core/modules/views/src/Entity/View.php
index 87a5674..e114e67 100644
--- a/core/modules/views/src/Entity/View.php
+++ b/core/modules/views/src/Entity/View.php
@@ -241,32 +241,6 @@ public function &getDisplay($display_id) {
   /**
    * {@inheritdoc}
    */
-  public function toArray() {
-    $names = array(
-      'base_field',
-      'base_table',
-      'core',
-      'description',
-      'status',
-      'display',
-      'label',
-      'module',
-      'id',
-      'tag',
-      'uuid',
-      'langcode',
-      'dependencies',
-    );
-    $properties = array();
-    foreach ($names as $name) {
-      $properties[$name] = $this->get($name);
-    }
-    return $properties;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function calculateDependencies() {
     parent::calculateDependencies();
 
diff --git a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
index 4f718fc..a824b3a 100644
--- a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityBaseUnitTest.php
@@ -86,6 +86,13 @@ class ConfigEntityBaseUnitTest extends UnitTestCase {
   protected $cacheBackend;
 
   /**
+   * The mocked typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $typedConfigManager;
+
+  /**
    * {@inheritdoc}
    */
   public static function getInfo() {
@@ -129,11 +136,14 @@ public function setUp() {
 
     $this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
 
+    $this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
+
     $container = new ContainerBuilder();
     $container->set('entity.manager', $this->entityManager);
     $container->set('uuid', $this->uuid);
     $container->set('language_manager', $this->languageManager);
     $container->set('cache.test', $this->cacheBackend);
+    $container->set('config.typed', $this->typedConfigManager);
     $container->setParameter('cache_bins', array('cache.test' => 'test'));
     \Drupal::setContainer($container);
 
@@ -431,14 +441,21 @@ public function testSort() {
    * @covers ::toArray
    */
   public function testToArray() {
+    $this->typedConfigManager->expects($this->once())
+      ->method('getDefinition')
+      ->will($this->returnValue(array('mapping' => array('id' => '', 'dependencies' => ''))));
     $properties = $this->entity->toArray();
     $this->assertInternalType('array', $properties);
-    $class_info = new \ReflectionClass($this->entity);
-    foreach ($class_info->getProperties(\ReflectionProperty::IS_PUBLIC) as $property) {
-      $name = $property->getName();
-      $this->assertArrayHasKey($name, $properties);
-      $this->assertSame($this->entity->get($name), $properties[$name]);
-    }
+    $this->assertEquals(array('id' => $this->entity->id(), 'dependencies' => array()), $properties);
+  }
+
+  /**
+   * @covers ::toArray
+   *
+   * @expectedException \Drupal\Core\Config\Schema\SchemaIncompleteException
+   */
+  public function testToArrayFallback() {
+    $this->entity->toArray();
   }
 
 }
diff --git a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityStorageTest.php b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityStorageTest.php
index 37019f5..12c4823 100644
--- a/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityStorageTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/Entity/ConfigEntityStorageTest.php
@@ -98,6 +98,13 @@ class ConfigEntityStorageTest extends UnitTestCase {
   protected $cacheBackend;
 
   /**
+   * The mocked typed config manager.
+   *
+   * @var \Drupal\Core\Config\TypedConfigManagerInterface|\PHPUnit_Framework_MockObject_MockObject
+   */
+  protected $typedConfigManager;
+
+  /**
    * {@inheritdoc}
    */
   public static function getInfo() {
@@ -167,8 +174,13 @@ protected function setUp() {
 
     $this->cacheBackend = $this->getMock('Drupal\Core\Cache\CacheBackendInterface');
 
+    $this->typedConfigManager = $this->getMock('Drupal\Core\Config\TypedConfigManagerInterface');
+    $this->typedConfigManager->expects($this->any())
+      ->method('getDefinition')
+      ->will($this->returnValue(array('mapping' => array('id' => '', 'uuid' => '', 'dependencies' => ''))));
     $container = new ContainerBuilder();
     $container->set('entity.manager', $this->entityManager);
+    $container->set('config.typed', $this->typedConfigManager);
     $container->set('cache.test', $this->cacheBackend);
     $container->setParameter('cache_bins', array('cache.test' => 'test'));
     \Drupal::setContainer($container);
@@ -242,7 +254,7 @@ public function testSaveInsert(EntityInterface $entity) {
     $config_object->expects($this->atLeastOnce())
       ->method('isNew')
       ->will($this->returnValue(TRUE));
-    $config_object->expects($this->exactly(4))
+    $config_object->expects($this->exactly(3))
       ->method('set');
     $config_object->expects($this->once())
       ->method('save');
@@ -301,7 +313,7 @@ public function testSaveUpdate(EntityInterface $entity) {
     $config_object->expects($this->atLeastOnce())
       ->method('isNew')
       ->will($this->returnValue(FALSE));
-    $config_object->expects($this->exactly(4))
+    $config_object->expects($this->exactly(3))
       ->method('set');
     $config_object->expects($this->once())
       ->method('save');
@@ -361,7 +373,7 @@ public function testSaveRename(ConfigEntityInterface $entity) {
     $config_object->expects($this->atLeastOnce())
       ->method('isNew')
       ->will($this->returnValue(FALSE));
-    $config_object->expects($this->exactly(4))
+    $config_object->expects($this->exactly(3))
       ->method('set');
     $config_object->expects($this->once())
       ->method('save');
