diff --git a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
index 8ea8a6a..ff5a727 100644
--- a/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
+++ b/core/modules/entity/lib/Drupal/entity/EntityFieldQuery.php
@@ -148,6 +148,13 @@ class EntityFieldQuery {
   public $fields = array();
 
   /**
+   * A list of used properties keyed by group.
+   *
+   * @var array
+   */
+  public $properties = array();
+
+  /**
    * TRUE if this is a count query, FALSE if it isn't.
    *
    * @var boolean
@@ -420,19 +427,48 @@ class EntityFieldQuery {
    *     of the same type as the column.
    *   The operator can be omitted, and will default to 'IN' if the value is an
    *   array, or to '=' otherwise.
+   * @param $langcode_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $langcode_group.
    *
    * @return Drupal\entity\EntityFieldQuery
    *   The called object.
    */
-  public function propertyCondition($column, $value, $operator = NULL) {
+  public function propertyCondition($column, $value, $operator = NULL, $langcode_group = NULL) {
+    $group = !empty($langcode_group) ? $langcode_group : 0;
+    $this->properties[$group][$column] = $column;
     $this->propertyConditions[] = array(
       'column' => $column,
       'value' => $value,
       'operator' => $operator,
+      'langcode_group' => $group,
     );
     return $this;
   }
 
+
+  /**
+   * Adds a condition on the property language.
+   *
+   * @param $langcode
+   *   The language code that the properties belonging to the language group
+   *   should match.
+   * @param $operator
+   *   The operator to be used to test the given value.
+   * @param $langcode_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $langcode_group.
+   *
+   * @return Drupal\entity\EntityFieldQuery
+   *   The called object.
+   *
+   * @see Drupal\entity\EntityFieldQuery::addFieldCondition()
+   * @see Drupal\entity\EntityFieldQuery::deleted()
+   */
+  public function propertyLanguageCondition($langcode = NULL, $operator = NULL, $langcode_group = NULL) {
+    return $this->propertyCondition('langcode', $langcode, $operator, $langcode_group);
+  }
+
   /**
    * Orders the result set by entity-generic metadata.
    *
@@ -515,15 +551,19 @@ class EntityFieldQuery {
    *   The column on which to order.
    * @param $direction
    *   The direction to sort. Legal values are "ASC" and "DESC".
+   * @param $langcode_group
+   *   An arbitrary identifier: conditions in the same group must have the same
+   *   $langcode_group.
    *
    * @return Drupal\entity\EntityFieldQuery
    *   The called object.
    */
-  public function propertyOrderBy($column, $direction = 'ASC') {
+  public function propertyOrderBy($column, $direction = 'ASC', $langcode_group = NULL) {
     $this->order[] = array(
       'type' => 'property',
       'specifier' => $column,
       'direction' => $direction,
+      'langcode_group' => !empty($langcode_group) ? $langcode_group : 0,
     );
     return $this;
   }
@@ -814,8 +854,7 @@ class EntityFieldQuery {
     if (!empty($entity_info['data table'])) {
       $data_table = $entity_info['data table'];
       $data_table_schema = drupal_get_schema($data_table);
-      $select_query->innerJoin($data_table, NULL, "$data_table.$sql_field = $base_table.$sql_field");
-      $select_query->distinct(TRUE);
+      $this->joinPropertyData($select_query, $entity_type, $base_table);
     }
     else {
       $data_table_schema = array();
@@ -829,7 +868,7 @@ class EntityFieldQuery {
       // as properties, instead of being set as entity conditions. Remove this
       // once we can reliably distinguish between properties and metadata living
       // on the base table.
-      $table = !empty($data_table_schema['fields'][$column]) ? $data_table : $base_table;
+      $table = !empty($data_table_schema['fields'][$column]) ? $data_table  . '_' . $property_condition['langcode_group'] : $base_table;
       $this->addCondition($select_query, "$table.$column", $property_condition);
     }
 
@@ -902,7 +941,7 @@ class EntityFieldQuery {
       }
       elseif ($order['type'] == 'property') {
         $specifier = $order['specifier'];
-        $table = !empty($data_table_schema['fields'][$specifier]) ? $data_table : $base_table;
+        $table = !empty($data_table_schema['fields'][$specifier]) ? $data_table  . '_' . $order['langcode_group'] : $base_table;
         $select_query->orderBy("$table.$specifier", $order['direction']);
       }
     }
@@ -996,4 +1035,35 @@ class EntityFieldQuery {
     }
   }
 
+  /**
+   * Joins the needed data tables based on the specified property conditions.
+   *
+   * @param SelectQuery $select_query
+   *   A SelectQuery containing at least one table as specified by $base_table.
+   * @param $entity_type
+   *   The entity type the query applies to.
+   * @param $base_table
+   *   The name of the base table to join on.
+   */
+  public function joinPropertyData(Select $select_query, $entity_type, $base_table) {
+    $entity_info = entity_get_info($entity_type);
+
+    // If we have no data table there are no property meta conditions to handle.
+    if (empty($entity_info['data table'])) {
+      return;
+    }
+
+    $data_table = $entity_info['data table'];
+    $id_key = $entity_info['entity keys']['id'];
+
+    foreach ($this->properties as $key => $property) {
+      // Every properties needs a new join on the data table.
+      $table_alias = $data_table . '_' . $key;
+      $table_aliases[$key] = $table_alias;
+      $select_query->join($data_table, $table_alias, "$table_alias.$id_key = $base_table.$id_key");
+    }
+
+    // Ensure we return just one value.
+    $select_query->distinct();
+  }
 }
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
index c7f7961..373ffd7 100644
--- a/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
+++ b/core/modules/entity/lib/Drupal/entity/Tests/EntityTranslationTest.php
@@ -9,6 +9,8 @@ namespace Drupal\entity\Tests;
 
 use Exception;
 use InvalidArgumentException;
+
+use Drupal\entity\EntityFieldQuery;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -229,5 +231,16 @@ class EntityTranslationTest extends WebTestBase {
     $this->assertEqual(count($entities), 1, 'One entity loaded by name translation and language specifying to look for translations.');
     $entities = entity_load_multiple_by_properties('entity_test', array('uid' => $properties[$langcode]['uid'], 'default_langcode' => NULL));
     $this->assertEqual(count($entities), 2, 'Two entities loaded by uid without caring about property translatability.');
+
+    $query = new EntityFieldQuery();
+    $query->entityCondition('entity_type', 'entity_test');
+    $query->propertyCondition('uid', $properties[$default_langcode]['uid'], NULL, 'original');
+    $query->propertyCondition('name', $properties[$default_langcode]['name'], NULL, 'original');
+    $query->propertyLanguageCondition($default_langcode, NULL, 'original');
+    $query->propertyCondition('name', $properties[$langcode]['name'], NULL, 'translation');
+    $query->propertyLanguageCondition($langcode, NULL, 'translation');
+    $query->propertyOrderBy('name', 'ASC', 'original');
+    $result = $query->execute();
+    $this->assertEqual(count($result), 1, 'One entity loaded by name and uid using different language meta conditions.');
   }
 }
