diff --git a/core/modules/node/lib/Drupal/node/NodeBCDecorator.php b/core/modules/node/lib/Drupal/node/NodeBCDecorator.php
new file mode 100644
index 0000000..b15ce4d
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/NodeBCDecorator.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\node\NodeBCDecorator.
+ */
+
+namespace Drupal\node;
+
+use Drupal\Core\Entity\EntityBCDecorator;
+
+/**
+ * Defines the node specific entity BC decorator.
+ */
+class NodeBCDecorator extends EntityBCDecorator implements NodeInterface {
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getCreated() {
+    return $this->decorated->getCreated();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChanged() {
+    return $this->decorated->getChanged();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getComment() {
+    return $this->decorated->getComment();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isPromoted() {
+    return $this->decorated->isPromoted();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isSticky() {
+    return $this->decorated->isSticky();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getUid() {
+    return $this->decorated->getUid();
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isPublished() {
+    return $this->decorated->isPublished();
+  }
+
+}
diff --git a/core/modules/node/lib/Drupal/node/NodeInterface.php b/core/modules/node/lib/Drupal/node/NodeInterface.php
index 7999675..00dc694 100644
--- a/core/modules/node/lib/Drupal/node/NodeInterface.php
+++ b/core/modules/node/lib/Drupal/node/NodeInterface.php
@@ -14,4 +14,59 @@
  */
 interface NodeInterface extends ContentEntityInterface {
 
+  /**
+   * The node creation timestamp.
+   *
+   * @return int
+   */
+  public function getCreated();
+
+  /**
+   * The node modification timestamp.
+   *
+   * @return int
+   */
+  public function getChanged();
+
+  /**
+   * The node comment status indicator.
+   *
+   * COMMENT_NODE_HIDDEN => no comments
+   * COMMENT_NODE_CLOSED => comments are read-only
+   * COMMENT_NODE_OPEN => open (read/write)
+   *
+   * @var int
+   */
+  public function getComment();
+
+  /**
+   * The node promotion status.
+   *
+   * @var bool
+   */
+  public function isPromoted();
+
+  /**
+   * The node sticky status.
+   *
+   * @var bool
+   */
+  public function isSticky();
+
+  /**
+   * The node owner's user ID.
+   *
+   * @var int
+   */
+  public function getUid();
+
+  /**
+   * The node published status indicator.
+   *
+   * Unpublished nodes are only visible to their authors and to administrators.
+   *
+   * @var bool
+   */
+  public function isPublished();
+
 }
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 fc4da34..9e9142c 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
@@ -11,6 +11,7 @@
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\node\NodeInterface;
+use Drupal\node\NodeBCDecorator;
 
 /**
  * Defines the node entity class.
@@ -196,6 +197,55 @@ class Node extends EntityNG implements NodeInterface {
   public $log;
 
   /**
+   * {@inheritdoc}
+   */
+  public function getCreated() {
+    return $this->get('created')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getChanged() {
+    return $this->get('changed')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getComment() {
+    return $this->get('comment')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isPromoted() {
+    return (bool) $this->get('promote')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isSticky() {
+    return (bool) $this->get('sticky')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isPublished() {
+    return (bool) $this->get('status')->value;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getUid() {
+    return $this->get('uid')->value;
+  }
+
+  /**
    * Overrides \Drupal\Core\Entity\EntityNG::init().
    */
   protected function init() {
@@ -234,4 +284,15 @@ public function getRevisionId() {
     return $this->get('vid')->value;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  public function getBCEntity() {
+    if (!isset($this->bcEntity)) {
+      $this->getPropertyDefinitions();
+      $this->bcEntity = new NodeBCDecorator($this, $this->fieldDefinitions);
+    }
+    return $this->bcEntity;
+  }
+
 }
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 30161a2..f17d18a 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -133,7 +133,7 @@ function node_help($path, $arg) {
 
     case 'node/%/edit':
       $node = node_load($arg[1]);
-      $type = node_type_load($node->type);
+      $type = node_type_load($node->bundle());
       return (!empty($type->help) ? '<p>' . filter_xss_admin($type->help) . '</p>' : '');
   }
 
@@ -220,7 +220,7 @@ function node_entity_display_alter(EntityDisplay $display, $context) {
  */
 function node_uri(EntityInterface $node) {
   return array(
-    'path' => 'node/' . $node->nid->value,
+    'path' => 'node/' . $node->id(),
   );
 }
 
@@ -264,7 +264,7 @@ function node_title_list($result, $title = NULL) {
   $num_rows = FALSE;
   foreach ($result as $node) {
     // Do not use $node->label() here, because $node comes from the database.
-    $items[] = l($node->title, 'node/' . $node->nid, !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());
+    $items[] = l($node->label(), 'node/' . $node->id(), !empty($node->comment_count) ? array('attributes' => array('title' => format_plural($node->comment_count, '1 comment', '@count comments'))) : array());
     $num_rows = TRUE;
   }
 
@@ -377,7 +377,7 @@ function node_type_get_label($name) {
  */
 function node_get_type_label(EntityInterface $node) {
   $types = _node_types_build()->names;
-  return isset($types[$node->type]) ? $types[$node->type] : FALSE;
+  return isset($types[$node->bundle()]) ? $types[$node->bundle()] : FALSE;
 }
 
 /**
@@ -886,7 +886,7 @@ function node_hook($type, $hook) {
  *   The returned value of the invoked hook.
  */
 function node_invoke(EntityInterface $node, $hook, $a2 = NULL, $a3 = NULL, $a4 = NULL) {
-  if ($function = node_hook($node->type, $hook)) {
+  if ($function = node_hook($node->bundle(), $hook)) {
     return $function($node, $a2, $a3, $a4);
   }
 }
@@ -1017,11 +1017,11 @@ function node_show(EntityInterface $node, $message = FALSE) {
   }
 
   // For markup consistency with other pages, use node_view_multiple() rather than node_view().
-  $nodes = array('nodes' => node_view_multiple(array($node->nid => $node), 'full'));
+  $nodes = array('nodes' => node_view_multiple(array($node->id() => $node), 'full'));
 
   // Update the history table, stating that this user viewed this node.
   if (module_exists('history')) {
-    history_write($node->nid);
+    history_write($node->id());
   }
 
   return $nodes;
@@ -1038,7 +1038,7 @@ function node_show(EntityInterface $node, $message = FALSE) {
  */
 function node_is_page(EntityInterface $node) {
   $page_node = menu_get_object();
-  return (!empty($page_node) ? $page_node->nid == $node->nid : FALSE);
+  return (!empty($page_node) ? $page_node->id() == $node->id() : FALSE);
 }
 
 /**
@@ -1079,7 +1079,7 @@ function template_preprocess_node(&$variables) {
   $variables['node'] = $variables['elements']['#node'];
   $node = $variables['node'];
 
-  $variables['date'] = format_date($node->created);
+  $variables['date'] = format_date($node->getCreated());
   // @todo Change 'name' to 'author' and also convert to a render array pending
   //   http://drupal.org/node/1941286.
   $variables['name'] = theme('username', array(
@@ -1102,7 +1102,7 @@ function template_preprocess_node(&$variables) {
   field_attach_preprocess($node, $variables['content'], $variables);
 
   // Display post information only on certain node types.
-  if (variable_get('node_submitted_' . $node->type, TRUE)) {
+  if (variable_get('node_submitted_' . $node->bundle(), TRUE)) {
     $variables['display_submitted'] = TRUE;
     $variables['submitted'] = t('Submitted by !username on !datetime', array('!username' => $variables['name'], '!datetime' => $variables['date']));
     if (theme_get_setting('features.node_user_picture')) {
@@ -1126,14 +1126,14 @@ function template_preprocess_node(&$variables) {
 
   // Gather node classes.
   $variables['attributes']['class'][] = 'node';
-  $variables['attributes']['class'][] = drupal_html_class('node-' . $node->type);
-  if ($node->promote) {
+  $variables['attributes']['class'][] = drupal_html_class('node-' . $node->bundle());
+  if ($node->isPromoted()) {
     $variables['attributes']['class'][] = 'promoted';
   }
-  if ($node->sticky) {
+  if ($node->isSticky()) {
     $variables['attributes']['class'][] = 'sticky';
   }
-  if (!$node->status) {
+  if (!$node->isPublished()) {
     $variables['attributes']['class'][] = 'unpublished';
   }
   if ($variables['view_mode']) {
@@ -1144,8 +1144,8 @@ function template_preprocess_node(&$variables) {
   }
 
   // Clean up name so there are no underscores.
-  $variables['theme_hook_suggestions'][] = 'node__' . $node->type;
-  $variables['theme_hook_suggestions'][] = 'node__' . $node->nid;
+  $variables['theme_hook_suggestions'][] = 'node__' . $node->bundle();
+  $variables['theme_hook_suggestions'][] = 'node__' . $node->id();
 
   $variables['content_attributes']['class'][] = 'content';
 }
@@ -1341,7 +1341,7 @@ function node_search_execute($keys = NULL, $conditions = NULL) {
       'type' => check_plain(node_get_type_label($node)),
       'title' => $node->label($item->langcode),
       'user' => theme('username', array('account' => $node)),
-      'date' => $node->changed,
+      'date' => $node->getChanged(),
       'node' => $node,
       'extra' => $extra,
       'score' => $item->calculated_score,
@@ -1502,9 +1502,9 @@ function _node_revision_access(EntityInterface $node, $op = 'view', $account = N
     'delete' => 'delete all revisions',
   );
   $type_map = array(
-    'view' => "view $node->type revisions",
-    'update' => "revert $node->type revisions",
-    'delete' => "delete $node->type revisions",
+    'view' => "view $node->bundle() revisions",
+    'update' => "revert $node->bundle() revisions",
+    'delete' => "delete $node->bundle() revisions",
   );
 
   if (!$node || !isset($map[$op]) || !isset($type_map[$op])) {
@@ -1537,7 +1537,7 @@ function _node_revision_access(EntityInterface $node, $op = 'view', $account = N
     // different revisions so there is no need for a separate database check.
     // Also, if you try to revert to or delete the default revision, that's
     // not good.
-    if ($node->isDefaultRevision() && (db_query('SELECT COUNT(*) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', array(':nid' => $node->nid))->fetchField() == 1 || $op == 'update' || $op == 'delete')) {
+    if ($node->isDefaultRevision() && (db_query('SELECT COUNT(*) FROM {node_field_revision} WHERE nid = :nid AND default_langcode = 1', array(':nid' => $node->id()))->fetchField() == 1 || $op == 'update' || $op == 'delete')) {
       $access[$cid] = FALSE;
     }
     elseif (user_access('administer nodes', $account)) {
@@ -1546,7 +1546,7 @@ function _node_revision_access(EntityInterface $node, $op = 'view', $account = N
     else {
       // First check the access to the default revision and finally, if the
       // node passed in is not the default revision then access to that, too.
-      $access[$cid] = node_access($op, node_load($node->nid), $account, $langcode) && ($node->isDefaultRevision() || node_access($op, $node, $account, $langcode));
+      $access[$cid] = node_access($op, node_load($node->id()), $account, $langcode) && ($node->isDefaultRevision() || node_access($op, $node, $account, $langcode));
     }
   }
 
@@ -1807,7 +1807,7 @@ function node_last_changed($nid, $langcode = NULL) {
  */
 function node_revision_list(EntityInterface $node) {
   $revisions = array();
-  $result = db_query('SELECT nfr.vid, nfr.title, nfr.log, nfr.revision_uid AS uid, n.vid AS current_vid, nfr.revision_timestamp, u.name FROM {node_field_revision} nfr LEFT JOIN {node} n ON n.vid = nfr.vid INNER JOIN {users} u ON u.uid = nfr.revision_uid WHERE nfr.nid = :nid AND nfr.default_langcode = 1 ORDER BY nfr.vid DESC', array(':nid' => $node->nid));
+  $result = db_query('SELECT nfr.vid, nfr.title, nfr.log, nfr.revision_uid AS uid, n.vid AS current_vid, nfr.revision_timestamp, u.name FROM {node_field_revision} nfr LEFT JOIN {node} n ON n.vid = nfr.vid INNER JOIN {users} u ON u.uid = nfr.revision_uid WHERE nfr.nid = :nid AND nfr.default_langcode = 1 ORDER BY nfr.vid DESC', array(':nid' => $node->id()));
   foreach ($result as $revision) {
     $revisions[$revision->vid] = $revision;
   }
@@ -1879,13 +1879,13 @@ function theme_node_recent_block($variables) {
     );
     if (node_access('update', $node)) {
       $row[] = array(
-        'data' => l(t('edit'), 'node/' . $node->nid . '/edit', $l_options),
+        'data' => l(t('edit'), 'node/' . $node->id() . '/edit', $l_options),
         'class' => 'edit',
       );
     }
     if (node_access('delete', $node)) {
       $row[] = array(
-        'data' => l(t('delete'), 'node/' . $node->nid . '/delete', $l_options),
+        'data' => l(t('delete'), 'node/' . $node->id() . '/delete', $l_options),
         'class' => 'delete',
       );
     }
@@ -1915,8 +1915,8 @@ function theme_node_recent_content($variables) {
   $node = $variables['node'];
 
   $output = '<div class="node-title">';
-  $output .= l($node->label(), 'node/' . $node->nid);
-  $output .= theme('mark', array('type' => node_mark($node->nid, $node->changed)));
+  $output .= l($node->label(), 'node/' . $node->id());
+  $output .= theme('mark', array('type' => node_mark($node->id(), $node->getChanged())));
   $output .= '</div><div class="node-author">';
   $output .= theme('username', array('account' => user_load($node->uid)));
   $output .= '</div>';
@@ -1976,7 +1976,7 @@ function node_block_access($block) {
     // the settings from this block, deny access to it.
     if (!empty($node)) {
       // This is a node or node edit page.
-      return in_array($node->type, $allowed_types);
+      return in_array($node->bundle(), $allowed_types);
     }
     elseif (isset($node_add_arg) && isset($node_types[$node_add_arg])) {
       // This is a node creation page
@@ -2041,12 +2041,12 @@ function node_feed($nids = FALSE, $channel = array()) {
   foreach ($nodes as $node) {
     $item_text = '';
 
-    $node->link = url("node/$node->nid", array('absolute' => TRUE));
+    $node->link = url("node/$node->id()", array('absolute' => TRUE));
     $node->rss_namespaces = array();
     $node->rss_elements = array(
-      array('key' => 'pubDate', 'value' => gmdate('r', $node->created)),
+      array('key' => 'pubDate', 'value' => gmdate('r', $node->getCreated())),
       array('key' => 'dc:creator', 'value' => $node->name),
-      array('key' => 'guid', 'value' => $node->nid . ' at ' . $base_url, 'attributes' => array('isPermaLink' => 'false'))
+      array('key' => 'guid', 'value' => $node->id() . ' at ' . $base_url, 'attributes' => array('isPermaLink' => 'false'))
     );
 
     // The node gets built and modules add to or modify $node->rss_elements
@@ -2180,7 +2180,7 @@ function _node_index_node(EntityInterface $node) {
 
   // Save the changed time of the most recent indexed node, for the search
   // results half-life calculation.
-  Drupal::state()->set('node.cron_last', $node->changed);
+  Drupal::state()->set('node.cron_last', $node->getChanged());
 
   $languages = $node->getTranslationLanguages();
 
@@ -2200,7 +2200,7 @@ function _node_index_node(EntityInterface $node) {
     }
 
     // Update index.
-    search_index($node->nid, 'node', $text, $language->langcode);
+    search_index($node->id(), 'node', $text, $language->langcode);
   }
 }
 
@@ -2467,7 +2467,7 @@ function node_form_system_themes_admin_form_submit($form, &$form_state) {
  */
 function node_access($op, $node, $account = NULL, $langcode = NULL) {
   if (!$node instanceof EntityInterface) {
-    $type = is_object($node) ? $node->type : $node;
+    $type = is_object($node) ? $node->bundle() : $node;
     $node = entity_create('node', array('type' => $type));
   }
 
@@ -2869,7 +2869,7 @@ function node_access_acquire_grants(EntityInterface $node, $delete = TRUE) {
  */
 function _node_access_write_grants(EntityInterface $node, $grants, $realm = NULL, $delete = TRUE) {
   if ($delete) {
-    $query = db_delete('node_access')->condition('nid', $node->nid);
+    $query = db_delete('node_access')->condition('nid', $node->id());
     if ($realm) {
       $query->condition('realm', array($realm, 'all'), 'IN');
     }
@@ -2893,7 +2893,7 @@ function _node_access_write_grants(EntityInterface $node, $grants, $realm = NULL
       foreach ($grant_languages as $grant_langcode => $grant_language) {
         // Only write grants; denies are implicit.
         if ($grant['grant_view'] || $grant['grant_update'] || $grant['grant_delete']) {
-          $grant['nid'] = $node->nid;
+          $grant['nid'] = $node->id();
           $grant['langcode'] = $grant_langcode;
           // The record with the original langcode is used as the fallback.
           if ($grant['langcode'] == $node->langcode) {
@@ -3091,14 +3091,14 @@ function node_content_form(EntityInterface $node, $form_state) {
   // @todo It is impossible to define a content type without implementing
   //   hook_form(). Remove this requirement.
   $form = array();
-  $type = node_type_load($node->type);
+  $type = node_type_load($node->bundle());
 
   if ($type->has_title) {
     $form['title'] = array(
       '#type' => 'textfield',
       '#title' => check_plain($type->title_label),
       '#required' => TRUE,
-      '#default_value' => $node->title,
+      '#default_value' => $node->label(),
       '#maxlength' => 255,
       '#weight' => -5,
     );
