diff --git a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
index 3ccc88d..02bdcbc 100644
--- a/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
+++ b/core/lib/Drupal/Core/Entity/DatabaseStorageControllerNG.php
@@ -141,11 +141,14 @@ protected function buildPropertyQuery(QueryInterface $entity_query, array $value
    * Added mapping from storage records to entities.
    */
   protected function attachLoad(&$queried_entities, $load_revision = FALSE) {
-    // Now map the record values to the according entity properties and
-    // activate compatibility mode.
-    $queried_entities = $this->mapFromStorageRecords($queried_entities, $load_revision);
+    // Now map the record values to the according entity properties, but only if
+    // this did not already happen in an overridden method invoking this.
+    $record = reset($queried_entities);
+    if (is_array($record)) {
+      $queried_entities = $this->mapFromStorageRecords($queried_entities, $load_revision);
+    }
 
-    // Attach fields.
+    // Activate backward-compatibility mode to attach fields.
     if ($this->entityInfo['fieldable']) {
       // Prepare BC compatible entities for field API.
       $bc_entities = array();
diff --git a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
index 8f5e521..995e080 100644
--- a/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
+++ b/core/lib/Drupal/Core/Entity/EntityBCDecorator.php
@@ -72,19 +72,29 @@ public function &__get($name) {
       // avoid them becoming out of sync.
       unset($this->decorated->fields[$name]);
     }
-    // Allow accessing field values in entity default languages other than
-    // LANGUAGE_DEFAULT by mapping the values to LANGUAGE_DEFAULT.
-    $langcode = $this->decorated->language()->langcode;
-    if ($langcode != LANGUAGE_DEFAULT && isset($this->decorated->values[$name]) && is_array($this->decorated->values[$name])) {
-      if (isset($this->decorated->values[$name][LANGUAGE_DEFAULT]) && !isset($this->decorated->values[$name][$langcode])) {
-        $this->decorated->values[$name][$langcode] = &$this->decorated->values[$name][LANGUAGE_DEFAULT];
+    // When accessing values for entity properties that have been converted to
+    // an entity field, provide direct access to the plain value. This makes it
+    // possible to use the BC-decorator with properties; e.g., $node->title.
+    if (!field_info_field($name) && $this->decorated->getPropertyDefinition($name)) {
+      if (!isset($this->decorated->values[$name][LANGUAGE_DEFAULT][0]['value'])) {
+        $this->decorated->values[$name][LANGUAGE_DEFAULT][0]['value'] = NULL;
       }
+      return $this->decorated->values[$name][LANGUAGE_DEFAULT][0]['value'];
     }
-
-    if (!isset($this->decorated->values[$name])) {
-      $this->decorated->values[$name] = NULL;
+    else {
+      // Allow accessing field values in entity default languages other than
+      // LANGUAGE_DEFAULT by mapping the values to LANGUAGE_DEFAULT.
+      $langcode = $this->decorated->language()->langcode;
+      if ($langcode != LANGUAGE_DEFAULT && isset($this->decorated->values[$name]) && is_array($this->decorated->values[$name])) {
+        if (isset($this->decorated->values[$name][LANGUAGE_DEFAULT]) && !isset($this->decorated->values[$name][$langcode])) {
+          $this->decorated->values[$name][$langcode] = &$this->decorated->values[$name][LANGUAGE_DEFAULT];
+        }
+      }
+      if (!isset($this->decorated->values[$name])) {
+        $this->decorated->values[$name] = NULL;
+      }
+      return $this->decorated->values[$name];
     }
-    return $this->decorated->values[$name];
   }
 
   /**
@@ -93,17 +103,25 @@ public function &__get($name) {
    * Directly writes to the plain field values, as done by Drupal 7.
    */
   public function __set($name, $value) {
-    if (is_array($value) && $definition = $this->decorated->getPropertyDefinition($name)) {
-      // If field API sets a value with a langcode in entity language, move it
-      // to LANGUAGE_DEFAULT.
-      foreach ($value as $langcode => $data) {
-        if ($langcode != LANGUAGE_DEFAULT && $langcode == $this->decorated->language()->langcode) {
-          $value[LANGUAGE_DEFAULT] = $data;
-          unset($value[$langcode]);
+    // When updating values for entity properties that have been converted to
+    // an entity field, directly write to the plain value. This makes it
+    // possible to use the BC-decorator with properties; e.g., $node->title.
+    if (!field_info_field($name) && $this->decorated->getPropertyDefinition($name)) {
+      $this->decorated->values[$name][LANGUAGE_DEFAULT][0]['value'] = $value;
+    }
+    else {
+      if (is_array($value) && $definition = $this->decorated->getPropertyDefinition($name)) {
+        // If field API sets a value with a langcode in entity language, move it
+        // to LANGUAGE_DEFAULT.
+        foreach ($value as $langcode => $data) {
+          if ($langcode != LANGUAGE_DEFAULT && $langcode == $this->decorated->language()->langcode) {
+            $value[LANGUAGE_DEFAULT] = $data;
+            unset($value[$langcode]);
+          }
         }
       }
+      $this->decorated->values[$name] = $value;
     }
-    $this->decorated->values[$name] = $value;
     unset($this->decorated->fields[$name]);
   }
 
diff --git a/core/lib/Drupal/Core/Entity/EntityNG.php b/core/lib/Drupal/Core/Entity/EntityNG.php
index 99a29ca..3627745 100644
--- a/core/lib/Drupal/Core/Entity/EntityNG.php
+++ b/core/lib/Drupal/Core/Entity/EntityNG.php
@@ -471,6 +471,12 @@ public function createDuplicate() {
       $uuid = new Uuid();
       $duplicate->{$entity_info['entity_keys']['uuid']}->value = $uuid->generate();
     }
+
+    // Check whether the entity type supports revisions and initialize it if so.
+    if (!empty($entity_info['entity_keys']['revision'])) {
+      $duplicate->{$entity_info['entity_keys']['revision']}->value = NULL;
+    }
+
     return $duplicate;
   }
 
@@ -504,4 +510,5 @@ public function label($langcode = NULL) {
     }
     return $label;
   }
+
 }
diff --git a/core/modules/node/lib/Drupal/node/NodeStorageController.php b/core/modules/node/lib/Drupal/node/NodeStorageController.php
index d855384..6ebd002 100644
--- a/core/modules/node/lib/Drupal/node/NodeStorageController.php
+++ b/core/modules/node/lib/Drupal/node/NodeStorageController.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\node;
 
-use Drupal\Core\Entity\DatabaseStorageController;
+use Drupal\Core\Entity\DatabaseStorageControllerNG;
 use Drupal\Core\Entity\EntityInterface;
 
 /**
@@ -16,31 +16,33 @@
  * This extends the Drupal\Core\Entity\DatabaseStorageController class, adding
  * required special handling for node entities.
  */
-class NodeStorageController extends DatabaseStorageController {
+class NodeStorageController extends DatabaseStorageControllerNG {
 
   /**
    * Overrides Drupal\Core\Entity\DatabaseStorageController::create().
    */
   public function create(array $values) {
-    $node = parent::create($values);
-
-    // Set the created time to now.
-    if (empty($node->created)) {
-      $node->created = REQUEST_TIME;
+    // @todo Handle this through property defaults.
+    if (empty($values['created'])) {
+      $values['created'] = REQUEST_TIME;
     }
-
-    return $node;
+    return parent::create($values);
   }
 
   /**
-   * Overrides Drupal\Core\Entity\DatabaseStorageController::attachLoad().
+   * Overrides Drupal\Core\Entity\DatabaseStorageControllerNG::attachLoad().
    */
   protected function attachLoad(&$nodes, $load_revision = FALSE) {
+    $nodes = $this->mapFromStorageRecords($nodes, $load_revision);
+
     // Create an array of nodes for each content type and pass this to the
     // object type specific callback.
+    // To preserve backward-compatibility we replace the mapped nodes with their
+    // BC decorators.
     $typed_nodes = array();
     foreach ($nodes as $id => $entity) {
-      $typed_nodes[$entity->type][$id] = $entity;
+      $nodes[$id] = $entity->getBCEntity();
+      $typed_nodes[$entity->bundle()][$id] = $nodes[$id];
     }
 
     // Call object type specific callbacks on each typed array of nodes.
@@ -163,4 +165,105 @@ protected function postDelete($nodes) {
       ->condition('nid', $ids, 'IN')
       ->execute();
   }
+
+  /**
+   * Overrides \Drupal\Core\Entity\DataBaseStorageControllerNG::basePropertyDefinitions().
+   */
+  public function baseFieldDefinitions() {
+    $properties['nid'] = array(
+      'label' => t('Node ID'),
+      'description' => t('The node ID.'),
+      'type' => 'integer_field',
+      'read-only' => TRUE,
+    );
+    $properties['uuid'] = array(
+      'label' => t('UUID'),
+      'description' => t('The node UUID.'),
+      'type' => 'string_field',
+      'read-only' => TRUE,
+    );
+    $properties['vid'] = array(
+      'label' => t('Revision ID'),
+      'description' => t('The node revision ID.'),
+      'type' => 'integer_field',
+      'read-only' => TRUE,
+    );
+    $properties['type'] = array(
+      'label' => t('Type'),
+      'description' => t('The node type.'),
+      'type' => 'string_field',
+      'read-only' => TRUE,
+    );
+    $properties['langcode'] = array(
+      'label' => t('Language code'),
+      'description' => t('The node language code.'),
+      'type' => 'language_field',
+    );
+    $properties['title'] = array(
+      'label' => t('Title'),
+      'description' => t('The title of this node, always treated as non-markup plain text.'),
+      'type' => 'string_field',
+    );
+    $properties['uid'] = array(
+      'label' => t('User ID'),
+      'description' => t('The user ID of the node author.'),
+      'type' => 'entityreference_field',
+      'settings' => array('entity type' => 'user'),
+    );
+    $properties['status'] = array(
+      'label' => t('Publishing status'),
+      'description' => t('A boolean indicating whether the node is published.'),
+      'type' => 'boolean_field',
+    );
+    $properties['created'] = array(
+      'label' => t('Created'),
+      'description' => t('The time that the node was created.'),
+      'type' => 'integer_field',
+    );
+    $properties['changed'] = array(
+      'label' => t('Changed'),
+      'description' => t('The time that the node was last edited.'),
+      'type' => 'integer_field',
+    );
+    $properties['comment'] = array(
+      'label' => t('Comment'),
+      'description' => t('Whether comments are allowed on this node: 0 = no, 1 = closed (read only), 2 = open (read/write).'),
+      'type' => 'integer_field',
+    );
+    $properties['promote'] = array(
+      'label' => t('Promote'),
+      'description' => t('A boolean indicating whether the node should be displayed on the front page.'),
+      'type' => 'boolean_field',
+    );
+    $properties['sticky'] = array(
+      'label' => t('Sticky'),
+      'description' => t('A boolean indicating whether the node should be displayed at the top of lists in which it appears.'),
+      'type' => 'boolean_field',
+    );
+    $properties['tnid'] = array(
+      'label' => t('Translation set ID'),
+      'description' => t('The translation set id for this node, which equals the node id of the source post in each set.'),
+      'type' => 'integer_field',
+    );
+    $properties['translate'] = array(
+      'label' => t('Translate'),
+      'description' => t('A boolean indicating whether this translation page needs to be updated.'),
+      'type' => 'boolean_field',
+    );
+    $properties['revision_timestamp'] = array(
+      'label' => t('Revision timestamp'),
+      'description' => t('The time that the current revision was created.'),
+      'type' => 'integer_field',
+      'queryable' => FALSE,
+    );
+    $properties['revision_uid'] = array(
+      'label' => t('Revision user ID'),
+      'description' => t('The user ID of the author of the current revision.'),
+      'type' => 'entityreference_field',
+      'settings' => array('entity type' => 'user'),
+      'queryable' => FALSE,
+    );
+    return $properties;
+  }
+
 }
diff --git a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
index 6cf9fac..25298d0 100644
--- a/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
+++ b/core/modules/node/lib/Drupal/node/Plugin/Core/Entity/Node.php
@@ -8,7 +8,7 @@
 namespace Drupal\node\Plugin\Core\Entity;
 
 use Drupal\Core\Entity\ContentEntityInterface;
-use Drupal\Core\Entity\Entity;
+use Drupal\Core\Entity\EntityNG;
 use Drupal\Core\Annotation\Plugin;
 use Drupal\Core\Annotation\Translation;
 
@@ -56,7 +56,7 @@
  *   }
  * )
  */
-class Node extends Entity implements ContentEntityInterface {
+class Node extends EntityNG implements ContentEntityInterface {
 
   /**
    * The node ID.
@@ -80,7 +80,7 @@ class Node extends Entity implements ContentEntityInterface {
    *
    * @var boolean
    */
-  public $isDefaultRevision = TRUE;
+  public $isDefaultRevision;
 
   /**
    * The node UUID.
@@ -101,7 +101,7 @@ class Node extends Entity implements ContentEntityInterface {
    *
    * @var string
    */
-  public $langcode = LANGUAGE_NOT_SPECIFIED;
+  public $langcode;
 
   /**
    * The node title.
@@ -206,33 +206,54 @@ class Node extends Entity implements ContentEntityInterface {
   public $revision_uid;
 
   /**
-   * Implements Drupal\Core\Entity\EntityInterface::id().
+   * The plain data values of the contained properties.
+   *
+   * Define default values.
+   *
+   * @var array
    */
-  public function id() {
-    return $this->nid;
-  }
+  protected $values = array(
+    'langcode' => array(LANGUAGE_DEFAULT => array(0 => array('value' => LANGUAGE_NOT_SPECIFIED))),
+    'isDefaultRevision' => array(LANGUAGE_DEFAULT => array(0 => array('value' => TRUE))),
+  );
 
   /**
-   * Implements Drupal\Core\Entity\EntityInterface::bundle().
+   * Overrides \Drupal\Core\Entity\EntityNG::init().
    */
-  public function bundle() {
-    return $this->type;
+  protected function init() {
+    parent::init();
+    // We unset all defined properties, so magic getters apply.
+    unset($this->nid);
+    unset($this->vid);
+    unset($this->isDefaultRevision);
+    unset($this->uuid);
+    unset($this->type);
+    unset($this->title);
+    unset($this->uid);
+    unset($this->status);
+    unset($this->created);
+    unset($this->changed);
+    unset($this->comment);
+    unset($this->promote);
+    unset($this->sticky);
+    unset($this->tnid);
+    unset($this->translate);
+    unset($this->revision_timestamp);
+    unset($this->revision_uid);
   }
 
   /**
-   * Overrides Drupal\Core\Entity\Entity::createDuplicate().
+   * Implements Drupal\Core\Entity\EntityInterface::id().
    */
-  public function createDuplicate() {
-    $duplicate = parent::createDuplicate();
-    $duplicate->vid = NULL;
-    return $duplicate;
+  public function id() {
+    return $this->get('nid')->value;
   }
 
   /**
    * Overrides Drupal\Core\Entity\Entity::getRevisionId().
    */
   public function getRevisionId() {
-    return $this->vid;
+    return $this->get('vid')->value;
   }
 
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
index f01d440..ce8f7cf 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityFieldTest.php
@@ -537,4 +537,28 @@ protected function assertComputedProperties($entity_type) {
     $entity = entity_load($entity_type, $entity->id());
     $this->assertEqual($entity->field_test_text->processed, $target, format_string('%entity_type: Text is processed with the default filter.', array('%entity_type' => $entity_type)));
   }
+
+  /**
+   * Tests using the entity BC decorator with entity properties.
+   *
+   * @todo: Remove once the entit BC decorator is removed.
+   * @see \Drupal\Core\Entity\EntityBCDecorator
+   */
+  public function testBCDecorator() {
+    // Test using comment subject via the BC decorator.
+    module_enable(array('node', 'comment'));
+    $node = $this->drupalCreateNode();
+    $comment = entity_create('comment', array(
+      'nid' => $node->nid,
+      'subject' => 'old-value',
+    ));
+    $comment->save();
+
+    // Test reading.
+    $bc_entity = $comment->getBCEntity();
+    $this->assertEqual($bc_entity->subject, 'old-value', 'Accessing entity property via BC decorator.');
+    // Test writing.
+    $bc_entity->subject = 'new';
+    $this->assertEqual($comment->subject->value, 'new', 'Updated entity property via BC decorator.');
+  }
 }
