diff --git a/core/MAINTAINERS.txt b/core/MAINTAINERS.txt
index 7ced0a0..41ff457 100644
--- a/core/MAINTAINERS.txt
+++ b/core/MAINTAINERS.txt
@@ -42,7 +42,7 @@ Configuration system
 - Daniel F. Kudwien 'sun' http://drupal.org/user/54136
 - Alex Pott 'alexpott' http://drupal.org/user/157725
 
-Configurable entity system
+Configuration entity system
 - Daniel F. Kudwien 'sun' http://drupal.org/user/54136
 - Tim Plunkett 'tim.plunkett' http://drupal.org/user/241634
 
diff --git a/core/modules/comment/lib/Drupal/comment/Comment.php b/core/modules/comment/lib/Drupal/comment/Comment.php
index a7bacd4..7b9554b 100644
--- a/core/modules/comment/lib/Drupal/comment/Comment.php
+++ b/core/modules/comment/lib/Drupal/comment/Comment.php
@@ -7,12 +7,13 @@
 
 namespace Drupal\comment;
 
+use Drupal\entity\ContentEntityInterface;
 use Drupal\entity\Entity;
 
 /**
  * Defines the comment entity class.
  */
-class Comment extends Entity {
+class Comment extends Entity implements ContentEntityInterface {
 
   /**
    * The comment ID.
diff --git a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
index 50669a8..5dcda40 100644
--- a/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
+++ b/core/modules/comment/lib/Drupal/comment/CommentStorageController.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\comment;
 
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
 use LogicException;
 
@@ -58,7 +58,7 @@ protected function attachLoad(&$comments, $load_revision = FALSE) {
    * @see comment_int_to_alphadecimal()
    * @see comment_alphadecimal_to_int()
    */
-  protected function preSave(StorableInterface $comment) {
+  protected function preSave(EntityInterface $comment) {
     global $user;
 
     if (!isset($comment->status)) {
@@ -151,7 +151,7 @@ protected function preSave(StorableInterface $comment) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  protected function postSave(StorableInterface $comment, $update) {
+  protected function postSave(EntityInterface $comment, $update) {
     $this->releaseThreadLock();
     // Update the {node_comment_statistics} table prior to executing the hook.
     $this->updateNodeStatistics($comment->nid);
diff --git a/core/modules/config/config.api.php b/core/modules/config/config.api.php
index e5dba3d..147412d 100644
--- a/core/modules/config/config.api.php
+++ b/core/modules/config/config.api.php
@@ -31,7 +31,7 @@
  *   A configuration object containing the old configuration data.
  */
 function hook_config_import_create($name, $new_config, $old_config) {
-  // Only configurable entities require custom handling. Any other module
+  // Only configuration entities require custom handling. Any other module
   // settings can be synchronized directly.
   if (strpos($name, 'config_test.dynamic.') !== 0) {
     return FALSE;
@@ -60,7 +60,7 @@ function hook_config_import_create($name, $new_config, $old_config) {
  *   A configuration object containing the old configuration data.
  */
 function hook_config_import_change($name, $new_config, $old_config) {
-  // Only configurable entities require custom handling. Any other module
+  // Only configuration entities require custom handling. Any other module
   // settings can be synchronized directly.
   if (strpos($name, 'config_test.dynamic.') !== 0) {
     return FALSE;
@@ -78,8 +78,8 @@ function hook_config_import_change($name, $new_config, $old_config) {
     $config_test->original->$property = $value;
   }
 
-  // Iterate through each property of the new config, copying it to the
-  // configurable test object.
+  // Iterate through each property of the new config, copying it to the test
+  // object.
   foreach ($new_config->get() as $property => $value) {
     $config_test->$property = $value;
   }
@@ -107,7 +107,7 @@ function hook_config_import_change($name, $new_config, $old_config) {
  *   A configuration object containing the old configuration data.
  */
 function hook_config_import_delete($name, $new_config, $old_config) {
-  // Only configurable entities require custom handling. Any other module
+  // Only configuration entities require custom handling. Any other module
   // settings can be synchronized directly.
   if (strpos($name, 'config_test.dynamic.') !== 0) {
     return FALSE;
diff --git a/core/modules/config/lib/Drupal/config/ConfigurableBase.php b/core/modules/config/lib/Drupal/config/ConfigEntityBase.php
similarity index 68%
rename from core/modules/config/lib/Drupal/config/ConfigurableBase.php
rename to core/modules/config/lib/Drupal/config/ConfigEntityBase.php
index a8bc318..921ab36 100644
--- a/core/modules/config/lib/Drupal/config/ConfigurableBase.php
+++ b/core/modules/config/lib/Drupal/config/ConfigEntityBase.php
@@ -2,23 +2,23 @@
 
 /**
  * @file
- * Definition of Drupal\config\ConfigurableBase.
+ * Definition of Drupal\config\ConfigEntityBase.
  */
 
 namespace Drupal\config;
 
-use Drupal\entity\StorableBase;
+use Drupal\entity\Entity;
 
 /**
- * Defines a base configurable entity class.
+ * Defines a base configuration entity class.
  */
-abstract class ConfigurableBase extends StorableBase implements ConfigurableInterface {
+abstract class ConfigEntityBase extends Entity implements ConfigEntityInterface {
 
   /**
-   * The original ID of the configurable entity.
+   * The original ID of the configuration entity.
    *
-   * The ID of a configurable entity is a unique string (machine name). When a
-   * configurable entity is updated and its machine name is renamed, the
+   * The ID of a configuration entity is a unique string (machine name). When a
+   * configuration entity is updated and its machine name is renamed, the
    * original ID needs to be known.
    *
    * @var string
@@ -38,7 +38,7 @@ public function __construct(array $values = array(), $entity_type) {
   }
 
   /**
-   * Implements ConfigurableInterface::getOriginalID().
+   * Implements ConfigEntityInterface::getOriginalID().
    */
   public function getOriginalID() {
     return $this->originalID;
@@ -47,8 +47,8 @@ public function getOriginalID() {
   /**
    * Overrides Entity::isNew().
    *
-   * EntityInterface::enforceIsNew() is not supported by configurable entities,
-   * since each Configurable is unique.
+   * EntityInterface::enforceIsNew() is not supported by configuration entities,
+   * since each configuration entity is unique.
    */
   final public function isNew() {
     return !$this->id();
@@ -57,8 +57,8 @@ public function getOriginalID() {
   /**
    * Overrides Entity::bundle().
    *
-   * EntityInterface::bundle() is not supported by configurable entities, since
-   * a Configurable is a bundle.
+   * EntityInterface::bundle() is not supported by configuration entities, since
+   * a configuration entity is a bundle.
    */
   final public function bundle() {
     return $this->entityType;
@@ -68,7 +68,7 @@ public function getOriginalID() {
    * Overrides Entity::get().
    *
    * EntityInterface::get() implements support for fieldable entities, but
-   * configurable entities are not fieldable.
+   * configuration entities are not fieldable.
    */
   public function get($property_name, $langcode = NULL) {
     // @todo: Add support for translatable properties being not fields.
@@ -79,7 +79,7 @@ public function get($property_name, $langcode = NULL) {
    * Overrides Entity::set().
    *
    * EntityInterface::set() implements support for fieldable entities, but
-   * configurable entities are not fieldable.
+   * configuration entities are not fieldable.
    */
   public function set($property_name, $value, $langcode = NULL) {
     // @todo: Add support for translatable properties being not fields.
@@ -87,7 +87,7 @@ public function set($property_name, $value, $langcode = NULL) {
   }
 
   /**
-   * Helper callback for uasort() to sort Configurable entities by weight and label.
+   * Helper callback for uasort() to sort configuration entities by weight and label.
    */
   public static function sort($a, $b) {
     $a_weight = isset($a->weight) ? $a->weight : 0;
diff --git a/core/modules/config/lib/Drupal/config/ConfigEntityInterface.php b/core/modules/config/lib/Drupal/config/ConfigEntityInterface.php
new file mode 100644
index 0000000..ee4bb93
--- /dev/null
+++ b/core/modules/config/lib/Drupal/config/ConfigEntityInterface.php
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\config\ConfigEntityInterface.
+ */
+
+namespace Drupal\config;
+
+use Drupal\entity\EntityInterface;
+
+/**
+ * Defines the interface common for all configuration entities.
+ */
+interface ConfigEntityInterface extends EntityInterface {
+
+  /**
+   * Returns the original ID.
+   *
+   * @return string|null
+   *   The original ID, if any.
+   */
+  public function getOriginalID();
+
+}
diff --git a/core/modules/config/lib/Drupal/config/ConfigStorageController.php b/core/modules/config/lib/Drupal/config/ConfigStorageController.php
index eecbd1d..031eead 100644
--- a/core/modules/config/lib/Drupal/config/ConfigStorageController.php
+++ b/core/modules/config/lib/Drupal/config/ConfigStorageController.php
@@ -8,11 +8,11 @@
 namespace Drupal\config;
 
 use Drupal\Component\Uuid\Uuid;
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\StorageControllerInterface;
 
 /**
- * Defines the storage controller class for configurable entities.
+ * Defines the storage controller class for configuration entities.
  */
 class ConfigStorageController implements StorageControllerInterface {
 
@@ -153,7 +153,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
     $config_class = $this->entityInfo['entity class'];
     $prefix = $this->entityInfo['config prefix'] . '.';
 
-    // Load all of the configurables.
+    // Load all of the configuration entities.
     if ($ids === NULL) {
       $names = drupal_container()->get('config.storage')->listAll($prefix);
       $result = array();
@@ -166,7 +166,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
     else {
       $result = array();
       foreach ($ids as $id) {
-        // Add the prefix to the ID to serve as the configurable name.
+        // Add the prefix to the ID to serve as the configuration object name.
         $config = config($prefix . $id);
         if (!$config->isNew()) {
           $result[$id] = new $config_class($config->get(), $this->entityType);
@@ -254,7 +254,7 @@ public function delete($ids) {
   /**
    * Implements Drupal\entity\StorageControllerInterface::save().
    */
-  public function save(StorableInterface $entity) {
+  public function save(EntityInterface $entity) {
     $prefix = $this->entityInfo['config prefix'] . '.';
 
     // Load the stored entity, if any.
@@ -306,7 +306,7 @@ public function save(StorableInterface $entity) {
    *
    * Used before the entity is saved and before invoking the presave hook.
    */
-  protected function preSave(StorableInterface $entity) {
+  protected function preSave(EntityInterface $entity) {
   }
 
   /**
@@ -319,8 +319,8 @@ protected function preSave(StorableInterface $entity) {
    *   (bool) TRUE if the entity has been updated, or FALSE if it has been
    *   inserted.
    */
-  protected function postSave(StorableInterface $entity, $update) {
-    // Delete the original configurable entity, in case the entity ID was
+  protected function postSave(EntityInterface $entity, $update) {
+    // Delete the original configuration entity, in case the entity ID was
     // renamed.
     if ($update && !empty($entity->original) && $entity->{$this->idKey} !== $entity->original->{$this->idKey}) {
       // @todo This should just delete the original config object without going
@@ -353,7 +353,7 @@ protected function postDelete($entities) {
    * @param $entity
    *   The entity object.
    */
-  protected function invokeHook($hook, StorableInterface $entity) {
+  protected function invokeHook($hook, EntityInterface $entity) {
     // Invoke the hook.
     module_invoke_all($this->entityType . '_' . $hook, $entity);
     // Invoke the respective entity-level hook.
diff --git a/core/modules/config/lib/Drupal/config/ConfigurableInterface.php b/core/modules/config/lib/Drupal/config/ConfigurableInterface.php
deleted file mode 100644
index bf49b9b..0000000
--- a/core/modules/config/lib/Drupal/config/ConfigurableInterface.php
+++ /dev/null
@@ -1,25 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\config\ConfigurableInterface.
- */
-
-namespace Drupal\config;
-
-use Drupal\entity\StorableInterface;
-
-/**
- * Defines the interface common for all configurable entities.
- */
-interface ConfigurableInterface extends StorableInterface {
-
-  /**
-   * Returns the original ID.
-   *
-   * @return string|null
-   *   The original ID, if any.
-   */
-  public function getOriginalID();
-
-}
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigConfigurableTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
similarity index 80%
rename from core/modules/config/lib/Drupal/config/Tests/ConfigConfigurableTest.php
rename to core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
index 3e73528..54b8641 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigConfigurableTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigEntityTest.php
@@ -2,7 +2,7 @@
 
 /**
  * @file
- * Definition of Drupal\config\Tests\ConfigConfigurableTest.
+ * Definition of Drupal\config\Tests\ConfigEntityTest.
  */
 
 namespace Drupal\config\Tests;
@@ -10,9 +10,9 @@
 use Drupal\simpletest\WebTestBase;
 
 /**
- * Tests configurable entities.
+ * Tests configuration entities.
  */
-class ConfigConfigurableTest extends WebTestBase {
+class ConfigEntityTest extends WebTestBase {
 
   /**
    * Modules to enable.
@@ -23,8 +23,8 @@ class ConfigConfigurableTest extends WebTestBase {
 
   public static function getInfo() {
     return array(
-      'name' => 'Configurable entities',
-      'description' => 'Tests configurable entities.',
+      'name' => 'Configuration entities',
+      'description' => 'Tests configuration entities.',
       'group' => 'Configuration',
     );
   }
@@ -38,7 +38,7 @@ function testCRUD() {
     $label2 = $this->randomName();
     $label3 = $this->randomName();
 
-    // Create a configurable entity.
+    // Create a configuration entity.
     $edit = array(
       'id' => $id,
       'label' => $label1,
@@ -47,7 +47,7 @@ function testCRUD() {
     $this->assertResponse(200);
     $this->assertText($label1);
 
-    // Update the configurable entity.
+    // Update the configuration entity.
     $this->assertLinkByHref('admin/structure/config_test/manage/' . $id);
     $edit = array(
       'label' => $label2,
@@ -57,14 +57,14 @@ function testCRUD() {
     $this->assertNoText($label1);
     $this->assertText($label2);
 
-    // Delete the configurable entity.
+    // Delete the configuration entity.
     $this->assertLinkByHref('admin/structure/config_test/manage/' . $id . '/delete');
     $this->drupalPost('admin/structure/config_test/manage/' . $id . '/delete', array(), 'Delete');
     $this->assertResponse(200);
     $this->assertNoText($label1);
     $this->assertNoText($label2);
 
-    // Re-create a configurable entity.
+    // Re-create a configuration entity.
     $edit = array(
       'id' => $id,
       'label' => $label1,
@@ -73,7 +73,7 @@ function testCRUD() {
     $this->assertResponse(200);
     $this->assertText($label1);
 
-    // Rename the configurable entity's ID/machine name.
+    // Rename the configuration entity's ID/machine name.
     $this->assertLinkByHref('admin/structure/config_test/manage/' . $id);
     $edit = array(
       'id' => strtolower($this->randomName()),
diff --git a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallTest.php b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallTest.php
index d730554..3e6a88e 100644
--- a/core/modules/config/lib/Drupal/config/Tests/ConfigInstallTest.php
+++ b/core/modules/config/lib/Drupal/config/Tests/ConfigInstallTest.php
@@ -26,12 +26,12 @@ public static function getInfo() {
    */
   function testModuleInstallation() {
     $default_config = 'config_test.system';
-    $default_configurable = 'config_test.dynamic.default';
+    $default_configuration_entity = 'config_test.dynamic.default';
 
     // Verify that default module config does not exist before installation yet.
     $config = config($default_config);
     $this->assertIdentical($config->isNew(), TRUE);
-    $config = config($default_configurable);
+    $config = config($default_configuration_entity);
     $this->assertIdentical($config->isNew(), TRUE);
 
     // Install the test module.
@@ -40,15 +40,15 @@ function testModuleInstallation() {
     // Verify that default module config exists.
     $config = config($default_config);
     $this->assertIdentical($config->isNew(), FALSE);
-    $config = config($default_configurable);
+    $config = config($default_configuration_entity);
     $this->assertIdentical($config->isNew(), FALSE);
 
     // Verify that configuration import callback was invoked for the dynamic
-    // configurable entity.
+    // configuration entity.
     $this->assertTrue($GLOBALS['hook_config_import']);
 
     // Verify that config_test API hooks were invoked for the dynamic default
-    // configurable entity.
+    // configuration entity.
     $this->assertFalse(isset($GLOBALS['hook_config_test']['load']));
     $this->assertTrue(isset($GLOBALS['hook_config_test']['presave']));
     $this->assertTrue(isset($GLOBALS['hook_config_test']['insert']));
diff --git a/core/modules/config/tests/config_test/config_test.module b/core/modules/config/tests/config_test/config_test.module
index 5d422ad..69819fb 100644
--- a/core/modules/config/tests/config_test/config_test.module
+++ b/core/modules/config/tests/config_test/config_test.module
@@ -46,8 +46,8 @@ function config_test_config_import_change($name, $new_config, $old_config) {
     $config_test->original->$property = $value;
   }
 
-  // Iterate through each property of the new config, copying it to the
-  // configurable test object.
+  // Iterate through each property of the new config, copying it to the test
+  // object.
   foreach ($new_config->get() as $property => $value) {
     $config_test->$property = $value;
   }
@@ -177,7 +177,7 @@ function config_test_delete($id) {
  */
 function config_test_list_page() {
   $entities = entity_load_multiple('config_test');
-  uasort($entities, 'Drupal\config\ConfigurableBase::sort');
+  uasort($entities, 'Drupal\config\ConfigEntityBase::sort');
 
   $rows = array();
   foreach ($entities as $config_test) {
diff --git a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTest.php b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTest.php
index ca3550c..3f6b86a 100644
--- a/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTest.php
+++ b/core/modules/config/tests/config_test/lib/Drupal/config_test/ConfigTest.php
@@ -7,29 +7,29 @@
 
 namespace Drupal\config_test;
 
-use Drupal\config\ConfigurableBase;
+use Drupal\config\ConfigEntityBase;
 
 /**
- * Defines the ConfigTest configurable entity.
+ * Defines the ConfigTest configuration entity.
  */
-class ConfigTest extends ConfigurableBase {
+class ConfigTest extends ConfigEntityBase {
 
   /**
-   * The machine name for the configurable.
+   * The machine name for the configuration entity.
    *
    * @var string
    */
   public $id;
 
   /**
-   * The UUID for the configurable.
+   * The UUID for the configuration entity.
    *
    * @var string
    */
   public $uuid;
 
   /**
-   * The human-readable name of the configurable.
+   * The human-readable name of the configuration entity.
    *
    * @var string
    */
diff --git a/core/modules/entity/lib/Drupal/entity/ContentEntityInterface.php b/core/modules/entity/lib/Drupal/entity/ContentEntityInterface.php
new file mode 100644
index 0000000..dfafdca
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/ContentEntityInterface.php
@@ -0,0 +1,15 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity\ContentEntityInterface.
+ */
+
+namespace Drupal\entity;
+
+/**
+ * Defines a common interface for all content entity objects.
+ */
+interface ContentEntityInterface extends EntityInterface {
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php b/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
index 4e01dc4..0942f29 100644
--- a/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
+++ b/core/modules/entity/lib/Drupal/entity/DatabaseStorageController.php
@@ -174,7 +174,7 @@ public function load(array $ids = NULL) {
       if (!empty($this->entityInfo['entity class'])) {
         // We provide the necessary arguments for PDO to create objects of the
         // specified entity class.
-        // @see Drupal\entity\StorableInterface::__construct()
+        // @see Drupal\entity\EntityInterface::__construct()
         $query_result->setFetchMode(PDO::FETCH_CLASS, $this->entityInfo['entity class'], array(array(), $this->entityType));
       }
       $queried_entities = $query_result->fetchAllAssoc($this->idKey);
@@ -457,7 +457,7 @@ public function delete($ids) {
   /**
    * Implements Drupal\entity\EntityStorageControllerInterface::save().
    */
-  public function save(StorableInterface $entity) {
+  public function save(EntityInterface $entity) {
     $transaction = db_transaction();
     try {
       // Load the stored entity, if any.
@@ -502,7 +502,7 @@ public function save(StorableInterface $entity) {
    *
    * Used before the entity is saved and before invoking the presave hook.
    */
-  protected function preSave(StorableInterface $entity) { }
+  protected function preSave(EntityInterface $entity) { }
 
   /**
    * Acts on a saved entity before the insert or update hook is invoked.
@@ -514,7 +514,7 @@ protected function preSave(StorableInterface $entity) { }
    *   (bool) TRUE if the entity has been updated, or FALSE if it has been
    *   inserted.
    */
-  protected function postSave(StorableInterface $entity, $update) { }
+  protected function postSave(EntityInterface $entity, $update) { }
 
   /**
    * Acts on entities before they are deleted.
@@ -538,7 +538,7 @@ protected function postDelete($entities) { }
    * @param $entity
    *   The entity object.
    */
-  protected function invokeHook($hook, StorableInterface $entity) {
+  protected function invokeHook($hook, EntityInterface $entity) {
     if (!empty($this->entityInfo['fieldable']) && function_exists($function = 'field_attach_' . $hook)) {
       $function($this->entityType, $entity);
     }
diff --git a/core/modules/entity/lib/Drupal/entity/Entity.php b/core/modules/entity/lib/Drupal/entity/Entity.php
index 6660fc7..2d6ac5c 100644
--- a/core/modules/entity/lib/Drupal/entity/Entity.php
+++ b/core/modules/entity/lib/Drupal/entity/Entity.php
@@ -17,6 +17,271 @@
  * This class can be used as-is by simple entity types. Entity types requiring
  * special handling can extend the class.
  */
-class Entity extends StorableBase implements EntityInterface {
+class Entity implements EntityInterface {
+
+  /**
+   * The language code of the entity's default language.
+   *
+   * @var string
+   */
+  public $langcode = LANGUAGE_NOT_SPECIFIED;
+
+  /**
+   * The entity type.
+   *
+   * @var string
+   */
+  protected $entityType;
+
+  /**
+   * Boolean indicating whether the entity should be forced to be new.
+   *
+   * @var bool
+   */
+  protected $enforceIsNew;
+
+  /**
+   * Indicates whether this is the current revision.
+   *
+   * @var bool
+   */
+  public $isCurrentRevision = TRUE;
+
+  /**
+   * Constructs a new entity object.
+   */
+  public function __construct(array $values = array(), $entity_type) {
+    $this->entityType = $entity_type;
+    // Set initial values.
+    foreach ($values as $key => $value) {
+      $this->$key = $value;
+    }
+  }
+
+  /**
+   * Implements EntityInterface::id().
+   */
+  public function id() {
+    return isset($this->id) ? $this->id : NULL;
+  }
+
+  /**
+   * Implements EntityInterface::uuid().
+   */
+  public function uuid() {
+    return isset($this->uuid) ? $this->uuid : NULL;
+  }
+
+  /**
+   * Implements EntityInterface::isNew().
+   */
+  public function isNew() {
+    return !empty($this->enforceIsNew) || !$this->id();
+  }
+
+  /**
+   * Implements EntityInterface::enforceIsNew().
+   */
+  public function enforceIsNew($value = TRUE) {
+    $this->enforceIsNew = $value;
+  }
+
+  /**
+   * Implements EntityInterface::entityType().
+   */
+  public function entityType() {
+    return $this->entityType;
+  }
+
+  /**
+   * Implements EntityInterface::bundle().
+   */
+  public function bundle() {
+    return $this->entityType;
+  }
+
+  /**
+   * Implements EntityInterface::label().
+   */
+  public function label($langcode = NULL) {
+    $label = NULL;
+    $entity_info = $this->entityInfo();
+    if (isset($entity_info['label callback']) && function_exists($entity_info['label callback'])) {
+      $label = $entity_info['label callback']($this->entityType, $this, $langcode);
+    }
+    elseif (!empty($entity_info['entity keys']['label']) && isset($this->{$entity_info['entity keys']['label']})) {
+      $label = $this->{$entity_info['entity keys']['label']};
+    }
+    return $label;
+  }
+
+  /**
+   * Implements EntityInterface::uri().
+   */
+  public function uri() {
+    $bundle = $this->bundle();
+    // A bundle-specific callback takes precedence over the generic one for the
+    // entity type.
+    $entity_info = $this->entityInfo();
+    if (isset($entity_info['bundles'][$bundle]['uri callback'])) {
+      $uri_callback = $entity_info['bundles'][$bundle]['uri callback'];
+    }
+    elseif (isset($entity_info['uri callback'])) {
+      $uri_callback = $entity_info['uri callback'];
+    }
+    else {
+      return NULL;
+    }
+
+    // Invoke the callback to get the URI. If there is no callback, return NULL.
+    if (isset($uri_callback) && function_exists($uri_callback)) {
+      $uri = $uri_callback($this);
+      // Pass the entity data to url() so that alter functions do not need to
+      // look up this entity again.
+      $uri['options']['entity_type'] = $this->entityType;
+      $uri['options']['entity'] = $this;
+      return $uri;
+    }
+  }
+
+  /**
+   * Implements EntityInterface::language().
+   */
+  public function language() {
+    // @todo: Check for language.module instead, once Field API language
+    // handling depends upon it too.
+    return module_exists('locale') ? language_load($this->langcode) : FALSE;
+  }
+
+  /**
+   * Implements EntityInterface::translations().
+   */
+  public function translations() {
+    $languages = array();
+    $entity_info = $this->entityInfo();
+    if ($entity_info['fieldable'] && ($default_language = $this->language())) {
+      // 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 ($this->$field_name as $langcode => $value)  {
+            $languages[$langcode] = TRUE;
+          }
+        }
+      }
+      // Remove the default language from the translations.
+      unset($languages[$default_language->langcode]);
+      $languages = array_intersect_key(language_list(), $languages);
+    }
+    return $languages;
+  }
+
+  /**
+   * Implements EntityInterface::get().
+   */
+  public function get($property_name, $langcode = NULL) {
+    // Handle fields.
+    $entity_info = $this->entityInfo();
+    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
+      $field = field_info_field($property_name);
+      $langcode = $this->getFieldLangcode($field, $langcode);
+      return isset($this->{$property_name}[$langcode]) ? $this->{$property_name}[$langcode] : NULL;
+    }
+    else {
+      // Handle properties being not fields.
+      // @todo: Add support for translatable properties being not fields.
+      return isset($this->{$property_name}) ? $this->{$property_name} : NULL;
+    }
+  }
+
+  /**
+   * Implements EntityInterface::set().
+   */
+  public function set($property_name, $value, $langcode = NULL) {
+    // Handle fields.
+    $entity_info = $this->entityInfo();
+    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
+      $field = field_info_field($property_name);
+      $langcode = $this->getFieldLangcode($field, $langcode);
+      $this->{$property_name}[$langcode] = $value;
+    }
+    else {
+      // Handle properties being not fields.
+      // @todo: Add support for translatable properties being not fields.
+      $this->{$property_name} = $value;
+    }
+  }
+
+  /**
+   * Determines the language code to use for accessing a field value in a certain language.
+   */
+  protected function getFieldLangcode($field, $langcode = NULL) {
+    // Only apply the given langcode if the entity is language-specific.
+    // Otherwise translatable fields are handled as non-translatable fields.
+    if (field_is_translatable($this->entityType, $field) && ($default_language = $this->language()) && !language_is_locked($this->langcode)) {
+      // For translatable fields the values in default language are stored using
+      // the language code of the default language.
+      return isset($langcode) ? $langcode : $default_language->langcode;
+    }
+    else {
+      // If there is a langcode defined for this field, just return it. Otherwise
+      // return LANGUAGE_NOT_SPECIFIED.
+      return (isset($this->langcode) ? $this->langcode : LANGUAGE_NOT_SPECIFIED);
+    }
+  }
+
+  /**
+   * Implements EntityInterface::save().
+   */
+  public function save() {
+    return entity_get_controller($this->entityType)->save($this);
+  }
+
+  /**
+   * Implements EntityInterface::delete().
+   */
+  public function delete() {
+    if (!$this->isNew()) {
+      entity_get_controller($this->entityType)->delete(array($this->id()));
+    }
+  }
+
+  /**
+   * Implements EntityInterface::createDuplicate().
+   */
+  public function createDuplicate() {
+    $duplicate = clone $this;
+    $entity_info = $this->entityInfo();
+    $this->{$entity_info['entity keys']['id']} = NULL;
+
+    // Check if the entity type supports UUIDs and generate a new one if so.
+    if (!empty($entity_info['entity keys']['uuid'])) {
+      $uuid = new Uuid();
+      $duplicate->{$entity_info['entity keys']['uuid']} = $uuid->generate();
+    }
+    return $duplicate;
+  }
+
+  /**
+   * Implements EntityInterface::entityInfo().
+   */
+  public function entityInfo() {
+    return entity_get_info($this->entityType);
+  }
+
+  /**
+   * Implements Drupal\entity\EntityInterface::getRevisionId().
+   */
+  public function getRevisionId() {
+    return NULL;
+  }
+
+  /**
+   * Implements Drupal\entity\EntityInterface::isCurrentRevision().
+   */
+  public function isCurrentRevision() {
+    return $this->isCurrentRevision;
+  }
 
 }
diff --git a/core/modules/entity/lib/Drupal/entity/EntityInterface.php b/core/modules/entity/lib/Drupal/entity/EntityInterface.php
index 1fc1d0a..a111d55 100644
--- a/core/modules/entity/lib/Drupal/entity/EntityInterface.php
+++ b/core/modules/entity/lib/Drupal/entity/EntityInterface.php
@@ -10,6 +10,209 @@
 /**
  * Defines a common interface for all entity objects.
  */
-interface EntityInterface extends StorableInterface {
+interface EntityInterface {
 
+  /**
+   * Constructs a new entity object.
+   *
+   * @param $values
+   *   An array of values to set, keyed by property name. If the entity type
+   *   has bundles, the bundle key has to be specified.
+   * @param $entity_type
+   *   The type of the entity to create.
+   */
+  public function __construct(array $values, $entity_type);
+
+  /**
+   * Returns the entity identifier (the entity's machine name or numeric ID).
+   *
+   * @return
+   *   The identifier of the entity, or NULL if the entity does not yet have
+   *   an identifier.
+   */
+  public function id();
+
+  /**
+   * Returns the entity UUID (Universally Unique Identifier).
+   *
+   * The UUID is guaranteed to be unique and can be used to identify an entity
+   * across multiple systems.
+   *
+   * @return string
+   *   The UUID of the entity, or NULL if the entity does not have one.
+   */
+  public function uuid();
+
+  /**
+   * Returns whether the entity is new.
+   *
+   * Usually an entity is new if no ID exists for it yet. However, entities may
+   * be enforced to be new with existing IDs too.
+   *
+   * @return
+   *   TRUE if the entity is new, or FALSE if the entity has already been saved.
+   *
+   * @see Drupal\entity\EntityInterface::enforceIsNew()
+   */
+  public function isNew();
+
+  /**
+   * Enforces an entity to be new.
+   *
+   * Allows migrations to create entities with pre-defined IDs by forcing the
+   * entity to be new before saving.
+   *
+   * @param bool $value
+   *   (optional) Whether the entity should be forced to be new. Defaults to
+   *   TRUE.
+   *
+   * @see Drupal\entity\EntityInterface::isNew()
+   */
+  public function enforceIsNew($value = TRUE);
+
+  /**
+   * Returns the type of the entity.
+   *
+   * @return
+   *   The type of the entity.
+   */
+  public function entityType();
+
+  /**
+   * Returns the bundle of the entity.
+   *
+   * @return
+   *   The bundle of the entity. Defaults to the entity type if the entity type
+   *   does not make use of different bundles.
+   */
+  public function bundle();
+
+  /**
+   * Returns the label of the entity.
+   *
+   * @param $langcode
+   *   (optional) The language code of the language that should be used for
+   *   getting the label. If set to NULL, the entity's default language is
+   *   used.
+   *
+   * @return
+   *   The label of the entity, or NULL if there is no label defined.
+   */
+  public function label($langcode = NULL);
+
+  /**
+   * Returns the URI elements of the entity.
+   *
+   * @return
+   *   An array containing the 'path' and 'options' keys used to build the URI
+   *   of the entity, and matching the signature of url(). NULL if the entity
+   *   has no URI of its own.
+   */
+  public function uri();
+
+  /**
+   * Returns the default language of a language-specific entity.
+   *
+   * @return
+   *   The language object of the entity's default language, or FALSE if the
+   *   entity is not language-specific.
+   *
+   * @see Drupal\entity\EntityInterface::translations()
+   */
+  public function language();
+
+  /**
+   * Returns the languages the entity is translated to.
+   *
+   * @return
+   *   An array of language objects, keyed by language codes.
+   *
+   * @see Drupal\entity\EntityInterface::language()
+   */
+  public function translations();
+
+  /**
+   * Returns the value of an entity property.
+   *
+   * @param $property_name
+   *   The name of the property to return; e.g., 'title'.
+   * @param $langcode
+   *   (optional) If the property is translatable, the language code of the
+   *   language that should be used for getting the property. If set to NULL,
+   *   the entity's default language is being used.
+   *
+   * @return
+   *   The property value, or NULL if it is not defined.
+   *
+   * @see Drupal\entity\EntityInterface::language()
+   */
+  public function get($property_name, $langcode = NULL);
+
+  /**
+   * Sets the value of an entity property.
+   *
+   * @param $property_name
+   *   The name of the property to set; e.g., 'title'.
+   * @param $value
+   *   The value to set, or NULL to unset the property.
+   * @param $langcode
+   *   (optional) If the property is translatable, the language code of the
+   *   language that should be used for setting the property. If set to NULL,
+   *   the entity's default language is being used.
+   *
+   * @see Drupal\entity\EntityInterface::language()
+   */
+  public function set($property_name, $value, $langcode = NULL);
+
+  /**
+   * Saves an entity permanently.
+   *
+   * @return
+   *   Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
+   *
+   * @throws Drupal\entity\EntityStorageException
+   *   In case of failures an exception is thrown.
+   */
+  public function save();
+
+  /**
+   * Deletes an entity permanently.
+   *
+   * @throws Drupal\entity\EntityStorageException
+   *   In case of failures an exception is thrown.
+   */
+  public function delete();
+
+  /**
+   * Creates a duplicate of the entity.
+   *
+   * @return Drupal\entity\EntityInterface
+   *   A clone of the current entity with all identifiers unset, so saving
+   *   it inserts a new entity into the storage system.
+   */
+  public function createDuplicate();
+
+  /**
+   * Returns the info of the type of the entity.
+   *
+   * @see entity_get_info()
+   */
+  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 current revision.
+   *
+   * @return bool
+   *   TRUE if the entity is the current revision, FALSE otherwise.
+   */
+  public function isCurrentRevision();
 }
diff --git a/core/modules/entity/lib/Drupal/entity/StorableBase.php b/core/modules/entity/lib/Drupal/entity/StorableBase.php
deleted file mode 100644
index 57bf352..0000000
--- a/core/modules/entity/lib/Drupal/entity/StorableBase.php
+++ /dev/null
@@ -1,286 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\entity\StorableBase.
- */
-
-namespace Drupal\entity;
-
-use Drupal\Component\Uuid\Uuid;
-
-/**
- * Defines a base entity class.
- *
- * Default implementation of StorableInterface.
- *
- * This class can be used as-is by simple entity types. Entity types requiring
- * special handling can extend the class.
- */
-abstract class StorableBase implements StorableInterface {
-
-  /**
-   * The language code of the entity's default language.
-   *
-   * @var string
-   */
-  public $langcode = LANGUAGE_NOT_SPECIFIED;
-
-  /**
-   * The entity type.
-   *
-   * @var string
-   */
-  protected $entityType;
-
-  /**
-   * Boolean indicating whether the entity should be forced to be new.
-   *
-   * @var bool
-   */
-  protected $enforceIsNew;
-
-  /**
-   * Indicates whether this is the current revision.
-   *
-   * @var bool
-   */
-  public $isCurrentRevision = TRUE;
-
-  /**
-   * Constructs a new entity object.
-   */
-  public function __construct(array $values = array(), $entity_type) {
-    $this->entityType = $entity_type;
-    // Set initial values.
-    foreach ($values as $key => $value) {
-      $this->$key = $value;
-    }
-  }
-
-  /**
-   * Implements StorableInterface::id().
-   */
-  public function id() {
-    return isset($this->id) ? $this->id : NULL;
-  }
-
-  /**
-   * Implements StorableInterface::uuid().
-   */
-  public function uuid() {
-    return isset($this->uuid) ? $this->uuid : NULL;
-  }
-
-  /**
-   * Implements StorableInterface::isNew().
-   */
-  public function isNew() {
-    return !empty($this->enforceIsNew) || !$this->id();
-  }
-
-  /**
-   * Implements StorableInterface::enforceIsNew().
-   */
-  public function enforceIsNew($value = TRUE) {
-    $this->enforceIsNew = $value;
-  }
-
-  /**
-   * Implements StorableInterface::entityType().
-   */
-  public function entityType() {
-    return $this->entityType;
-  }
-
-  /**
-   * Implements StorableInterface::bundle().
-   */
-  public function bundle() {
-    return $this->entityType;
-  }
-
-  /**
-   * Implements StorableInterface::label().
-   */
-  public function label($langcode = NULL) {
-    $label = NULL;
-    $entity_info = $this->entityInfo();
-    if (isset($entity_info['label callback']) && function_exists($entity_info['label callback'])) {
-      $label = $entity_info['label callback']($this->entityType, $this, $langcode);
-    }
-    elseif (!empty($entity_info['entity keys']['label']) && isset($this->{$entity_info['entity keys']['label']})) {
-      $label = $this->{$entity_info['entity keys']['label']};
-    }
-    return $label;
-  }
-
-  /**
-   * Implements StorableInterface::uri().
-   */
-  public function uri() {
-    $bundle = $this->bundle();
-    // A bundle-specific callback takes precedence over the generic one for the
-    // entity type.
-    $entity_info = $this->entityInfo();
-    if (isset($entity_info['bundles'][$bundle]['uri callback'])) {
-      $uri_callback = $entity_info['bundles'][$bundle]['uri callback'];
-    }
-    elseif (isset($entity_info['uri callback'])) {
-      $uri_callback = $entity_info['uri callback'];
-    }
-    else {
-      return NULL;
-    }
-
-    // Invoke the callback to get the URI. If there is no callback, return NULL.
-    if (isset($uri_callback) && function_exists($uri_callback)) {
-      $uri = $uri_callback($this);
-      // Pass the entity data to url() so that alter functions do not need to
-      // look up this entity again.
-      $uri['options']['entity_type'] = $this->entityType;
-      $uri['options']['entity'] = $this;
-      return $uri;
-    }
-  }
-
-  /**
-   * Implements StorableInterface::language().
-   */
-  public function language() {
-    // @todo: Check for language.module instead, once Field API language
-    // handling depends upon it too.
-    return module_exists('locale') ? language_load($this->langcode) : FALSE;
-  }
-
-  /**
-   * Implements StorableInterface::translations().
-   */
-  public function translations() {
-    $languages = array();
-    $entity_info = $this->entityInfo();
-    if ($entity_info['fieldable'] && ($default_language = $this->language())) {
-      // 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 ($this->$field_name as $langcode => $value)  {
-            $languages[$langcode] = TRUE;
-          }
-        }
-      }
-      // Remove the default language from the translations.
-      unset($languages[$default_language->langcode]);
-      $languages = array_intersect_key(language_list(), $languages);
-    }
-    return $languages;
-  }
-
-  /**
-   * Implements StorableInterface::get().
-   */
-  public function get($property_name, $langcode = NULL) {
-    // Handle fields.
-    $entity_info = $this->entityInfo();
-    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
-      $field = field_info_field($property_name);
-      $langcode = $this->getFieldLangcode($field, $langcode);
-      return isset($this->{$property_name}[$langcode]) ? $this->{$property_name}[$langcode] : NULL;
-    }
-    else {
-      // Handle properties being not fields.
-      // @todo: Add support for translatable properties being not fields.
-      return isset($this->{$property_name}) ? $this->{$property_name} : NULL;
-    }
-  }
-
-  /**
-   * Implements StorableInterface::set().
-   */
-  public function set($property_name, $value, $langcode = NULL) {
-    // Handle fields.
-    $entity_info = $this->entityInfo();
-    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
-      $field = field_info_field($property_name);
-      $langcode = $this->getFieldLangcode($field, $langcode);
-      $this->{$property_name}[$langcode] = $value;
-    }
-    else {
-      // Handle properties being not fields.
-      // @todo: Add support for translatable properties being not fields.
-      $this->{$property_name} = $value;
-    }
-  }
-
-  /**
-   * Determines the language code to use for accessing a field value in a certain language.
-   */
-  protected function getFieldLangcode($field, $langcode = NULL) {
-    // Only apply the given langcode if the entity is language-specific.
-    // Otherwise translatable fields are handled as non-translatable fields.
-    if (field_is_translatable($this->entityType, $field) && ($default_language = $this->language()) && !language_is_locked($this->langcode)) {
-      // For translatable fields the values in default language are stored using
-      // the language code of the default language.
-      return isset($langcode) ? $langcode : $default_language->langcode;
-    }
-    else {
-      // If there is a langcode defined for this field, just return it. Otherwise
-      // return LANGUAGE_NOT_SPECIFIED.
-      return (isset($this->langcode) ? $this->langcode : LANGUAGE_NOT_SPECIFIED);
-    }
-  }
-
-  /**
-   * Implements StorableInterface::save().
-   */
-  public function save() {
-    return entity_get_controller($this->entityType)->save($this);
-  }
-
-  /**
-   * Implements StorableInterface::delete().
-   */
-  public function delete() {
-    if (!$this->isNew()) {
-      entity_get_controller($this->entityType)->delete(array($this->id()));
-    }
-  }
-
-  /**
-   * Implements StorableInterface::createDuplicate().
-   */
-  public function createDuplicate() {
-    $duplicate = clone $this;
-    $entity_info = $this->entityInfo();
-    $this->{$entity_info['entity keys']['id']} = NULL;
-
-    // Check if the entity type supports UUIDs and generate a new one if so.
-    if (!empty($entity_info['entity keys']['uuid'])) {
-      $uuid = new Uuid();
-      $duplicate->{$entity_info['entity keys']['uuid']} = $uuid->generate();
-    }
-    return $duplicate;
-  }
-
-  /**
-   * Implements StorableInterface::entityInfo().
-   */
-  public function entityInfo() {
-    return entity_get_info($this->entityType);
-  }
-
-  /**
-   * Implements Drupal\entity\StorableInterface::getRevisionId().
-   */
-  public function getRevisionId() {
-    return NULL;
-  }
-
-  /**
-   * Implements Drupal\entity\StorableInterface::isCurrentRevision().
-   */
-  public function isCurrentRevision() {
-    return $this->isCurrentRevision;
-  }
-}
diff --git a/core/modules/entity/lib/Drupal/entity/StorableInterface.php b/core/modules/entity/lib/Drupal/entity/StorableInterface.php
deleted file mode 100644
index 23bc1ea..0000000
--- a/core/modules/entity/lib/Drupal/entity/StorableInterface.php
+++ /dev/null
@@ -1,218 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\entity\StorableInterface.
- */
-
-namespace Drupal\entity;
-
-/**
- * Defines a common interface for all entity objects.
- */
-interface StorableInterface {
-
-  /**
-   * Constructs a new entity object.
-   *
-   * @param $values
-   *   An array of values to set, keyed by property name. If the entity type
-   *   has bundles, the bundle key has to be specified.
-   * @param $entity_type
-   *   The type of the entity to create.
-   */
-  public function __construct(array $values, $entity_type);
-
-  /**
-   * Returns the entity identifier (the entity's machine name or numeric ID).
-   *
-   * @return
-   *   The identifier of the entity, or NULL if the entity does not yet have
-   *   an identifier.
-   */
-  public function id();
-
-  /**
-   * Returns the entity UUID (Universally Unique Identifier).
-   *
-   * The UUID is guaranteed to be unique and can be used to identify an entity
-   * across multiple systems.
-   *
-   * @return string
-   *   The UUID of the entity, or NULL if the entity does not have one.
-   */
-  public function uuid();
-
-  /**
-   * Returns whether the entity is new.
-   *
-   * Usually an entity is new if no ID exists for it yet. However, entities may
-   * be enforced to be new with existing IDs too.
-   *
-   * @return
-   *   TRUE if the entity is new, or FALSE if the entity has already been saved.
-   *
-   * @see Drupal\entity\StorableInterface::enforceIsNew()
-   */
-  public function isNew();
-
-  /**
-   * Enforces an entity to be new.
-   *
-   * Allows migrations to create entities with pre-defined IDs by forcing the
-   * entity to be new before saving.
-   *
-   * @param bool $value
-   *   (optional) Whether the entity should be forced to be new. Defaults to
-   *   TRUE.
-   *
-   * @see Drupal\entity\StorableInterface::isNew()
-   */
-  public function enforceIsNew($value = TRUE);
-
-  /**
-   * Returns the type of the entity.
-   *
-   * @return
-   *   The type of the entity.
-   */
-  public function entityType();
-
-  /**
-   * Returns the bundle of the entity.
-   *
-   * @return
-   *   The bundle of the entity. Defaults to the entity type if the entity type
-   *   does not make use of different bundles.
-   */
-  public function bundle();
-
-  /**
-   * Returns the label of the entity.
-   *
-   * @param $langcode
-   *   (optional) The language code of the language that should be used for
-   *   getting the label. If set to NULL, the entity's default language is
-   *   used.
-   *
-   * @return
-   *   The label of the entity, or NULL if there is no label defined.
-   */
-  public function label($langcode = NULL);
-
-  /**
-   * Returns the URI elements of the entity.
-   *
-   * @return
-   *   An array containing the 'path' and 'options' keys used to build the URI
-   *   of the entity, and matching the signature of url(). NULL if the entity
-   *   has no URI of its own.
-   */
-  public function uri();
-
-  /**
-   * Returns the default language of a language-specific entity.
-   *
-   * @return
-   *   The language object of the entity's default language, or FALSE if the
-   *   entity is not language-specific.
-   *
-   * @see Drupal\entity\StorableInterface::translations()
-   */
-  public function language();
-
-  /**
-   * Returns the languages the entity is translated to.
-   *
-   * @return
-   *   An array of language objects, keyed by language codes.
-   *
-   * @see Drupal\entity\StorableInterface::language()
-   */
-  public function translations();
-
-  /**
-   * Returns the value of an entity property.
-   *
-   * @param $property_name
-   *   The name of the property to return; e.g., 'title'.
-   * @param $langcode
-   *   (optional) If the property is translatable, the language code of the
-   *   language that should be used for getting the property. If set to NULL,
-   *   the entity's default language is being used.
-   *
-   * @return
-   *   The property value, or NULL if it is not defined.
-   *
-   * @see Drupal\entity\StorableInterface::language()
-   */
-  public function get($property_name, $langcode = NULL);
-
-  /**
-   * Sets the value of an entity property.
-   *
-   * @param $property_name
-   *   The name of the property to set; e.g., 'title'.
-   * @param $value
-   *   The value to set, or NULL to unset the property.
-   * @param $langcode
-   *   (optional) If the property is translatable, the language code of the
-   *   language that should be used for setting the property. If set to NULL,
-   *   the entity's default language is being used.
-   *
-   * @see Drupal\entity\StorableInterface::language()
-   */
-  public function set($property_name, $value, $langcode = NULL);
-
-  /**
-   * Saves an entity permanently.
-   *
-   * @return
-   *   Either SAVED_NEW or SAVED_UPDATED, depending on the operation performed.
-   *
-   * @throws Drupal\entity\EntityStorageException
-   *   In case of failures an exception is thrown.
-   */
-  public function save();
-
-  /**
-   * Deletes an entity permanently.
-   *
-   * @throws Drupal\entity\EntityStorageException
-   *   In case of failures an exception is thrown.
-   */
-  public function delete();
-
-  /**
-   * Creates a duplicate of the entity.
-   *
-   * @return Drupal\entity\StorableInterface
-   *   A clone of the current entity with all identifiers unset, so saving
-   *   it inserts a new entity into the storage system.
-   */
-  public function createDuplicate();
-
-  /**
-   * Returns the info of the type of the entity.
-   *
-   * @see entity_get_info()
-   */
-  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 current revision.
-   *
-   * @return bool
-   *   TRUE if the entity is the current revision, FALSE otherwise.
-   */
-  public function isCurrentRevision();
-}
diff --git a/core/modules/entity/lib/Drupal/entity/StorageControllerInterface.php b/core/modules/entity/lib/Drupal/entity/StorageControllerInterface.php
index 8b5c4fd..00c323e 100644
--- a/core/modules/entity/lib/Drupal/entity/StorageControllerInterface.php
+++ b/core/modules/entity/lib/Drupal/entity/StorageControllerInterface.php
@@ -54,7 +54,7 @@ public function load(array $ids = NULL);
    * @param int $revision_id
    *   The revision id.
    *
-   * @return Drupal\entity\StorableInterface|false
+   * @return Drupal\entity\EntityInterface|false
    *   The specified entity revision or FALSE if not found.
    */
   public function loadRevision($revision_id);
@@ -78,7 +78,7 @@ public function loadByProperties(array $values);
    *   An array of values to set, keyed by property name. If the entity type has
    *   bundles the bundle key has to be specified.
    *
-   * @return Drupal\entity\StorableInterface
+   * @return Drupal\entity\EntityInterface
    *   A new entity object.
    */
   public function create(array $values);
@@ -97,7 +97,7 @@ public function delete($ids);
   /**
    * Saves the entity permanently.
    *
-   * @param Drupal\entity\StorableInterface $entity
+   * @param Drupal\entity\EntityInterface $entity
    *   The entity to save.
    *
    * @return
@@ -107,6 +107,6 @@ public function delete($ids);
    * @throws Drupal\entity\EntityStorageException
    *   In case of failures, an exception is thrown.
    */
-  public function save(StorableInterface $entity);
+  public function save(EntityInterface $entity);
 
 }
diff --git a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
index 4fac83c..b31e5ce 100644
--- a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
+++ b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
@@ -9,7 +9,7 @@
 
 use PDO;
 
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
 
 /**
@@ -84,7 +84,7 @@ protected function attachLoad(&$queried_entities, $load_revision = FALSE) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  protected function postSave(StorableInterface $entity, $update) {
+  protected function postSave(EntityInterface $entity, $update) {
     $default_langcode = ($language = $entity->language()) ? $language->langcode : LANGUAGE_NOT_SPECIFIED;
     $langcodes = array_keys($entity->translations());
     $langcodes[] = $default_langcode;
diff --git a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityController.php b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityController.php
index 49129ca..3bdab77 100644
--- a/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityController.php
+++ b/core/modules/field/tests/modules/field_test/lib/Drupal/field_test/TestEntityController.php
@@ -8,7 +8,7 @@
 namespace Drupal\field_test;
 
 use Drupal\entity\DatabaseStorageController;
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 
 /**
  * Controller class for the test entity entity types.
@@ -18,7 +18,7 @@ class TestEntityController extends DatabaseStorageController {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::preSave().
    */
-  public function preSave(StorableInterface $entity) {
+  public function preSave(EntityInterface $entity) {
     // Prepare for a new revision.
     if (!$entity->isNew() && !empty($entity->revision)) {
       $entity->old_ftvid = $entity->ftvid;
@@ -29,7 +29,7 @@ public function preSave(StorableInterface $entity) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  public function postSave(StorableInterface $entity, $update) {
+  public function postSave(EntityInterface $entity, $update) {
     // Only the test_entity entity type has revisions.
     if ($entity->entityType() == 'test_entity') {
       $update_entity = TRUE;
diff --git a/core/modules/file/lib/Drupal/file/FileStorageController.php b/core/modules/file/lib/Drupal/file/FileStorageController.php
index d2d117e..356e5c4 100644
--- a/core/modules/file/lib/Drupal/file/FileStorageController.php
+++ b/core/modules/file/lib/Drupal/file/FileStorageController.php
@@ -8,7 +8,7 @@
 namespace Drupal\file;
 
 use Drupal\entity\DatabaseStorageController;
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 
 /**
  * File storage controller for files.
@@ -34,7 +34,7 @@ public function create(array $values) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::presave().
    */
-  protected function preSave(StorableInterface $entity) {
+  protected function preSave(EntityInterface $entity) {
     $entity->timestamp = REQUEST_TIME;
     $entity->filesize = filesize($entity->uri);
     if (!isset($entity->langcode)) {
diff --git a/core/modules/node/lib/Drupal/node/Node.php b/core/modules/node/lib/Drupal/node/Node.php
index fd3454e..a96f309 100644
--- a/core/modules/node/lib/Drupal/node/Node.php
+++ b/core/modules/node/lib/Drupal/node/Node.php
@@ -7,12 +7,13 @@
 
 namespace Drupal\node;
 
+use Drupal\entity\ContentEntityInterface;
 use Drupal\entity\Entity;
 
 /**
  * Defines the node entity class.
  */
-class Node extends Entity {
+class Node extends Entity implements ContentEntityInterface {
 
   /**
    * The node ID.
diff --git a/core/modules/node/lib/Drupal/node/NodeStorageController.php b/core/modules/node/lib/Drupal/node/NodeStorageController.php
index ee47546..898aa71 100644
--- a/core/modules/node/lib/Drupal/node/NodeStorageController.php
+++ b/core/modules/node/lib/Drupal/node/NodeStorageController.php
@@ -8,7 +8,7 @@
 namespace Drupal\node;
 
 use Drupal\entity\DatabaseStorageController;
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\EntityStorageException;
 use Exception;
 
@@ -82,7 +82,7 @@ public function delete($ids) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::save().
    */
-  public function save(StorableInterface $entity) {
+  public function save(EntityInterface $entity) {
     $transaction = db_transaction();
     try {
       // Load the stored entity, if any.
@@ -129,10 +129,10 @@ public function save(StorableInterface $entity) {
   /**
    * Saves a node revision.
    *
-   * @param Drupal\entity\StorableInterface $node
+   * @param Drupal\entity\EntityInterface $node
    *   The node entity.
    */
-  protected function saveRevision(StorableInterface $entity) {
+  protected function saveRevision(EntityInterface $entity) {
     $record = clone $entity;
     $record->uid = $entity->revision_uid;
     $record->timestamp = $entity->revision_timestamp;
@@ -197,7 +197,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::invokeHook().
    */
-  protected function invokeHook($hook, StorableInterface $node) {
+  protected function invokeHook($hook, EntityInterface $node) {
     if ($hook == 'insert' || $hook == 'update') {
       node_invoke($node, $hook);
     }
@@ -246,7 +246,7 @@ protected function invokeHook($hook, StorableInterface $node) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::preSave().
    */
-  protected function preSave(StorableInterface $node) {
+  protected function preSave(EntityInterface $node) {
     // Before saving the node, set changed and revision times.
     $node->changed = REQUEST_TIME;
 
@@ -262,7 +262,7 @@ protected function preSave(StorableInterface $node) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  function postSave(StorableInterface $node, $update) {
+  function postSave(EntityInterface $node, $update) {
     node_access_acquire_grants($node, $update);
   }
 
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/Term.php b/core/modules/taxonomy/lib/Drupal/taxonomy/Term.php
index 929422c..87d823a 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/Term.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/Term.php
@@ -7,12 +7,13 @@
 
 namespace Drupal\taxonomy;
 
+use Drupal\entity\ContentEntityInterface;
 use Drupal\entity\Entity;
 
 /**
  * Defines the taxonomy term entity.
  */
-class Term extends Entity {
+class Term extends Entity implements ContentEntityInterface {
 
   /**
    * The taxonomy term ID.
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
index e90699d..961ebf0 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/TermStorageController.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\taxonomy;
 
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
 
 /**
@@ -99,7 +99,7 @@ protected function postDelete($entities) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  protected function postSave(StorableInterface $entity, $update) {
+  protected function postSave(EntityInterface $entity, $update) {
     if (isset($entity->parent)) {
       db_delete('taxonomy_term_hierarchy')
         ->condition('tid', $entity->tid)
diff --git a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
index 77f5ce7..8f4ef5b 100644
--- a/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
+++ b/core/modules/taxonomy/lib/Drupal/taxonomy/VocabularyStorageController.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\taxonomy;
 
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
 
 /**
@@ -29,7 +29,7 @@ protected function buildQuery($ids, $revision_id = FALSE) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  protected function postSave(StorableInterface $entity, $update) {
+  protected function postSave(EntityInterface $entity, $update) {
     if (!$update) {
       field_attach_create_bundle('taxonomy_term', $entity->machine_name);
     }
diff --git a/core/modules/user/lib/Drupal/user/UserStorageController.php b/core/modules/user/lib/Drupal/user/UserStorageController.php
index 1bc70d8..bd57591 100644
--- a/core/modules/user/lib/Drupal/user/UserStorageController.php
+++ b/core/modules/user/lib/Drupal/user/UserStorageController.php
@@ -7,7 +7,7 @@
 
 namespace Drupal\user;
 
-use Drupal\entity\StorableInterface;
+use Drupal\entity\EntityInterface;
 use Drupal\entity\EntityMalformedException;
 use Drupal\entity\DatabaseStorageController;
 
@@ -75,7 +75,7 @@ public function create(array $values) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::save().
    */
-  public function save(StorableInterface $entity) {
+  public function save(EntityInterface $entity) {
     if (empty($entity->uid)) {
       $entity->uid = db_next_id(db_query('SELECT MAX(uid) FROM {users}')->fetchField());
       $entity->enforceIsNew();
@@ -86,7 +86,7 @@ public function save(StorableInterface $entity) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::preSave().
    */
-  protected function preSave(StorableInterface $entity) {
+  protected function preSave(EntityInterface $entity) {
     // Update the user password if it has changed.
     if ($entity->isNew() || (!empty($entity->pass) && $entity->pass != $entity->original->pass)) {
       // Allow alternate password hashing schemes.
@@ -160,7 +160,7 @@ protected function preSave(StorableInterface $entity) {
   /**
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
-  protected function postSave(StorableInterface $entity, $update) {
+  protected function postSave(EntityInterface $entity, $update) {
 
     if ($update) {
       // If the password has been changed, delete all open sessions for the
