diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-grid.js
@@ -302,7 +302,7 @@
           var fnd = false,
               j;
           for (j = 0; j < length; j++) {
-            if (fields[j].displayField === fullPropName) {
+            if (fields[j].displayField === fullPropName || fields[j].criteriaField === fullPropName) {
               fnd = true;
               break;
             }
@@ -378,6 +378,10 @@
 
         field.filterEditorProperties.keyDown = this.filterFieldsKeyDown;
 
+        if (field.criteriaField) {
+          field.filterEditorProperties.criteriaField = field.criteriaField;
+        }
+
         if (field.isLink) {
           // store the originalFormatCellValue if not already set
           if (field.formatCellValue && !field.formatCellValueFunctionReplaced) {
@@ -538,11 +542,10 @@
       }
       var value = criterion.value;
       // see the description in setValuesAsCriteria above
-      if (prop.endsWith(OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER)) {
-        var index = prop.lastIndexOf(OB.Constants.FIELDSEPARATOR);
-        prop = prop.substring(0, index);
+      var separatorIndex = prop.lastIndexOf(OB.Constants.FIELDSEPARATOR);
+      if (separatorIndex !== -1) {
+        prop = prop.substring(0, separatorIndex);
       }
-
       var field = this.filterEditor.getField(prop);
       // criterion.operator is set in case of an and/or expression
       if (this.isValidFilterField(field) && (criterion.operator || value === false || value || value === 0)) {
diff --git a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
--- a/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
+++ b/modules/org.openbravo.client.application/web/org.openbravo.client.application/js/grid/ob-view-grid.js
@@ -1201,6 +1201,16 @@
         } else if (isc.isA.emptyString(criterion.value)) {
           shouldRemove = true;
         }
+        // if the field referenced by the criterion has a criteriaField, remove the redundant criterion that references its displayField
+        if (!shouldRemove && this.fields) {
+          for (j = 0; j < this.fields.length; j++) {
+            if (criterion.operator === 'iContains' && this.fields[j].criteriaField && this.fields[j].displayField === criterion.fieldName && criterion.fieldName !== this.fields[j].criteriaField) {
+              shouldRemove = true;
+              break;
+            }
+          }
+        }
+
         if (shouldRemove) {
           internalCriteria.removeAt(i);
         } else {
diff --git a/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java b/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
--- a/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
+++ b/modules/org.openbravo.client.kernel/src/org/openbravo/client/kernel/reference/FKComboUIDefinition.java
@@ -21,6 +21,13 @@
 import org.codehaus.jettison.json.JSONException;
 import org.codehaus.jettison.json.JSONObject;
 import org.openbravo.base.exception.OBException;
+import org.openbravo.base.model.Property;
+import org.openbravo.client.kernel.KernelUtils;
+import org.openbravo.dal.core.DalUtil;
+import org.openbravo.model.ad.datamodel.Column;
+import org.openbravo.model.ad.datamodel.Table;
+import org.openbravo.model.ad.domain.Reference;
+import org.openbravo.model.ad.domain.ReferencedTable;
 import org.openbravo.model.ad.ui.Field;
 
 /**
@@ -31,6 +38,8 @@
  */
 public class FKComboUIDefinition extends ForeignKeyUIDefinition {
 
+  private static final String TABLE_AD_REFERENCE_ID = "18";
+
   @Override
   public String getParentType() {
     // ensures that the field will have a oneOf validator
@@ -38,7 +47,49 @@
   }
 
   public String getGridEditorFieldProperties(Field field) {
-    return "displayField: null, valueField: null ";
+    return "displayField: null, valueField: null";
+  }
+
+  @Override
+  // Overriden to include the criteriaField property for those Fields whose reference is table, and
+  // whose referenced table has more than one column acting as identifier
+  public String getGridFieldProperties(Field field) {
+    Column column = field.getColumn();
+    Reference reference = column.getReference();
+    String criteriaField = "";
+    if (reference.getId().equals(TABLE_AD_REFERENCE_ID)) {
+      Reference referenceSearchKey = column.getReferenceSearchKey();
+      if (referenceSearchKey != null && referenceSearchKey.getADReferencedTableList().size() > 0) {
+        ReferencedTable referencedTable = referenceSearchKey.getADReferencedTableList().get(0);
+        if (referencedTable != null
+            && isTableWithMultipleIdentifierColumns(referencedTable.getTable())) {
+          Property prop = KernelUtils.getInstance().getPropertyFromColumn(column);
+          Property referencedProp = KernelUtils.getInstance().getPropertyFromColumn(
+              referencedTable.getDisplayedColumn());
+          if (prop != null && referencedProp != null) {
+            criteriaField = ", criteriaField: " + "'" + prop.getName() + DalUtil.FIELDSEPARATOR
+                + referencedProp.getName() + "'";
+          }
+        }
+      }
+    }
+    return super.getGridFieldProperties(field) + criteriaField;
+  }
+
+  /* Returns true if the identifier of the table is composed of more than one column */
+  private Boolean isTableWithMultipleIdentifierColumns(Table relatedTable) {
+    int nIdentifiers = 0;
+    for (Column curColumn : relatedTable.getADColumnList()) {
+      if (curColumn.isIdentifier()) {
+        nIdentifiers += 1;
+        if (nIdentifiers > 1) {
+          // if there is more than one identifier return true
+          return true;
+        }
+      }
+    }
+    // there is only one identifier column
+    return false;
   }
 
   @Override
