diff -r 553553b86771 src-db/database/sourcedata/AD_MESSAGE.xml
--- a/src-db/database/sourcedata/AD_MESSAGE.xml	Tue Mar 21 09:16:23 2017 -0400
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml	Thu Mar 23 12:37:35 2017 +0100
@@ -1768,6 +1768,18 @@
 <!--CC9FB6E6597A466E8B11684FF30C3EA3-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--CC9FB6E6597A466E8B11684FF30C3EA3--></AD_MESSAGE>
 
+<!--CD56517EFD8D47F69219C1C25247506A--><AD_MESSAGE>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <AD_MESSAGE_ID><![CDATA[CD56517EFD8D47F69219C1C25247506A]]></AD_MESSAGE_ID>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <VALUE><![CDATA[OBMOBC_RemoteSearchWithoutFilters]]></VALUE>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <MSGTEXT><![CDATA[Remote query called without filters, please narrow your search]]></MSGTEXT>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <MSGTYPE><![CDATA[E]]></MSGTYPE>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <AD_MODULE_ID><![CDATA[08943B85ADF64E708797A753E5B6AAEE]]></AD_MODULE_ID>
+<!--CD56517EFD8D47F69219C1C25247506A-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--CD56517EFD8D47F69219C1C25247506A--></AD_MESSAGE>
+
 <!--CD9685F4E4F1407999D69700DCD5E8A0--><AD_MESSAGE>
 <!--CD9685F4E4F1407999D69700DCD5E8A0-->  <AD_MESSAGE_ID><![CDATA[CD9685F4E4F1407999D69700DCD5E8A0]]></AD_MESSAGE_ID>
 <!--CD9685F4E4F1407999D69700DCD5E8A0-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff -r 553553b86771 src/org/openbravo/mobile/core/process/ProcessHQLQuery.java
--- a/src/org/openbravo/mobile/core/process/ProcessHQLQuery.java	Tue Mar 21 09:16:23 2017 -0400
+++ b/src/org/openbravo/mobile/core/process/ProcessHQLQuery.java	Thu Mar 23 12:37:35 2017 +0100
@@ -38,6 +38,7 @@
 import org.openbravo.mobile.core.model.HQLPropertyList;
 import org.openbravo.mobile.core.servercontroller.MobileServerController;
 import org.openbravo.mobile.core.servercontroller.MobileServerUtils;
+import org.openbravo.service.json.JsonConstants;
 import org.openbravo.service.json.JsonToDataConverter;
 
 public abstract class ProcessHQLQuery extends SecuredJSONProcess {
@@ -62,6 +63,24 @@
     return null;
   }
 
+  /**
+   * If true, the query will not be executed if significant filters are not provided
+   * 
+   * @return boolean, true if empty search's are not allowed
+   */
+  protected boolean mustHaveRemoteFilters() {
+    return false;
+  }
+
+  /**
+   * Provides the message which should be used when not enough filters are provided
+   * 
+   * @return string, the message search key
+   */
+  protected String messageWhenNoFilters() {
+    return "OBMOBC_RemoteSearchWithoutFilters";
+  }
+
   @Inject
   @Any
   private Instance<HQLCriteriaProcess> hqlCriterias;
@@ -104,6 +123,16 @@
       JSONArray remoteFilters = jsonsent.has("remoteFilters") && !jsonsent.isNull("remoteFilters") ? jsonsent
           .getJSONArray("remoteFilters") : null;
 
+      if (jsonsent.has("parameters") && jsonsent.getJSONObject("parameters").has("remoteModel")
+          && jsonsent.getJSONObject("parameters").getBoolean("remoteModel")
+          && mustHaveRemoteFilters()
+          && (remoteFilters == null || !hasRelevantRemoteFilters(remoteFilters))) {
+        JSONObject errorMessage = errorMessage(messageWhenNoFilters());
+        log.debug("Search without relevant filters rejected for class " + this.getClass().getName());
+        w.write(errorMessage.toString().substring(1, errorMessage.toString().length() - 1));
+        return;
+      }
+
       String orderByClause = jsonsent.has("orderByClause") && !jsonsent.isNull("orderByClause") ? jsonsent
           .getString("orderByClause") : null;
 
@@ -302,6 +331,50 @@
     }
   }
 
+  protected boolean hasRelevantRemoteFilters(JSONArray remoteFilters) {
+    boolean hasFilters = false;
+    try {
+      for (int i = 0; i < remoteFilters.length() && !hasFilters; i++) {
+        JSONObject objFilter;
+        objFilter = (JSONObject) remoteFilters.get(i);
+        //
+        // A filter is considered not relevant if:
+        // - is an empty filter (__all__)
+        // - or type distinct from numeric (assumed string) and length less than 3
+        // Note:
+        // - Assumed only two types string and numeric, if some day added boolean needed to edit
+        // this if
+        // - Numeric types always are considered relevant regardless the size, since will be
+        // something like size greater than 5
+        //
+        if (objFilter.getString("value").equals("__all__")
+            || ((!objFilter.has("fieldType") || !objFilter.getString("fieldType").equals("Number")) && objFilter
+                .getString("value").length() < 3)) {
+          continue;
+        }
+        hasFilters = true;
+      }
+      return hasFilters;
+    } catch (JSONException e) {
+      throw new OBException("Unable to read remote filters");
+    }
+
+  }
+
+  protected JSONObject errorMessage(String message) throws Exception {
+    final JSONObject jsonResponse = new JSONObject();
+
+    jsonResponse.put(JsonConstants.RESPONSE_STATUS, JsonConstants.RPCREQUEST_STATUS_FAILURE);
+    jsonResponse.put("result", "-1");
+    jsonResponse.put("ignoreForClientLog", true);
+
+    jsonResponse.put("message", message);
+    final JSONObject error = new JSONObject();
+    error.put("message", message);
+    jsonResponse.put("error", error);
+    return jsonResponse;
+  }
+
   public interface StrategyQuery {
     public int buildResponse(Writer w, Query query, boolean firstQuery) throws JSONException,
         IOException;
diff -r 553553b86771 web/org.openbravo.mobile.core/source/data/ob-dal.js
--- a/web/org.openbravo.mobile.core/source/data/ob-dal.js	Tue Mar 21 09:16:23 2017 -0400
+++ b/web/org.openbravo.mobile.core/source/data/ob-dal.js	Thu Mar 23 12:37:35 2017 +0100
@@ -434,6 +434,7 @@
         data.parameters = {};
       }
       data.parameters.forceRemote = whereClause && whereClause.forceRemote;
+      data.parameters.remoteModel = true;
 
       //replace _filter column with all columns marked as filterable
       if (whereClause && whereClause.remoteFilters) {
diff -r 553553b86771 web/org.openbravo.mobile.core/source/data/ob-datasource.js
--- a/web/org.openbravo.mobile.core/source/data/ob-datasource.js	Tue Mar 21 09:16:23 2017 -0400
+++ b/web/org.openbravo.mobile.core/source/data/ob-datasource.js	Thu Mar 23 12:37:35 2017 +0100
@@ -52,7 +52,9 @@
       }
 
       // an error has been sent in the successful response
-      OB.error("serviceSuccess error: status: " + response.status + ((response.error && response.error.message) ? (", error.message: " + response.error.message) : ""));
+      if(!response.ignoreForClientLog){
+        OB.error("serviceSuccess error: status: " + response.status + ((response.error && response.error.message) ? (", error.message: " + response.error.message) : ""));
+      }
 
       // generic error message
       var exception = {
diff -r 553553b86771 web/org.openbravo.mobile.core/source/retail/component/ob-retail-searchproductcharacteristic.js
--- a/web/org.openbravo.mobile.core/source/retail/component/ob-retail-searchproductcharacteristic.js	Tue Mar 21 09:16:23 2017 -0400
+++ b/web/org.openbravo.mobile.core/source/retail/component/ob-retail-searchproductcharacteristic.js	Thu Mar 23 12:37:35 2017 +0100
@@ -1039,13 +1039,17 @@
   },
   changePricelist: function (inSender, inEvent) {
     this.currentPriceList = inEvent.priceList;
-    this.doSearchAction({
-      productCat: this.$.searchProductCharacteristicHeader.$.productcategory.getValue() || '__all__',
-      productName: this.$.searchProductCharacteristicHeader.$.productFilterText.getValue() || '',
-      filter: this.model.get('filter'),
-      skipProduct: false,
-      skipProductCharacteristic: false
-    });
+    if (OB.MobileApp.model.hasPermission('OBPOS_remote.product', true)) {
+      this.doClearAction();
+    } else {
+      this.doSearchAction({
+        productCat: this.$.searchProductCharacteristicHeader.$.productcategory.getValue() || '__all__',
+        productName: this.$.searchProductCharacteristicHeader.$.productFilterText.getValue() || '',
+        filter: this.model.get('filter'),
+        skipProduct: false,
+        skipProductCharacteristic: false
+      });
+    }
   },
   receiptChanged: function () {
     this.receipt.on('clear', function () {
@@ -1596,7 +1600,7 @@
             forceOffline: true
           });
         } else {
-          OB.UTIL.showError(OB.I18N.getLabel(message ? message : 'OBMOBC_ConnectionFail'));
+          OB.UTIL.showWarning(OB.I18N.getLabel(message ? message : 'OBMOBC_ConnectionFail'));
           me.$.renderLoading.hide();
           me.$.products.collection.reset();
           me.$.products.show();
