diff --git a/web/org.openbravo.mobile.core/source/data/ob-datasource.js b/web/org.openbravo.mobile.core/source/data/ob-datasource.js
--- a/web/org.openbravo.mobile.core/source/data/ob-datasource.js
+++ b/web/org.openbravo.mobile.core/source/data/ob-datasource.js
@@ -122,7 +122,6 @@
       handleAs: 'json',
       contentType: 'application/json;charset=utf-8',
       ignoreForConnectionStatus: dataparams.parameters && dataparams.parameters.ignoreForConnectionStatus ? dataparams.parameters.ignoreForConnectionStatus : false,
-      noRetries: dataparams.parameters && dataparams.parameters.noRetries ? dataparams.parameters.noRetries : false,
       data: JSON.stringify(dataparams),
       success: function (inSender, inResponse) {
         OB.DS.servicePOSTRequests.pop(source);
@@ -145,6 +144,12 @@
         serviceError(inResponse, callback, callbackError);
       }
     });
+    //Set paramaters received in dataparams.extraParams
+    if (dataparams.extraParams) {
+      _.each(_.keys(dataparams.extraParams), function (key) {
+        ajaxRequest[key] = dataparams.extraParams[key];
+      });
+    }
     rr = new OB.RR.Request({
       ajaxRequest: ajaxRequest
     });
@@ -188,6 +193,12 @@
         serviceError(inResponse, callback, callbackError);
       }
     });
+    //Set paramaters received in dataparams.parameters
+    if (dataparams.parameters) {
+      _.each(_.keys(dataparams.parameters), function (key) {
+        ajaxRequest[key] = dataparams.parameters[key];
+      });
+    }
     rr = new OB.RR.Request({
       ajaxRequest: ajaxRequest
     });
@@ -222,6 +233,12 @@
   };
 
   OB.DS.Process.prototype.exec = function (params, callback, callbackError, async, timeout) {
+    /* 
+     * We can add extraParams calling exec function of OB.DS.Process, see example:
+     *   params.extraParams = {
+     *     example: true
+     *  };
+     */
     var data = OB.DS.Process.prepareData(params);
 
     // run all transactional services synchronized if synchronized mode is enabled
diff --git a/web/org.openbravo.mobile.core/source/data/ob-requestrouter.js b/web/org.openbravo.mobile.core/source/data/ob-requestrouter.js
--- a/web/org.openbravo.mobile.core/source/data/ob-requestrouter.js
+++ b/web/org.openbravo.mobile.core/source/data/ob-requestrouter.js
@@ -68,7 +68,16 @@
     callServer: function (online, index, service, ajaxRequest) {
       var servers = OB.RR.RequestRouter.servers,
           server = servers.at(index),
-          me = this;
+          me = this,
+          maxNumOfRequestRetries;
+
+      if (!OB.UTIL.isNullOrUndefined(ajaxRequest.maxNumOfRequestRetries)) {
+        maxNumOfRequestRetries = ajaxRequest.maxNumOfRequestRetries;
+      } else if (!OB.UTIL.isNullOrUndefined(OB.UTIL.localStorage.getItem('maxNumOfRequestRetries'))) {
+        maxNumOfRequestRetries = OB.UTIL.localStorage.getItem('maxNumOfRequestRetries');
+      } else {
+        maxNumOfRequestRetries = 0;
+      }
 
       if (index === servers.length) {
         // tried the last server online, now try the offline server one more time
@@ -124,7 +133,7 @@
                   ajaxRequest.origFail(inSender, inResponse);
                 }
               }
-            } else if (ajaxRequest.noRetries && OB.RR.RequestRouter.servers.length === (index + 1)) {
+            } else if ((maxNumOfRequestRetries <= 0 || ajaxRequest.numberOfRetries >= maxNumOfRequestRetries) && OB.RR.RequestRouter.servers.length === (index + 1)) {
               // last server, no retries on offline servers even
               if (!ajaxRequest.done) {
                 // the done flag keeps track that the request was done.
@@ -135,7 +144,7 @@
                   ajaxRequest.origFail(inSender, inResponse);
                 }
               }
-            } else if (ajaxRequest.noRetries || ajaxRequest.numberOfRetries >= OB.UTIL.localStorage.getItem('maxNumOfRequestRetries')) {
+            } else if (maxNumOfRequestRetries <= 0 || ajaxRequest.numberOfRetries >= maxNumOfRequestRetries) {
               // no retries needed, or
               // did all the retries, change to offline for the current server, move to next server
               server.changeOnlineStatus(false, ajaxRequest.ignoreForConnectionStatus);
@@ -827,7 +836,7 @@
 
       OB.UTIL.localStorage.setItem('offlinePingInterval', getPreference('OBMOBC_RequestRouterPingTime', 60000, OB.UTIL.localStorage.getItem('offlinePingInterval') || 60000));
       OB.UTIL.localStorage.setItem('tokenRefreshInterval', getPreference('OBMOBC_RequestRouterTokenRefreshInterval', 10 * 60000, OB.UTIL.localStorage.getItem('tokenRefreshInterval') || 30 * 60000));
-      OB.UTIL.localStorage.setItem('maxNumOfRequestRetries', getPreference('OBMOBC_NumberOfRequestRetries', 1, OB.UTIL.localStorage.getItem('maxNumOfRequestRetries') || 3));
+      OB.UTIL.localStorage.setItem('maxNumOfRequestRetries', getPreference('OBMOBC_NumberOfRequestRetries', 0, OB.UTIL.localStorage.getItem('maxNumOfRequestRetries') || 0));
 
       if (this.offlinePing) {
         clearInterval(this.offlinePing);
diff --git a/web/org.openbravo.mobile.core/source/model/ob-terminal-model.js b/web/org.openbravo.mobile.core/source/model/ob-terminal-model.js
--- a/web/org.openbravo.mobile.core/source/model/ob-terminal-model.js
+++ b/web/org.openbravo.mobile.core/source/model/ob-terminal-model.js
@@ -1345,7 +1345,7 @@
       cacheBust: false,
       timeout: 5000,
       // don't do retries as this gives side effects as re-showing login page
-      noRetries: true,
+      maxNumOfRequestRetries: 0,
       method: 'GET',
       handleAs: 'json',
       contentType: 'application/json;charset=utf-8',
@@ -1871,7 +1871,8 @@
       cacheBust: false,
       method: 'POST',
       timeout: 30000,
-      noRetries: true,
+      // don't do retries as this gives side effects as re-showing login page
+      maxNumOfRequestRetries: 0,
       contentType: 'application/x-www-form-urlencoded; charset=UTF-8',
       data: params,
       success: function (inSender, inResponse) {
