diff --git a/includes/entity.inc b/includes/entity.inc
index 9ee7889..5783341 100644
--- a/includes/entity.inc
+++ b/includes/entity.inc
@@ -458,6 +458,11 @@ class EntityFieldQuery {
   public $fieldConditions = array();
 
   /**
+   * TODO
+   */
+  public $fieldMetaConditions = array();
+
+  /**
    * List of property conditions.
    *
    * @var array
@@ -674,6 +679,33 @@ class EntityFieldQuery {
   }
 
   /**
+   * TODO
+   */
+  public function fieldMetaCondition($field, $column, $value = NULL, $operator = NULL, $delta_group = NULL, $language_group = NULL) {
+    if (is_scalar($field)) {
+      $field_definition = field_info_field($field);
+      if (empty($field_definition)) {
+        throw new EntityFieldQueryException(t('Unknown field: @field_name', array('@field_name' => $field)));
+      }
+      $field = $field_definition;
+    }
+    // Ensure the same index is used for fieldConditions as for fields.
+    $index = count($this->fields);
+    $this->fields[$index] = $field;
+    if (isset($column)) {
+      $this->fieldMetaConditions[$index] = array(
+        'field' => $field,
+        'column' => $column,
+        'value' => $value,
+        'operator' => $operator,
+        'delta_group' => $delta_group,
+        'language_group' => $language_group,
+      );
+    }
+    return $this;
+  }
+
+  /**
    * Adds a condition on an entity-specific property.
    *
    * An $entity_type must be specified by calling
diff --git a/modules/field/modules/field_sql_storage/field_sql_storage.module b/modules/field/modules/field_sql_storage/field_sql_storage.module
index 6f49167..6eec851 100644
--- a/modules/field/modules/field_sql_storage/field_sql_storage.module
+++ b/modules/field/modules/field_sql_storage/field_sql_storage.module
@@ -468,7 +468,6 @@ function field_sql_storage_field_storage_purge($entity_type, $entity, $field, $i
  * Implements hook_field_storage_query().
  */
 function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
-  $groups = array();
   if ($query->age == FIELD_LOAD_CURRENT) {
     $tablename_function = '_field_sql_storage_tablename';
     $id_key = 'entity_id';
@@ -500,6 +499,7 @@ function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
   }
 
   // Add field conditions.
+  $groups = array();
   foreach ($query->fieldConditions as $key => $condition) {
     $table_alias = $table_aliases[$key];
     $field = $condition['field'];
@@ -520,6 +520,30 @@ function field_sql_storage_field_storage_query(EntityFieldQuery $query) {
     }
   }
 
+  // Add field meta conditions.
+  $groups = array();
+  foreach ($query->fieldMetaConditions as $key => $condition) {
+    $table_alias = $table_aliases[$key];
+    $field = $condition['field'];
+    // Add the specified condition.
+    $sql_field = $condition['column'];
+    $query->addCondition($select_query, $sql_field, $condition);
+    // Add delta / language group conditions if they do not involve the column
+    // being queried.
+    $group_columns = array_diff(array('delta', 'language'), array($sql_field));
+    foreach ($group_columns as $column) {
+      if (isset($condition[$column . '_group'])) {
+        $group_name = $condition[$column . '_group'];
+        if (!isset($groups[$column][$group_name])) {
+          $groups[$column][$group_name] = $table_alias;
+        }
+        else {
+          $select_query->where("$table_alias.$column = " . $groups[$column][$group_name] . ".$column");
+        }
+      }
+    }
+  }
+
   if (isset($query->deleted)) {
     $select_query->condition("$field_base_table.deleted", (int) $query->deleted);
   }
