diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
index 5fc193b..a5488e5 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityApiTest.php
@@ -83,6 +83,11 @@ class EntityApiTest extends WebTestBase {
     $value = $entity->get('uid');
     $this->assertEqual($value, $entity->get('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.');
+
     $value = $entity->get('uid', 'en');
     $this->assertNull($value, 'Language neutral property has been retrieved.');
   }
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
index 0dc5e39..734971f 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
@@ -132,67 +132,65 @@ class EntityTranslationTest extends WebTestBase {
     $entity = entity_create('entity_test', array('name' => $name, 'uid' => $uid));
     $entity->save();
     $entity = entity_test_load($entity->id());
-    $this->assertEqual($entity->language()->langcode, LANGUAGE_NOT_SPECIFIED, t('Entity created as language neutral.'));
-    $this->assertEqual($name, $entity->get('name', LANGUAGE_NOT_SPECIFIED), t('The entity name has been correctly stored as language neutral.'));
-    $this->assertEqual($uid, $entity->get('uid', LANGUAGE_NOT_SPECIFIED), t('The entity author has been correctly stored as language neutral.'));
-    $this->assertFalse($entity->get('name', $langcode), t('The entity name is not available as a language-aware property.'));
-    $this->assertFalse($entity->get('uid', $langcode), t('The entity author is not available as a language-aware property.'));
+    $this->assertEqual($entity->language()->langcode, LANGUAGE_NOT_SPECIFIED, 'Entity created as language neutral.');
+    $this->assertEqual($name, $entity->get('name', LANGUAGE_NOT_SPECIFIED), 'The entity name has been correctly stored as language neutral.');
+    $this->assertEqual($uid, $entity->get('uid', LANGUAGE_NOT_SPECIFIED), 'The entity author has been correctly stored as language neutral.');
+    $this->assertFalse($entity->get('name', $langcode), 'The entity name is not available as a language-aware property.');
+    $this->assertFalse($entity->get('uid', $langcode), 'The entity author is not available as a language-aware property.');
 
     // Create a language-aware entity and check that properties are stored
     // as language-aware.
     $entity = entity_create('entity_test', array('name' => $name, 'uid' => $uid, 'langcode' => $langcode));
     $entity->save();
     $entity = entity_test_load($entity->id());
-    $this->assertEqual($entity->language()->langcode, $langcode, t('Entity created as language neutral.'));
-    $this->assertEqual($name, $entity->get('name', $langcode), t('The entity name has been correctly stored as a language-aware property.'));
-    $this->assertEqual($uid, $entity->get('uid', $langcode), t('The entity author has been correctly stored as a language-aware property.'));
-    $this->assertFalse($entity->get('name', LANGUAGE_NOT_SPECIFIED), t('The entity name is not available as a language neutral property.'));
-    $this->assertFalse($entity->get('uid', LANGUAGE_NOT_SPECIFIED), t('The entity author is not available as a language neutral property.'));
+    $this->assertEqual($entity->language()->langcode, $langcode, 'Entity created as language neutral.');
+    $this->assertEqual($name, $entity->get('name', $langcode), 'The entity name has been correctly stored as a language-aware property.');
+    $this->assertEqual($uid, $entity->get('uid', $langcode), 'The entity author has been correctly stored as a language-aware property.');
+    $this->assertFalse($entity->get('name', LANGUAGE_NOT_SPECIFIED), 'The entity name is not available as a language neutral property.');
+    $this->assertFalse($entity->get('uid', LANGUAGE_NOT_SPECIFIED), 'The entity author is not available as a language neutral property.');
 
     // Create property translations.
     $properties = array();
-    $source_langcode = $langcode;
+    $default_langcode = $langcode;
     foreach ($this->langcodes as $langcode) {
-      if ($langcode != $source_langcode) {
+      if ($langcode != $default_langcode) {
         $properties[$langcode] = array(
           'name' => $this->randomName(),
           'uid' => mt_rand(0, 127),
-          'langcode' => $langcode,
-          'source_langcode' => $source_langcode,
         );
       }
       else {
         $properties[$langcode] = array(
           'name' => $name,
           'uid' => $uid,
-          'langcode' => $langcode,
         );
       }
-      $entity->setProperties($properties[$langcode]);
+      $entity->setProperties($properties[$langcode], $langcode);
     }
     $entity->save();
 
     // Check that property translation were correctly stored.
     $entity = entity_test_load($entity->id());
-    $languages = language_list();
     foreach ($this->langcodes as $langcode) {
-      $t_args = array('%language' => $languages[$langcode]->name);
-      $this->assertEqual($properties[$langcode]['name'], $entity->get('name', $langcode), t('The entity name has been correctly stored for language %language.', $t_args));
-      $this->assertEqual($properties[$langcode]['uid'], $entity->get('uid', $langcode), t('The entity author has been correctly stored for language %language.', $t_args));
+      $args = array('%langcode' => $langcode);
+      $this->assertEqual($properties[$langcode]['name'], $entity->get('name', $langcode), format_string('The entity name has been correctly stored for language %langcode.', $args));
+      $this->assertEqual($properties[$langcode]['uid'], $entity->get('uid', $langcode), format_string('The entity author has been correctly stored for language %langcode.', $args));
     }
 
-    // Test query conditions.
+    // Test query conditions (cache is reset at each call).
     $translated_id = $entity->id();
     entity_create('entity_test', array())->save();
-    $entities = entity_test_load_multiple(FALSE);
-    $this->assertEqual(count($entities), 3, t('Three entities were created.'));
-    $entities = entity_test_load_multiple(array($translated_id));
-    $this->assertEqual(count($entities), 1, t('One entity correctly loaded by id.'));
-    $entities = entity_test_load_multiple(array(), array('name' => $name));
-    $this->assertEqual(count($entities), 2, t('Two entities correctly loaded by name.'));
-    $entities = entity_test_load_multiple(array(), array('name' => $properties[$langcode]['name']));
-    $this->assertEqual(count($entities), 0, t('No entity loaded by name translation without specifying a language.'));
-    $entities = entity_test_load_multiple(array(), array('langcode' => $langcode, 'name' => $properties[$langcode]['name']));
-    $this->assertEqual(count($entities), 1, t('One entity correctly loaded by name translation.'));
+    $entities = entity_test_load_multiple(FALSE, array(), TRUE);
+    $this->assertEqual(count($entities), 3, 'Three entities were created.');
+    $entities = entity_test_load_multiple(array($translated_id), array(), TRUE);
+    $this->assertEqual(count($entities), 1, 'One entity correctly loaded by id.');
+    $entities = entity_test_load_multiple(array(), array('name' => $name), TRUE);
+    $this->assertEqual(count($entities), 2, 'Two entities correctly loaded by name.');
+    $entities = entity_test_load_multiple(array(), array('name' => $properties[$langcode]['name']), TRUE);
+    $this->assertEqual(count($entities), 1, 'One entity correctly loaded by name translation.');
+    $entities = entity_test_load_multiple(array(), array('langcode' => $default_langcode, 'name' => $name), TRUE);
+    $this->assertEqual(count($entities), 1, 'One entity correctly loaded by name and language.');
+    $entities = entity_test_load_multiple(array(), array('langcode' => $langcode, 'name' => $properties[$langcode]['name']), TRUE);
+    $this->assertEqual(count($entities), 0, 'No entity loaded by name translation specifying the translation language.');
   }
 }
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 e61e6c7..1de8732 100644
--- a/core/modules/entity/tests/modules/entity_test/entity_test.install
+++ b/core/modules/entity/tests/modules/entity_test/entity_test.install
@@ -69,12 +69,11 @@ function entity_test_schema() {
         'not null' => TRUE,
         'default' => '',
       ),
-      'source_langcode' => array(
-        'description' => 'The {language}.langcode of the original variant of this test entity.',
-        'type' => 'varchar',
-        'length' => 12,
+      'default_langcode' => array(
+        'description' => 'Boolean indicating whether the current variant is in the original entity language.',
+        'type' => 'int',
         'not null' => TRUE,
-        'default' => '',
+        'default' => 1,
       ),
       'name' => array(
         'description' => 'The name of the test entity.',
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
index 4c5e3e2..3cf3823 100644
--- 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
@@ -22,26 +22,39 @@ class EntityTest extends Entity {
   protected $properties;
 
   /**
+   * An array of allowed language codes.
+   *
+   * @var array
+   */
+  protected $langcodes;
+
+  /**
    * 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'];
+    parent::__construct($values, $entity_type);
 
-    if (empty($values['source_langcode'])) {
-      $this->langcode = $langcode;
-      parent::__construct($values, $entity_type);
-    }
-    else {
-      $this->entityType = $entity_type;
-    }
+    $this->langcodes = drupal_map_assoc(array_keys(language_list()));
+    $this->langcode = $this->resolvePropertyLangcode(!empty($values['langcode']) ? $values['langcode'] : NULL);
 
+    // Set initial values ensuring that only real properties are stored.
     foreach ($values as $property_name => $value) {
-      $this->set($property_name, $value, $langcode);
+      if ($property_name != 'id' && $property_name != 'langcode' && $property_name != 'default_langcode') {
+        $this->properties[$this->langcode][$property_name] = $value;
+      }
     }
   }
 
   /**
+   * Sets the entity default langcode.
+   *
+   * @param $langcode
+   */
+  public function setLangcode($langcode) {
+    $this->langcode = $langcode;
+  }
+
+  /**
    * Overrides EntityInterface::get().
    */
   public function get($property_name, $langcode = NULL) {
@@ -74,7 +87,7 @@ class EntityTest extends Entity {
    */
   public function translations() {
     $translations = !empty($this->properties) ? $this->properties : array();
-    $languages = array_intersect_key(language_list(), $translations);
+    $languages = array_intersect_key($this->langcodes, $translations);
     unset($languages[$this->resolvePropertyLangcode()]);
     return $languages + parent::translations();
   }
@@ -97,8 +110,9 @@ class EntityTest extends Entity {
    *   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;
+  public function setProperties(array $properties, $langcode = NULL) {
+    // Make sure only real properties are stored.
+    unset($properties['id'], $properties['langcode'], $properties['default_langcode']);
     $langcode = $this->resolvePropertyLangcode($langcode);
     $this->properties[$langcode] = $properties;
   }
@@ -110,7 +124,6 @@ class EntityTest extends Entity {
     if (empty($langcode)) {
       $langcode = $this->langcode;
     }
-    $languages = language_list();
-    return isset($languages[$langcode]) ? $langcode : LANGUAGE_NOT_SPECIFIED;
+    return isset($this->langcodes[$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
index 807305f..5ec4315 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
@@ -7,6 +7,8 @@
 
 namespace Drupal\entity_test;
 
+use PDO;
+
 use Drupal\entity\EntityInterface;
 use Drupal\entity\DatabaseStorageController;
 
@@ -22,12 +24,10 @@ 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');
+    $query = db_select('entity_test_property_data', 'data')
+      ->distinct(TRUE)
+      ->fields('data', array('id'))
+      ->addTag($this->entityType . '_load_multiple');
 
     if ($ids) {
       $query->condition("data.id", $ids, 'IN');
@@ -35,15 +35,14 @@ class EntityTestStorageController extends DatabaseStorageController {
     if ($conditions) {
       foreach ($conditions as $field => $value) {
         $query->condition('data.' . $field, $value);
+        if ($field == 'langcode') {
+          // Ensure that conditions involving the 'langcode' property concern
+          // only values in the original entity language.
+          $query->condition('data.default_langcode', 1);
+        }
       }
     }
 
-    // Make sure we return one record for each entity even if no language has
-    // been specified.
-    if (empty($conditions['langcode'])) {
-      $query->condition('data.source_langcode', '');
-    }
-
     return $query;
   }
 
@@ -51,15 +50,18 @@ class EntityTestStorageController extends DatabaseStorageController {
    * Overrides Drupal\entity\DatabaseStorageController::attachLoad().
    */
   protected function attachLoad(&$queried_entities, $revision_id = FALSE) {
-    $data = db_select('entity_test_property_data', 'data')
+    $data = db_select('entity_test_property_data', 'data', array('fetch' => PDO::FETCH_ASSOC))
       ->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);
+    foreach ($data as $values) {
+      $entity = $queried_entities[$values['id']];
+      $entity->setProperties($values, $values['langcode']);
+      if (!empty($values['default_langcode'])) {
+        $entity->setLangcode($values['langcode']);
+      }
     }
 
     parent::attachLoad($queried_entities, $revision_id);
@@ -69,20 +71,24 @@ class EntityTestStorageController extends DatabaseStorageController {
    * Overrides Drupal\entity\DatabaseStorageController::postSave().
    */
   protected function postSave(EntityInterface $entity, $update) {
+    $default_langcode = ($language = $entity->language()) ? $language->langcode : LANGUAGE_NOT_SPECIFIED;
     $langcodes = array_keys($entity->translations());
-    $langcodes[] = ($language = $entity->language()) ? $language->langcode : LANGUAGE_NOT_SPECIFIED;
+    $langcodes[] = $default_langcode;
 
     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();
-      }
+      $values = array(
+        'id' => $entity->id(),
+        'langcode' => $langcode,
+        'default_langcode' => intval($default_langcode == $langcode),
+      ) + $properties;
+
+      db_merge('entity_test_property_data')
+        ->fields($values)
+        ->condition('id', $values['id'])
+        ->condition('langcode', $values['langcode'])
+        ->execute();
     }
   }
 
