diff --git a/core/lib/Drupal/Core/Entity/ContentEntityBase.php b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
new file mode 100644
index 0000000..c87b73e
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/ContentEntityBase.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\ContentEntityBase.
+ */
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Defines a base content entity class.
+ *
+ * Default implementation of ContentEntityInterface.
+ */
+abstract class ContentEntityBase extends EntityNG implements ContentEntityInterface {
+
+  /**
+   * Boolean indicating whether a new revision should be created on save.
+   *
+   * @var bool
+   */
+  protected $newRevision = FALSE;
+
+  /**
+   * Indicates whether this is the default revision.
+   *
+   * @var bool
+   */
+  protected $isDefaultRevision = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setNewRevision($value = TRUE) {
+    $this->newRevision = $value;
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function isNewRevision() {
+    $info = $this->entityInfo();
+    return $this->newRevision || (!empty($info['entity_keys']['revision']) && !$this->getRevisionId());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRevisionId() {
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isTranslatable() {
+    // @todo Inject the entity manager and retrieve bundle info from it.
+    $bundles = entity_get_bundles($this->entityType);
+    return !empty($bundles[$this->bundle()]['translatable']);
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record) {
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
index 9f2186f..9d79cea 100644
--- a/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/ContentEntityInterface.php
@@ -7,9 +7,22 @@
 
 namespace Drupal\Core\Entity;
 
+use Drupal\Core\TypedData\TranslatableInterface;
+
 /**
  * Defines a common interface for all content entity objects.
  */
-interface ContentEntityInterface extends EntityInterface {
+interface ContentEntityInterface extends EntityInterface, RevisionableInterface, TranslatableInterface {
+
+  /**
+   * Marks the translation identified by the given language code as existing.
+   *
+   * @todo Remove this as soon as translation metadata have been converted to
+   *    regular fields.
+   *
+   * @param string $langcode
+   *   The language code identifying the translation to be initialized.
+   */
+  public function initTranslation($langcode);
 
 }
diff --git a/core/lib/Drupal/Core/Entity/Entity.php b/core/lib/Drupal/Core/Entity/Entity.php
index 7712bf1..0827f4b 100644
--- a/core/lib/Drupal/Core/Entity/Entity.php
+++ b/core/lib/Drupal/Core/Entity/Entity.php
@@ -47,20 +47,6 @@ class Entity implements IteratorAggregate, EntityInterface {
   protected $enforceIsNew;
 
   /**
-   * Boolean indicating whether a new revision should be created on save.
-   *
-   * @var bool
-   */
-  protected $newRevision = FALSE;
-
-  /**
-   * Indicates whether this is the default revision.
-   *
-   * @var bool
-   */
-  protected $isDefaultRevision = TRUE;
-
-  /**
    * Constructs an Entity object.
    *
    * @param array $values
@@ -99,14 +85,6 @@ public function isNew() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::isNewRevision().
-   */
-  public function isNewRevision() {
-    $info = $this->entityInfo();
-    return $this->newRevision || (!empty($info['entity_keys']['revision']) && !$this->getRevisionId());
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::enforceIsNew().
    */
   public function enforceIsNew($value = TRUE) {
@@ -114,13 +92,6 @@ public function enforceIsNew($value = TRUE) {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::setNewRevision().
-   */
-  public function setNewRevision($value = TRUE) {
-    $this->newRevision = $value;
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::entityType().
    */
   public function entityType() {
@@ -280,7 +251,7 @@ public function access($operation = 'view', AccountInterface $account = NULL) {
   }
 
   /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::language().
+   * {@inheritdoc}
    */
   public function language() {
     // @todo: Replace by EntityNG implementation once all entity types have been
@@ -294,59 +265,6 @@ public function language() {
   }
 
   /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslation().
-   *
-   * @return \Drupal\Core\Entity\EntityInterface
-   */
-  public function getTranslation($langcode) {
-    // @todo: Replace by EntityNG implementation once all entity types have been
-    // converted to use the entity field API.
-    return $this;
-  }
-
-  /**
-   * Returns the languages the entity is translated to.
-   *
-   * @todo: Remove once all entity types implement the entity field API.
-   *   This is deprecated by
-   *   \Drupal\Core\TypedData\TranslatableInterface::getTranslationLanguages().
-   */
-  public function translations() {
-    return $this->getTranslationLanguages(FALSE);
-  }
-
-  /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslationLanguages().
-   */
-  public function getTranslationLanguages($include_default = TRUE) {
-    // @todo: Replace by EntityNG implementation once all entity types have been
-    // converted to use the entity field API.
-    $default_language = $this->language();
-    $languages = array($default_language->id => $default_language);
-    $entity_info = $this->entityInfo();
-
-    if ($entity_info['fieldable']) {
-      // Go through translatable properties and determine all languages for
-      // which translated values are available.
-      foreach (field_info_instances($this->entityType, $this->bundle()) as $field_name => $instance) {
-        $field = field_info_field($field_name);
-        if (field_is_translatable($this->entityType, $field) && isset($this->$field_name)) {
-          foreach (array_filter($this->$field_name) as $langcode => $value)  {
-            $languages[$langcode] = TRUE;
-          }
-        }
-      }
-      $languages = array_intersect_key(language_list(Language::STATE_ALL), $languages);
-    }
-
-    if (empty($include_default)) {
-      unset($languages[$default_language->id]);
-    }
-
-    return $languages;
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::save().
    */
   public function save() {
@@ -386,13 +304,6 @@ public function entityInfo() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getRevisionId().
-   */
-  public function getRevisionId() {
-    return NULL;
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::isDefaultRevision().
    */
   public function isDefaultRevision($new_value = NULL) {
@@ -536,15 +447,6 @@ public function setContext($name = NULL, TypedDataInterface $parent = NULL) {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::isTranslatable().
-   */
-  public function isTranslatable() {
-    // @todo Inject the entity manager and retrieve bundle info from it.
-    $bundles = entity_get_bundles($this->entityType);
-    return !empty($bundles[$this->bundle()]['translatable']);
-  }
-
-  /**
    * {@inheritdoc}
    */
   public function preSave(EntityStorageControllerInterface $storage_controller) {
@@ -586,52 +488,4 @@ public static function postDelete(EntityStorageControllerInterface $storage_cont
   public static function postLoad(EntityStorageControllerInterface $storage_controller, array $entities) {
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record) {
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getUntranslated() {
-    return $this->getTranslation(Language::LANGCODE_DEFAULT);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function hasTranslation($langcode) {
-    $translations = $this->getTranslationLanguages();
-    return isset($translations[$langcode]);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function addTranslation($langcode, array $values = array()) {
-    // @todo Config entities do not support entity translation hence we need to
-    //   move the TranslatableInterface implementation to EntityNG. See
-    //   http://drupal.org/node/2004244
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function removeTranslation($langcode) {
-    // @todo Config entities do not support entity translation hence we need to
-    //   move the TranslatableInterface implementation to EntityNG. See
-    //   http://drupal.org/node/2004244
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function initTranslation($langcode) {
-    // @todo Config entities do not support entity translation hence we need to
-    //   move the TranslatableInterface implementation to EntityNG. See
-    //   http://drupal.org/node/2004244
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Entity/EntityFormController.php b/core/lib/Drupal/Core/Entity/EntityFormController.php
index 36fb318..fbc5f35 100644
--- a/core/lib/Drupal/Core/Entity/EntityFormController.php
+++ b/core/lib/Drupal/Core/Entity/EntityFormController.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\Core\Entity;
 
+use Drupal\Core\TypedData\TranslatableInterface;
 use Drupal\entity\EntityFormDisplayInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Language\Language;
@@ -191,9 +192,19 @@ public function form(array $form, array &$form_state) {
       // If the form did not specify otherwise, default to keeping the existing
       // language of the entity or defaulting to the site default language for
       // new entities.
+      if (!$entity->isNew()) {
+        if ($entity instanceof TranslatableInterface) {
+          $langcode = $entity->getUntranslated()->language()->id;
+        }
+        else {
+          $langcode = $entity->language()->id;
+        }
+      }
+      else
+        $langcode = language_default()->id;
       $form['langcode'] = array(
         '#type' => 'value',
-        '#value' => !$entity->isNew() ? $entity->getUntranslated()->language()->id : language_default()->id,
+        '#value' => $langcode,
       );
     }
     return $form;
@@ -402,7 +413,7 @@ public function getFormLangcode(array $form_state) {
     if (!empty($form_state['langcode'])) {
       $langcode = $form_state['langcode'];
     }
-    else {
+    elseif ($entity instanceof TranslatableInterface) {
       // If no form langcode was provided we default to the current content
       // language and inspect existing translations to find a valid fallback,
       // if any.
@@ -416,14 +427,30 @@ public function getFormLangcode(array $form_state) {
 
     // If the site is not multilingual or no translation for the given form
     // language is available, fall back to the entity language.
-    return !empty($langcode) ? $langcode : $entity->getUntranslated()->language()->id;
+    if (!empty($langcode))  {
+      return $langcode;
+    }
+    elseif ($entity instanceof TranslatableInterface) {
+      // If the entity is translatable, return the original language.
+      return $entity->getUntranslated()->language()->id;
+    }
+    else {
+      // Fall back to the current language of the entity.
+      return $entity->language()->id;
+    }
   }
 
   /**
    * Implements \Drupal\Core\Entity\EntityFormControllerInterface::isDefaultFormLangcode().
    */
   public function isDefaultFormLangcode(array $form_state) {
-    return $this->getFormLangcode($form_state) == $this->entity->getUntranslated()->language()->id;
+    if ($this->entity instanceof TranslatableInterface) {
+      return $this->getFormLangcode($form_state) == $this->entity->getUntranslated()->language()->id;
+    }
+    else {
+      // If the entity is not translatable, this is always the default language.
+      return TRUE;
+    }
   }
 
   /**
@@ -502,10 +529,15 @@ public function getEntity() {
    *   A keyed array containing the current state of the form.
    */
   protected function getTranslatedEntity(array $form_state) {
-    $langcode = $this->getFormLangcode($form_state);
-    $translation = $this->entity->getTranslation($langcode);
-    // Ensure that the entity object is a BC entity if the original one is.
-    return $this->entity instanceof EntityBCDecorator ? $translation->getBCEntity() : $translation;
+    if ($this->entity instanceof TranslatableInterface) {
+      $langcode = $this->getFormLangcode($form_state);
+      $translation = $this->entity->getTranslation($langcode);
+      // Ensure that the entity object is a BC entity if the original one is.
+      return $this->entity instanceof EntityBCDecorator ? $translation->getBCEntity() : $translation;
+    }
+    else {
+      return $this->entity;
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Entity/EntityInterface.php b/core/lib/Drupal/Core/Entity/EntityInterface.php
index cdb4cd3..c6d72b8 100644
--- a/core/lib/Drupal/Core/Entity/EntityInterface.php
+++ b/core/lib/Drupal/Core/Entity/EntityInterface.php
@@ -27,7 +27,7 @@
  * @see \Drupal\Core\TypedData\TypedDataManager
  * @see \Drupal\Core\Field\FieldInterface
  */
-interface EntityInterface extends ComplexDataInterface, AccessibleInterface, TranslatableInterface {
+interface EntityInterface extends ComplexDataInterface, AccessibleInterface {
 
   /**
    * Returns the entity identifier (the entity's machine name or numeric ID).
@@ -50,6 +50,14 @@ public function id();
   public function uuid();
 
   /**
+   * Returns the default language.
+   *
+   * @return
+   *   The language object.
+   */
+  public function language();
+
+  /**
    * Returns whether the entity is new.
    *
    * Usually an entity is new if no ID exists for it yet. However, entities may
@@ -63,26 +71,6 @@ public function uuid();
   public function isNew();
 
   /**
-   * Returns whether a new revision should be created on save.
-   *
-   * @return bool
-   *   TRUE if a new revision should be created.
-   *
-   * @see \Drupal\Core\Entity\EntityInterface::setNewRevision()
-   */
-  public function isNewRevision();
-
-  /**
-   * Enforces an entity to be saved as a new revision.
-   *
-   * @param bool $value
-   *   (optional) Whether a new revision should be saved.
-   *
-   * @see \Drupal\Core\Entity\EntityInterface::isNewRevision()
-   */
-  public function setNewRevision($value = TRUE);
-
-  /**
    * Enforces an entity to be new.
    *
    * Allows migrations to create entities with pre-defined IDs by forcing the
@@ -173,16 +161,6 @@ public function delete();
   public function preSave(EntityStorageControllerInterface $storage_controller);
 
   /**
-   * Acts on a revision before it gets saved.
-   *
-   * @param EntityStorageControllerInterface $storage_controller
-   *   The entity storage controller object.
-   * @param \stdClass $record
-   *   The revision object.
-   */
-  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record);
-
-  /**
    * Acts on a saved entity before the insert or update hook is invoked.
    *
    * Used after the entity is saved, but before invoking the insert or update
@@ -267,27 +245,6 @@ public function createDuplicate();
   public function entityInfo();
 
   /**
-   * Returns the revision identifier of the entity.
-   *
-   * @return
-   *   The revision identifier of the entity, or NULL if the entity does not
-   *   have a revision identifier.
-   */
-  public function getRevisionId();
-
-  /**
-   * Checks if this entity is the default revision.
-   *
-   * @param bool $new_value
-   *   (optional) A Boolean to (re)set the isDefaultRevision flag.
-   *
-   * @return bool
-   *   TRUE if the entity is the default revision, FALSE otherwise. If
-   *   $new_value was passed, the previous value is returned.
-   */
-  public function isDefaultRevision($new_value = NULL);
-
-  /**
    * Retrieves the exportable properties of the entity.
    *
    * @return array
@@ -315,23 +272,4 @@ public function getBCEntity();
    */
   public function getNGEntity();
 
-  /**
-   * Returns the translation support status.
-   *
-   * @return bool
-   *   TRUE if the entity bundle has translation support enabled.
-   */
-  public function isTranslatable();
-
-  /**
-   * Marks the translation identified by the given language code as existing.
-   *
-   * @todo Remove this as soon as translation metadata have been converted to
-   *    regular fields.
-   *
-   * @param string $langcode
-   *   The language code identifying the translation to be initialized.
-   */
-  public function initTranslation($langcode);
-
 }
diff --git a/core/lib/Drupal/Core/Entity/RevisionableInterface.php b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
new file mode 100644
index 0000000..d246d24
--- /dev/null
+++ b/core/lib/Drupal/Core/Entity/RevisionableInterface.php
@@ -0,0 +1,66 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Entity\RevisionableInterface.
+ */
+
+namespace Drupal\Core\Entity;
+
+/**
+ * Provides methods for an entity to support revisions.
+ */
+interface RevisionableInterface {
+
+  /**
+   * Returns whether a new revision should be created on save.
+   *
+   * @return bool
+   *   TRUE if a new revision should be created.
+   *
+   * @see \Drupal\Core\Entity\EntityInterface::setNewRevision()
+   */
+  public function isNewRevision();
+
+  /**
+   * Enforces an entity to be saved as a new revision.
+   *
+   * @param bool $value
+   *   (optional) Whether a new revision should be saved.
+   *
+   * @see \Drupal\Core\Entity\EntityInterface::isNewRevision()
+   */
+  public function setNewRevision($value = TRUE);
+
+  /**
+   * Returns the revision identifier of the entity.
+   *
+   * @return
+   *   The revision identifier of the entity, or NULL if the entity does not
+   *   have a revision identifier.
+   */
+  public function getRevisionId();
+
+  /**
+   * Checks if this entity is the default revision.
+   *
+   * @param bool $new_value
+   *   (optional) A Boolean to (re)set the isDefaultRevision flag.
+   *
+   * @return bool
+   *   TRUE if the entity is the default revision, FALSE otherwise. If
+   *   $new_value was passed, the previous value is returned.
+   */
+  public function isDefaultRevision($new_value = NULL);
+
+  /**
+   * Acts on a revision before it gets saved.
+   *
+   * @param EntityStorageControllerInterface $storage_controller
+   *   The entity storage controller object.
+   * @param \stdClass $record
+   *   The revision object.
+   */
+  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record);
+
+}
diff --git a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
index 0d5332b..f94aa0b 100644
--- a/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
+++ b/core/lib/Drupal/Core/TypedData/TranslatableInterface.php
@@ -90,4 +90,12 @@ public function addTranslation($langcode, array $values = array());
    */
   public function removeTranslation($langcode);
 
+  /**
+   * Returns the translation support status.
+   *
+   * @return bool
+   *   TRUE if the object has translation support enabled.
+   */
+  public function isTranslatable();
+
 }
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
index 73c015d..06d5ca1 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Feed.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\aggregator\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Symfony\Component\DependencyInjection\Container;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Entity\Annotation\EntityType;
@@ -38,7 +38,7 @@
  *   }
  * )
  */
-class Feed extends EntityNG implements FeedInterface {
+class Feed extends ContentEntityBase implements FeedInterface {
 
   /**
    * The feed ID.
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Item.php b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Item.php
index 6da20f3..053b3e6 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Item.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Plugin/Core/Entity/Item.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\aggregator\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
@@ -32,7 +32,7 @@
  *   }
  * )
  */
-class Item extends EntityNG implements ItemInterface {
+class Item extends ContentEntityBase implements ItemInterface {
 
   /**
    * The feed item ID.
diff --git a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
index 74dfc25..798642a 100644
--- a/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
+++ b/core/modules/block/custom_block/lib/Drupal/custom_block/Plugin/Core/Entity/CustomBlock.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\custom_block\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
@@ -48,7 +48,7 @@
  *   }
  * )
  */
-class CustomBlock extends EntityNG implements CustomBlockInterface {
+class CustomBlock extends ContentEntityBase implements CustomBlockInterface {
 
   /**
    * The block ID.
diff --git a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
index 700b629..68747d7 100644
--- a/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Plugin/Core/Entity/Comment.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\comment\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\comment\CommentInterface;
@@ -49,7 +49,7 @@
  *   }
  * )
  */
-class Comment extends EntityNG implements CommentInterface {
+class Comment extends ContentEntityBase implements CommentInterface {
 
   /**
    * The comment ID.
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
index faaccde..b20ba7e 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
@@ -59,11 +59,9 @@ function testCRUD() {
     $this->assertIdentical($empty->get('langcode'), $default_langcode);
 
     // Verify Entity properties/methods on the newly created empty entity.
-    $this->assertIdentical($empty->isNewRevision(), FALSE);
     $this->assertIdentical($empty->entityType(), 'config_test');
     $uri = $empty->uri();
     $this->assertIdentical($uri['path'], 'admin/structure/config_test/manage/');
-    $this->assertIdentical($empty->isDefaultRevision(), TRUE);
 
     // Verify that an empty entity cannot be saved.
     try {
@@ -108,10 +106,8 @@ function testCRUD() {
     $expected['uuid'] = $config_test->uuid();
     $this->assertIdentical($config_test->label(), $expected['label']);
 
-    $this->assertIdentical($config_test->isNewRevision(), FALSE);
     $uri = $config_test->uri();
     $this->assertIdentical($uri['path'], 'admin/structure/config_test/manage/' . $expected['id']);
-    $this->assertIdentical($config_test->isDefaultRevision(), TRUE);
 
     // Verify that the entity can be saved.
     try {
diff --git a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
index a7ae2b3..6bc72e7 100644
--- a/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
+++ b/core/modules/contact/lib/Drupal/contact/Plugin/Core/Entity/Message.php
@@ -9,7 +9,7 @@
 
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\contact\MessageInterface;
 
 /**
@@ -36,7 +36,7 @@
  *   }
  * )
  */
-class Message extends EntityNG implements MessageInterface {
+class Message extends ContentEntityBase implements MessageInterface {
 
   /**
    * Overrides Drupal\Core\Entity\Entity::id().
diff --git a/core/modules/content_translation/content_translation.module b/core/modules/content_translation/content_translation.module
index cbd33e8..e75b78c 100644
--- a/core/modules/content_translation/content_translation.module
+++ b/core/modules/content_translation/content_translation.module
@@ -5,11 +5,13 @@
  * Allows entities to be translated into different languages.
  */
 
-use Drupal\Core\Language\Language;
-use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Entity\EntityFormControllerInterface;
 use Drupal\Core\Entity\EntityInterface;
 use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Language\Language;
+use Drupal\Core\Session\AccountInterface;
+use Drupal\Core\TypedData\TranslatableInterface;
 
 /**
  * Implements hook_help().
@@ -279,7 +281,7 @@ function _content_translation_menu_strip_loaders($path) {
  */
 function content_translation_translate_access(EntityInterface $entity) {
   $entity_type = $entity->entityType();
-  return empty($entity->getUntranslated()->language()->locked) && language_multilingual() && $entity->isTranslatable() &&
+  return $entity instanceof ContentEntityInterface && empty($entity->getUntranslated()->language()->locked) && language_multilingual() && $entity->isTranslatable() &&
     (user_access('create content translations') || user_access('update content translations') || user_access('delete content translations'));
 }
 
@@ -600,7 +602,7 @@ function content_translation_permission() {
  * Implements hook_form_alter().
  */
 function content_translation_form_alter(array &$form, array &$form_state) {
-  if (($form_controller = content_translation_form_controller($form_state)) && ($entity = $form_controller->getEntity()) && !$entity->isNew() && $entity->isTranslatable()) {
+  if (($form_controller = content_translation_form_controller($form_state)) && ($entity = $form_controller->getEntity()) && !$entity->isNew() && $entity instanceof TranslatableInterface && $entity->isTranslatable()) {
     $controller = content_translation_controller($entity->entityType());
     $controller->entityFormAlter($form, $form_state, $entity);
 
@@ -641,7 +643,7 @@ function content_translation_field_language_alter(&$display_language, $context)
   $entity = $context['entity'];
   $entity_type = $entity->entityType();
 
-  if (isset($entity->translation[$context['langcode']]) && $entity->isTranslatable() && !content_translation_view_access($entity, $context['langcode'])) {
+  if ($entity->getNGEntity() instanceof ContentEntityInterface && isset($entity->translation[$context['langcode']]) && $entity->isTranslatable() && !content_translation_view_access($entity, $context['langcode'])) {
     $instances = field_info_instances($entity_type, $entity->bundle());
     // Avoid altering the real entity.
     $entity = clone($entity);
@@ -677,7 +679,7 @@ function content_translation_entity_load(array $entities, $entity_type) {
 
   if (content_translation_enabled($entity_type)) {
     foreach ($entities as $entity) {
-      if ($entity->isTranslatable()) {
+      if ($entity instanceof ContentEntityInterface && $entity->isTranslatable()) {
         $enabled_entities[$entity->id()] = $entity;
       }
     }
@@ -720,7 +722,7 @@ function content_translation_load_translation_metadata(array $entities, $entity_
  */
 function content_translation_entity_insert(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!$entity->isTranslatable()) {
+  if (!($entity instanceof ContentEntityInterface) || !$entity->isTranslatable()) {
     return;
   }
 
@@ -760,7 +762,7 @@ function content_translation_entity_insert(EntityInterface $entity) {
  */
 function content_translation_entity_delete(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!$entity->isTranslatable()) {
+  if (!($entity instanceof ContentEntityInterface) || !$entity->isTranslatable()) {
     return;
   }
 
@@ -775,7 +777,7 @@ function content_translation_entity_delete(EntityInterface $entity) {
  */
 function content_translation_entity_update(EntityInterface $entity) {
   // Only do something if translation support for the given entity is enabled.
-  if (!$entity->isTranslatable()) {
+  if (!($entity instanceof ContentEntityInterface) || !$entity->isTranslatable()) {
     return;
   }
 
@@ -869,7 +871,7 @@ function content_translation_field_info_alter(&$info) {
  * Implements hook_entity_presave().
  */
 function content_translation_entity_presave(EntityInterface $entity) {
-  if ($entity->isTranslatable()) {
+  if ($entity instanceof ContentEntityInterface && $entity->isTranslatable()) {
     // @todo Avoid using request attributes once translation metadata become
     //   regular fields.
     $attributes = Drupal::request()->attributes;
diff --git a/core/modules/file/lib/Drupal/file/Plugin/Core/Entity/File.php b/core/modules/file/lib/Drupal/file/Plugin/Core/Entity/File.php
index 41c9ad1..931f4cd 100644
--- a/core/modules/file/lib/Drupal/file/Plugin/Core/Entity/File.php
+++ b/core/modules/file/lib/Drupal/file/Plugin/Core/Entity/File.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\file\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Annotation\Translation;
@@ -34,7 +34,7 @@
  *   }
  * )
  */
-class File extends EntityNG implements FileInterface {
+class File extends ContentEntityBase implements FileInterface {
 
   /**
    * The plain data values of the contained properties.
diff --git a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
index 7f227f8..e8643be 100644
--- a/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
+++ b/core/modules/menu_link/lib/Drupal/menu_link/Plugin/Core/Entity/MenuLink.php
@@ -263,6 +263,116 @@ class MenuLink extends Entity implements \ArrayAccess, MenuLinkInterface {
   protected $routeObject;
 
   /**
+   * Boolean indicating whether a new revision should be created on save.
+   *
+   * @var bool
+   */
+  protected $newRevision = FALSE;
+
+  /**
+   * Indicates whether this is the default revision.
+   *
+   * @var bool
+   */
+  protected $isDefaultRevision = TRUE;
+
+  /**
+   * {@inheritdoc}
+   */
+  public function setNewRevision($value = TRUE) {
+    $this->newRevision = $value;
+  }
+  /**
+   * {@inheritdoc}
+   */
+  public function isNewRevision() {
+    $info = $this->entityInfo();
+    return $this->newRevision || (!empty($info['entity_keys']['revision']) && !$this->getRevisionId());
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function getRevisionId() {
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function isTranslatable() {
+    // @todo Inject the entity manager and retrieve bundle info from it.
+    $bundles = entity_get_bundles($this->entityType);
+    return !empty($bundles[$this->bundle()]['translatable']);
+  }
+
+  /**
+   * Implements \Drupal\Core\TypedData\TranslatableInterface::language().
+   */
+  public function language() {
+    // @todo: Replace by EntityNG implementation once all entity types have been
+    // converted to use the entity field API.
+    $language = language_load($this->langcode);
+    if (!$language) {
+      // Make sure we return a proper language object.
+      $language = new Language(array('id' => Language::LANGCODE_NOT_SPECIFIED));
+    }
+    return $language;
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function initTranslation($langcode) {
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function getTranslationLanguages($include_default = TRUE) {
+    return array();
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function getTranslation($langcode) {
+    return $this;
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function getUntranslated() {
+    return $this;
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function hasTranslation($langcode) {
+    return FALSE;
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function addTranslation($langcode, array $values = array()) {
+  }
+
+  /**
+   * {@inheritdocs}
+   */
+  public function removeTranslation($langcode) {
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record) {
+  }
+
+  /**
    * Overrides Entity::id().
    */
   public function id() {
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 b8451b8..52af932 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
@@ -7,6 +7,7 @@
 
 namespace Drupal\node\Plugin\Core\Entity;
 
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityNG;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Entity\Annotation\EntityType;
@@ -57,7 +58,7 @@
  *   }
  * )
  */
-class Node extends EntityNG implements NodeInterface {
+class Node extends ContentEntityBase implements NodeInterface {
 
   /**
    * Implements Drupal\Core\Entity\EntityInterface::id().
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
index 332b322..92ca23a 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTest.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\entity_test\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Language\Language;
@@ -38,7 +38,7 @@
  *   menu_base_path = "entity-test/manage/%entity_test"
  * )
  */
-class EntityTest extends EntityNG {
+class EntityTest extends ContentEntityBase {
 
   /**
    * The entity ID.
diff --git a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTestCache.php b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTestCache.php
index c40b11e..9e9fa04 100644
--- a/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTestCache.php
+++ b/core/modules/system/tests/modules/entity_test/lib/Drupal/entity_test/Plugin/Core/Entity/EntityTestCache.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\entity_test\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\Core\Language\Language;
@@ -38,7 +38,7 @@
  *   menu_base_path = "entity-test/manage/%entity_test"
  * )
  */
-class EntityTestCache extends EntityNG {
+class EntityTestCache extends ContentEntityBase {
 
   /**
    * The entity ID.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
index 424a91b..a397d1f 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Plugin/Core/Entity/Term.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\taxonomy\Plugin\Core\Entity;
 
-use Drupal\Core\Entity\EntityNG;
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Annotation\Translation;
@@ -53,7 +53,7 @@
  *   permission_granularity = "bundle"
  * )
  */
-class Term extends EntityNG implements TermInterface {
+class Term extends ContentEntityBase implements TermInterface {
 
   /**
    * The taxonomy term ID.
diff --git a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
index 4f89128..48c0511 100644
--- a/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
+++ b/core/modules/user/lib/Drupal/user/Plugin/Core/Entity/User.php
@@ -7,9 +7,9 @@
 
 namespace Drupal\user\Plugin\Core\Entity;
 
+use Drupal\Core\Entity\ContentEntityBase;
 use Drupal\Core\Entity\EntityStorageControllerInterface;
 use Drupal\Core\Entity\EntityMalformedException;
-use Drupal\Core\Entity\EntityNG;
 use Drupal\Core\Entity\Annotation\EntityType;
 use Drupal\Core\Annotation\Translation;
 use Drupal\user\UserBCDecorator;
@@ -49,7 +49,7 @@
  *   }
  * )
  */
-class User extends EntityNG implements UserInterface {
+class User extends ContentEntityBase implements UserInterface {
 
   /**
    * The user ID.
diff --git a/core/modules/user/lib/Drupal/user/UserInterface.php b/core/modules/user/lib/Drupal/user/UserInterface.php
index 4dc1481..3e989e5 100644
--- a/core/modules/user/lib/Drupal/user/UserInterface.php
+++ b/core/modules/user/lib/Drupal/user/UserInterface.php
@@ -7,13 +7,13 @@
 
 namespace Drupal\user;
 
-use Drupal\Core\Entity\EntityInterface;
+use Drupal\Core\Entity\ContentEntityInterface;
 use Drupal\Core\Session\AccountInterface;
 
 /**
  * Provides an interface defining a user entity.
  */
-interface UserInterface extends EntityInterface, AccountInterface {
+interface UserInterface extends ContentEntityInterface, AccountInterface {
 
   /**
    * Returns a list of roles.
diff --git a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
index 92fa27b..fb51c52 100644
--- a/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
+++ b/core/modules/views_ui/lib/Drupal/views_ui/ViewUI.php
@@ -835,20 +835,6 @@ public function bundle() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::isDefaultRevision().
-   */
-  public function isDefaultRevision($new_value = NULL) {
-    return $this->storage->isDefaultRevision($new_value);
-  }
-
-  /**
-   * Implements \Drupal\Core\Entity\EntityInterface::getRevisionId().
-   */
-  public function getRevisionId() {
-    return $this->storage->getRevisionId();
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::entityInfo().
    */
   public function entityInfo() {
@@ -891,20 +877,6 @@ public function label($langcode = NULL) {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::isNewRevision().
-   */
-  public function isNewRevision() {
-    return $this->storage->isNewRevision();
-  }
-
-  /**
-   * Implements \Drupal\Core\Entity\EntityInterface::setNewRevision().
-   */
-  public function setNewRevision($value = TRUE) {
-    return $this->storage->setNewRevision($value);
-  }
-
-  /**
    * Implements \Drupal\Core\Entity\EntityInterface::enforceIsNew().
    */
   public function enforceIsNew($value = TRUE) {
@@ -918,23 +890,9 @@ public function getExportProperties() {
     return $this->storage->getExportProperties();
   }
 
-  /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslation().
-   */
-  public function getTranslation($langcode) {
-    // @todo Revisit this once config entities are converted to NG.
-    return $this;
-  }
-
-  /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::getTranslationLanguages().
-   */
-  public function getTranslationLanguages($include_default = TRUE) {
-    return $this->storage->getTranslationLanguages($include_default);
-  }
 
   /**
-   * Implements \Drupal\Core\TypedData\TranslatableInterface::language)().
+   * {@inheritdoc}
    */
   public function language() {
     return $this->storage->language();
@@ -1039,48 +997,6 @@ public function getNGEntity() {
   }
 
   /**
-   * Implements \Drupal\Core\Entity\EntityInterface::isTranslatable().
-   */
-  public function isTranslatable() {
-    return $this->storage->isTranslatable();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function getUntranslated() {
-    return $this->storage->getUntranslated();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function hasTranslation($langcode) {
-    return $this->storage->hasTranslation($langcode);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function addTranslation($langcode, array $values = array()) {
-    return $this->storage->addTranslation($langcode, $values);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function removeTranslation($langcode) {
-    $this->storage->removeTranslation($langcode);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function initTranslation($langcode) {
-    $this->storage->initTranslation($langcode);
-  }
-
-  /**
    * Implements \Drupal\Core\TypedData\TypedDataInterface::getType().
    */
   public function getType() {
@@ -1226,13 +1142,6 @@ public static function postLoad(EntityStorageControllerInterface $storage_contro
   /**
    * {@inheritdoc}
    */
-  public function preSaveRevision(EntityStorageControllerInterface $storage_controller, \stdClass $record) {
-    $this->storage->preSaveRevision($storage_controller, $record);
-  }
-
-  /**
-   * {@inheritdoc}
-   */
   public function mergeDefaultDisplaysOptions() {
     $this->storage->mergeDefaultDisplaysOptions();
   }
diff --git a/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewUIObjectTest.php b/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewUIObjectTest.php
index 6aac5e4..8365eb2 100644
--- a/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewUIObjectTest.php
+++ b/core/modules/views_ui/tests/Drupal/views_ui/Tests/ViewUIObjectTest.php
@@ -39,10 +39,8 @@ public function testEntityDecoration() {
     $method_args = array();
     $method_args['setOriginalID'] = array(12);
     $method_args['setStatus'] = array(TRUE);
-    $method_args['setNewRevision'] = array(FALSE);
     $method_args['enforceIsNew'] = array(FALSE);
     $method_args['label'] = array(Language::LANGCODE_NOT_SPECIFIED);
-    $method_args['isDefaultRevision'] = array(TRUE);
 
     $reflection = new \ReflectionClass('Drupal\Core\Config\Entity\ConfigEntityInterface');
     $interface_methods = array();
