diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
index 5eb245f..5fc193b 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
@@ -57,10 +57,10 @@ class EntityApiTest extends WebTestBase {
 
     // Test updating an entity.
     $entities = array_values(entity_test_load_multiple(FALSE, array('name' => 'test')));
-    $entities[0]->name = 'test3';
+    $entities[0]->set('name', 'test3');
     $entities[0]->save();
     $entity = entity_test_load($entities[0]->id);
-    $this->assertEqual($entity->name, 'test3', 'Entity updated.');
+    $this->assertEqual($entity->get('name'), 'test3', 'Entity updated.');
 
     // Try deleting multiple test entities by deleting all.
     $ids = array_keys(entity_test_load_multiple(FALSE));
@@ -78,15 +78,10 @@ class EntityApiTest extends WebTestBase {
     $this->assertNull($entity->get('uid'), 'Property is not set.');
 
     $entity->set('uid', $GLOBALS['user']->uid);
-    $this->assertEqual($entity->uid, $GLOBALS['user']->uid, 'Property has been set.');
+    $this->assertEqual($entity->get('uid'), $GLOBALS['user']->uid, 'Property has been set.');
 
     $value = $entity->get('uid');
-    $this->assertEqual($value, $entity->uid, 'Property has been retrieved.');
-
-    // Make sure setting/getting translations boils down to setting/getting the
-    // regular value as the entity and property are not translatable.
-    $entity->set('uid', NULL, 'en');
-    $this->assertNull($entity->uid, 'Language neutral property has been set.');
+    $this->assertEqual($value, $entity->get('uid'), 'Property has been retrieved.');
 
     $value = $entity->get('uid', 'en');
     $this->assertNull($value, 'Language neutral property has been retrieved.');
diff --git a/core/modules/entity/tests/modules/entity_test/entity_test.install b/core/modules/entity/tests/modules/entity_test/entity_test.install
index c0c7703..e61e6c7 100644
--- a/core/modules/entity/tests/modules/entity_test/entity_test.install
+++ b/core/modules/entity/tests/modules/entity_test/entity_test.install
@@ -43,6 +43,39 @@ function entity_test_schema() {
         'not null' => TRUE,
         'description' => 'Primary Key: Unique entity-test item ID.',
       ),
+      'langcode' => array(
+        'description' => 'The {language}.langcode of the original variant of this test entity.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+    ),
+    'primary key' => array('id'),
+  );
+  $schema['entity_test_property_data'] = array(
+    'description' => 'Stores entity_test item properties.',
+    'fields' => array(
+      'id' => array(
+        'type' => 'int',
+        'unsigned' => TRUE,
+        'not null' => TRUE,
+        'description' => 'The {entity_test}.id of the test entity.',
+      ),
+      'langcode' => array(
+        'description' => 'The {language}.langcode of this variant of this test entity.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
+      'source_langcode' => array(
+        'description' => 'The {language}.langcode of the original variant of this test entity.',
+        'type' => 'varchar',
+        'length' => 12,
+        'not null' => TRUE,
+        'default' => '',
+      ),
       'name' => array(
         'description' => 'The name of the test entity.',
         'type' => 'varchar',
@@ -57,21 +90,15 @@ function entity_test_schema() {
         'default' => NULL,
         'description' => "The {users}.uid of the associated user.",
       ),
-      'langcode' => array(
-        'description' => 'The {language}.langcode of the test entity.',
-        'type' => 'varchar',
-        'length' => 12,
-        'not null' => TRUE,
-        'default' => '',
-      ),
     ),
     'indexes' => array(
       'uid' => array('uid'),
     ),
     'foreign keys' => array(
       'uid' => array('users' => 'uid'),
+      'id' => array('entity_test' => 'id'),
     ),
-    'primary key' => array('id'),
+    'primary key' => array('id', 'langcode'),
   );
   return $schema;
 }
diff --git a/core/modules/entity/tests/modules/entity_test/entity_test.module b/core/modules/entity/tests/modules/entity_test/entity_test.module
index f97d2e9..2650222 100644
--- a/core/modules/entity/tests/modules/entity_test/entity_test.module
+++ b/core/modules/entity/tests/modules/entity_test/entity_test.module
@@ -11,8 +11,8 @@
 function entity_test_entity_info() {
   $items['entity_test'] = array(
     'label' => t('Test entity'),
-    'entity class' => 'Drupal\entity\Entity',
-    'controller class' => 'Drupal\entity\DatabaseStorageController',
+    'entity class' => 'Drupal\entity_test\EntityTest',
+    'controller class' => 'Drupal\entity_test\EntityTestStorageController',
     'base table' => 'entity_test',
     'fieldable' => TRUE,
     'entity keys' => array(
@@ -34,7 +34,7 @@ function entity_test_entity_info() {
  * @param bool $reset
  *   A boolean indicating that the internal cache should be reset.
  *
- * @return Drupal\entity\Entity
+ * @return Drupal\entity_test\EntityTest
  *   The loaded entity object, or FALSE if the entity cannot be loaded.
  */
 function entity_test_load($id, $reset = FALSE) {
diff --git a/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php
new file mode 100644
index 0000000..4c5e3e2
--- /dev/null
+++ b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTest.php
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity_test\EntityTest.
+ */
+
+namespace Drupal\entity_test;
+
+use Drupal\entity\Entity;
+
+/**
+ * Defines the test entity class.
+ */
+class EntityTest extends Entity {
+
+  /**
+   * An array keyed by language code where the entity properties are stored.
+   *
+   * @var array
+   */
+  protected $properties;
+
+  /**
+   * Constructs a new entity object.
+   */
+  public function __construct(array $values = array(), $entity_type) {
+    $values['langcode'] = $this->resolvePropertyLangcode(!empty($values['langcode']) ? $values['langcode'] : NULL);
+    $langcode = $values['langcode'];
+
+    if (empty($values['source_langcode'])) {
+      $this->langcode = $langcode;
+      parent::__construct($values, $entity_type);
+    }
+    else {
+      $this->entityType = $entity_type;
+    }
+
+    foreach ($values as $property_name => $value) {
+      $this->set($property_name, $value, $langcode);
+    }
+  }
+
+  /**
+   * Overrides EntityInterface::get().
+   */
+  public function get($property_name, $langcode = NULL) {
+    $entity_info = $this->entityInfo();
+    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
+      return parent::get($property_name, $langcode);
+    }
+    else {
+      $langcode = $this->resolvePropertyLangcode($langcode);
+      return isset($this->properties[$langcode][$property_name]) ? $this->properties[$langcode][$property_name] : NULL;
+    }
+  }
+
+  /**
+   * Overrides EntityInterface::set().
+   */
+  public function set($property_name, $value, $langcode = NULL) {
+    $entity_info = $this->entityInfo();
+    if ($entity_info['fieldable'] && field_info_instance($this->entityType, $property_name, $this->bundle())) {
+      parent::set($property_name, $value, $langcode);
+    }
+    else {
+      $langcode = $this->resolvePropertyLangcode($langcode);
+      $this->properties[$langcode][$property_name] = $value;
+    }
+  }
+
+  /**
+   * Overrides EntityInterface::translations().
+   */
+  public function translations() {
+    $translations = !empty($this->properties) ? $this->properties : array();
+    $languages = array_intersect_key(language_list(), $translations);
+    unset($languages[$this->resolvePropertyLangcode()]);
+    return $languages + parent::translations();
+  }
+
+  /**
+   * Returns the property array for the given language.
+   *
+   * @param string $langcode
+   *   (optional) The language code to be used to retrieve the properties.
+   */
+  public function getProperties($langcode = NULL) {
+    $langcode = $this->resolvePropertyLangcode($langcode);
+    return isset($this->properties[$langcode]) ? $this->properties[$langcode] : array();
+  }
+
+  /**
+   * Sets the property array for the given language.
+   *
+   * @param array $properties
+   *   A keyed array of properties to be set with their 'langcode' as one of the
+   *   keys. If no language is provided the entity langauge is used.
+   */
+  public function setProperties(array $properties) {
+    $langcode = isset($properties['langcode']) ? $properties['langcode'] : NULL;
+    $langcode = $this->resolvePropertyLangcode($langcode);
+    $this->properties[$langcode] = $properties;
+  }
+
+  /**
+   * Returns a valid language code to be used to manipulate entity properties.
+   */
+  protected function resolvePropertyLangcode($langcode = NULL) {
+    if (empty($langcode)) {
+      $langcode = $this->langcode;
+    }
+    $languages = language_list();
+    return isset($languages[$langcode]) ? $langcode : LANGUAGE_NOT_SPECIFIED;
+  }
+}
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
new file mode 100644
index 0000000..71759d0
--- /dev/null
+++ b/core/modules/entity/tests/modules/entity_test/lib/Drupal/entity_test/EntityTestStorageController.php
@@ -0,0 +1,87 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\entity_test\EntityTestStorageController.
+ */
+
+namespace Drupal\entity_test;
+
+use Drupal\entity\EntityInterface;
+use Drupal\entity\DatabaseStorageController;
+
+/**
+ * Defines the controller class for the test entity.
+ *
+ * This extends the Drupal\entity\DatabaseStorageController class, adding
+ * required special handling for test entities.
+ */
+class EntityTestStorageController extends DatabaseStorageController {
+
+  /**
+   * Overrides Drupal\entity\DatabaseStorageController::buildQuery().
+   */
+  protected function buildQuery($ids, $conditions = array(), $revision_id = FALSE) {
+    $query = db_select('entity_test_property_data', 'data');
+
+    $query->addTag($this->entityType . '_load_multiple');
+
+    // Select the actual data.
+    $query->fields('data');
+
+    // Set conditions.
+    foreach ($conditions as $field => $value) {
+      $query->condition('data.' . $field, $value);
+    }
+
+    return $query;
+  }
+
+  /**
+   * Overrides Drupal\entity\DatabaseStorageController::attachLoad().
+   */
+  protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
+    $data = db_select('entity_test_property_data', 'data')
+      ->fields('data')
+      ->condition('id', array_keys($queried_entities))
+      ->orderBy('data.id')
+      ->execute();
+
+    foreach ($data as $row) {
+      $properties = (array) $row;
+      $queried_entities[$properties['id']]->setProperties($properties);
+    }
+
+    parent::attachLoad($queried_entities, $revision_id);
+  }
+
+  /**
+   * Overrides Drupal\entity\DatabaseStorageController::postSave().
+   */
+  protected function postSave(EntityInterface $entity, $update) {
+    $langcodes = array_keys($entity->translations());
+    $langcodes[] = ($language = $entity->language()) ? $language->langcode : LANGUAGE_NOT_SPECIFIED;
+
+    foreach ($langcodes as $langcode) {
+      $properties = $entity->getProperties($langcode);
+
+      if (!empty($properties)) {
+        $properties['id'] = $entity->id();
+        db_merge('entity_test_property_data')
+          ->fields($properties)
+          ->condition('id', $properties['id'])
+          ->condition('langcode', $properties['langcode'])
+          ->execute();
+      }
+    }
+  }
+
+  /**
+   * Overrides Drupal\entity\DatabaseStorageController::postDelete().
+   */
+  protected function postDelete($entities) {
+    db_delete('entity_test_property_data')
+      ->condition('id', array_keys($entities))
+      ->execute();
+  }
+}
