diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index 97182cb..161fa70 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -374,7 +374,7 @@ public function save(EntityInterface $entity) {
       $this->invokeHook('insert', $entity);
     }
 
-    unset($entity->original);
+    $entity->original = NULL;
 
     return $return;
   }
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
index c7f4275..d45a357 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityBase.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -35,11 +35,76 @@
   const TRANSLATION_CREATED = 2;
 
   /**
+   * @todo Remove this or document it.
+   *
+   * @var \Drupal\Core\Entity\ContentEntityInterface|null
+   */
+  public $original;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $content;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $translation;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var \Drupal\user\UserInterface
+   */
+  public $account;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $rss_elements;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $rss_namespaces;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var boolean
+   */
+  public $_field_view_prepared;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var \Drupal\views\ViewExecutable|null
+   */
+  public $view;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var bool
+   */
+  public $in_preview;
+
+  /**
    * Local cache holding the value of the bundle field.
    *
    * @var string
+   *
+   * @todo Make this protected.
    */
-  protected $bundle;
+  public $bundle;
 
   /**
    * The plain data values of the contained fields.
@@ -688,6 +753,7 @@ protected function initializeTranslation($langcode) {
     // @todo Consider converting these to ArrayObject.
     $translation->values = &$this->values;
     $translation->fields = &$this->fields;
+    $translation->translation = &$this->translation;
     $translation->translations = &$this->translations;
     $translation->enforceIsNew = &$this->enforceIsNew;
     $translation->translationInitialize = FALSE;
@@ -812,11 +878,8 @@ public function updateOriginalValues() {
 
   /**
    * Implements the magic method for getting object properties.
-   *
-   * @todo: A lot of code still uses non-fields (e.g. $entity->content in render
-   *   controllers) by reference. Clean that up.
    */
-  public function &__get($name) {
+  public function __get($name) {
     // If this is an entity field, handle it accordingly. We first check whether
     // a field object has been already created. If not, we create one.
     if (isset($this->fields[$name][$this->activeLangcode])) {
@@ -830,12 +893,9 @@ public function &__get($name) {
       $return = $this->getTranslatedField($name, $this->activeLangcode);
       return $return;
     }
-    // Else directly read/write plain values. That way, non-field entity
-    // properties can always be accessed directly.
-    if (!isset($this->values[$name])) {
-      $this->values[$name] = NULL;
-    }
-    return $this->values[$name];
+    // Non-field properties are not supported.
+    $message = '(@name) is not a field.';
+    throw new \InvalidArgumentException(format_string($message, array('@name' => $name)));
   }
 
   /**
@@ -861,10 +921,10 @@ public function __set($name, $value) {
     elseif ($name == 'translations') {
       $this->translations = $value;
     }
-    // Else directly read/write plain values. That way, fields not yet converted
-    // to the entity field API can always be directly accessed.
+    // Non-field properties are not supported.
     else {
-      $this->values[$name] = $value;
+      $message = '(@name) is not a field.';
+      throw new \InvalidArgumentException(format_string($message, array('@name' => $name)));
     }
   }
 
@@ -875,9 +935,6 @@ public function __isset($name) {
     if ($this->hasField($name)) {
       return $this->get($name)->getValue() !== NULL;
     }
-    else {
-      return isset($this->values[$name]);
-    }
   }
 
   /**
@@ -888,7 +945,8 @@ public function __unset($name) {
       $this->get($name)->setValue(NULL);
     }
     else {
-      unset($this->values[$name]);
+      $message = '(@name) is not a field.';
+      throw new \InvalidArgumentException(format_string($message, array('@name' => $name)));
     }
   }
 
diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
index e137322..1927c6d 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageController.php
@@ -325,7 +325,7 @@ public function save(EntityInterface $entity) {
 
       // Ignore slave server temporarily.
       db_ignore_slave();
-      unset($entity->original);
+      $entity->original = NULL;
 
       return $return;
     }
diff --git a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
index 69bb693..c27f32f 100644
--- a/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
+++ b/core/lib/Drupal/Core/Entity/EntityViewBuilder.php
@@ -230,7 +230,7 @@ public function viewMultiple(array $entities = array(), $view_mode = 'full', $la
 
       $build[$key] = $entity->content;
       // We don't need duplicate rendering info in $entity->content.
-      unset($entity->content);
+      $entity->content = NULL;
 
       $build[$key] += $this->getBuildDefaults($entity, $entity_view_mode, $langcode);
       $this->alterBuild($build[$key], $entity, $display, $entity_view_mode, $langcode);
diff --git a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
index 99d17a5..2c43c8f 100644
--- a/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
+++ b/core/lib/Drupal/Core/Entity/FieldableDatabaseStorageController.php
@@ -607,7 +607,7 @@ public function save(EntityInterface $entity) {
 
       // Ignore slave server temporarily.
       db_ignore_slave();
-      unset($entity->original);
+      $entity->original = NULL;
 
       return $return;
     }
diff --git a/core/lib/Drupal/Core/Field/WidgetBase.php b/core/lib/Drupal/Core/Field/WidgetBase.php
index ffa82d1..bf84df9 100644
--- a/core/lib/Drupal/Core/Field/WidgetBase.php
+++ b/core/lib/Drupal/Core/Field/WidgetBase.php
@@ -258,7 +258,6 @@ protected function formSingleElement(FieldItemListInterface $items, $delta, arra
         'widget' => $this,
         'items' => $items,
         'delta' => $delta,
-        'default' => !empty($entity->field_ui_default_value),
       );
       drupal_alter(array('field_widget_form', 'field_widget_' . $this->getPluginId() . '_form'), $element, $form_state, $context);
     }
diff --git a/core/modules/comment/lib/Drupal/comment/Entity/Comment.php b/core/modules/comment/lib/Drupal/comment/Entity/Comment.php
index 6bcfd95..244442f 100644
--- a/core/modules/comment/lib/Drupal/comment/Entity/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Entity/Comment.php
@@ -183,6 +183,13 @@ class Comment extends ContentEntityBase implements CommentInterface {
   public $thread;
 
   /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $rdf_data;
+
+  /**
    * Initialize the object. Invoked upon construction and wake up.
    */
   protected function init() {
diff --git a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
index 40e3c39..4a9c4da 100644
--- a/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
+++ b/core/modules/entity_reference/lib/Drupal/entity_reference/Plugin/Field/FieldFormatter/EntityReferenceEntityFormatter.php
@@ -97,7 +97,7 @@ public function viewElements(FieldItemListInterface $items) {
 
       if (!empty($item->target_id)) {
         $entity = clone $item->entity;
-        unset($entity->content);
+        $entity->content = NULL;
         $elements[$delta] = entity_view($entity, $view_mode, $item->getLangcode());
 
         if (empty($links) && isset($result[$delta][$target_type][$item->target_id]['links'])) {
diff --git a/core/modules/field/field.deprecated.inc b/core/modules/field/field.deprecated.inc
index 1e63781..cde9e38 100644
--- a/core/modules/field/field.deprecated.inc
+++ b/core/modules/field/field.deprecated.inc
@@ -491,7 +491,7 @@ function field_attach_view(EntityInterface $entity, EntityViewDisplayInterface $
   // Reset the _field_view_prepared flag set in field_attach_prepare_view(),
   // in case the same entity is displayed with different settings later in
   // the request.
-  unset($entity->_field_view_prepared);
+  $entity->_field_view_prepared = FALSE;
 
   return $output;
 }
diff --git a/core/modules/file/lib/Drupal/file/Entity/File.php b/core/modules/file/lib/Drupal/file/Entity/File.php
index 816435b..e7990ea 100644
--- a/core/modules/file/lib/Drupal/file/Entity/File.php
+++ b/core/modules/file/lib/Drupal/file/Entity/File.php
@@ -35,6 +35,13 @@
 class File extends ContentEntityBase implements FileInterface {
 
   /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $file_test;
+
+  /**
    * The plain data values of the contained properties.
    *
    * Define default values.
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
index aa81aee..3afec61 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/MenuLinkStorageController.php
@@ -158,7 +158,7 @@ public function save(EntityInterface $entity) {
 
       // Ignore slave server temporarily.
       db_ignore_slave();
-      unset($entity->original);
+      $entity->original = NULL;
 
       return $return;
     }
diff --git a/core/modules/node/lib/Drupal/node/Entity/Node.php b/core/modules/node/lib/Drupal/node/Entity/Node.php
index c97f949..dc139b2 100644
--- a/core/modules/node/lib/Drupal/node/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Entity/Node.php
@@ -61,6 +61,34 @@
 class Node extends ContentEntityBase implements NodeInterface {
 
   /**
+   * @todo Remove this or document it.
+   *
+   * @var array
+   */
+  public $book;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var \Drupal\Core\Datetime\DrupalDateTime|string
+   */
+  public $date;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var string
+   */
+  public $name;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var \Drupal\menu_link\Entity\MenuLink
+   */
+  public $menu;
+
+  /**
    * Implements Drupal\Core\Entity\EntityInterface::id().
    */
   public function id() {
diff --git a/core/modules/node/lib/Drupal/node/NodeFormController.php b/core/modules/node/lib/Drupal/node/NodeFormController.php
index 1cc58a7..635466b 100644
--- a/core/modules/node/lib/Drupal/node/NodeFormController.php
+++ b/core/modules/node/lib/Drupal/node/NodeFormController.php
@@ -360,7 +360,6 @@ public function submit(array $form, array &$form_state) {
       $node->setRevisionAuthorId(\Drupal::currentUser()->id());
     }
 
-    $node->validated = TRUE;
     foreach (\Drupal::moduleHandler()->getImplementations('node_submit') as $module) {
       $function = $module . '_node_submit';
       $function($node, $form, $form_state);
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
index b284941..5b9f8b6 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTestBase.php
@@ -288,10 +288,13 @@ protected function drupalCreateNode(array $settings = array()) {
       'format' => filter_default_format(),
     );
 
-    $node = entity_create('node', $settings);
+    $node = entity_create('node', array_diff_key($settings, array_flip(array('revision', 'body'))));
     if (!empty($settings['revision'])) {
       $node->setNewRevision();
     }
+    if ($node->hasField('body')) {
+      $node->body = $settings['body'];
+    }
     $node->save();
 
     return $node;
@@ -690,7 +693,7 @@ protected function drupalLogout() {
 
     if ($pass) {
       // @see WebTestBase::drupalUserIsLoggedIn()
-      unset($this->loggedInUser->session_id);
+      $this->loggedInUser->session_id = NULL;
       $this->loggedInUser = FALSE;
       $this->container->set('current_user', drupal_anonymous_user());
     }
diff --git a/core/modules/user/lib/Drupal/user/Entity/User.php b/core/modules/user/lib/Drupal/user/Entity/User.php
index 2954df5..7120b84 100644
--- a/core/modules/user/lib/Drupal/user/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Entity/User.php
@@ -51,6 +51,41 @@
 class User extends ContentEntityBase implements UserInterface {
 
   /**
+   * @todo Remove this or document it.
+   *
+   * @var string
+   */
+  public $user_cancel_method;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var bool
+   */
+  public $user_cancel_notify;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var string
+   */
+  public $password;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var string
+   */
+  public $pass_raw;
+
+  /**
+   * @todo Remove this or document it.
+   *
+   * @var string
+   */
+  public $session_id;
+
+  /**
    * {@inheritdoc}
    */
   public function id() {
