diff --git a/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java b/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
--- a/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
+++ b/src/org/openbravo/retail/posterminal/LoginUtilsServlet.java
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2013 Openbravo S.L.U.
+ * Copyright (C) 2012-2016 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -22,7 +22,6 @@
 import org.openbravo.base.secureApp.LoginUtils;
 import org.openbravo.base.secureApp.VariablesSecureApp;
 import org.openbravo.client.kernel.RequestContext;
-import org.openbravo.dal.core.OBContext;
 import org.openbravo.dal.service.OBCriteria;
 import org.openbravo.dal.service.OBDal;
 import org.openbravo.dal.service.OBQuery;
@@ -32,6 +31,7 @@
 import org.openbravo.mobile.core.MobileServerDefinition;
 import org.openbravo.mobile.core.MobileServerOrganization;
 import org.openbravo.mobile.core.login.MobileCoreLoginUtilsServlet;
+import org.openbravo.mobile.core.servercontroller.MobileServerUtils;
 import org.openbravo.model.ad.access.FormAccess;
 import org.openbravo.model.ad.access.User;
 import org.openbravo.model.ad.access.UserRoles;
@@ -340,19 +340,7 @@
   protected JSONArray getServers(OBPOSApplications terminal) throws JSONException {
     JSONArray respArray = new JSONArray();
 
-    boolean multiServerEnabled = false;
-    try {
-      OBContext.setAdminMode(false);
-      multiServerEnabled = "Y".equals(Preferences.getPreferenceValue(
-          "OBMOBC_MultiServerArchitecture", true, terminal.getClient(), terminal.getOrganization(),
-          null, null, null).trim());
-    } catch (PropertyException ignore) {
-      // ignore on purpose
-    } finally {
-      OBContext.restorePreviousMode();
-    }
-
-    if (!multiServerEnabled) {
+    if (!MobileServerUtils.isMultiServerEnabled(terminal.getClient(), terminal.getOrganization())) {
       return respArray;
     }
 
diff --git a/src/org/openbravo/retail/posterminal/importprocess/POSImportEntryProcessor.java b/src/org/openbravo/retail/posterminal/importprocess/POSImportEntryProcessor.java
--- a/src/org/openbravo/retail/posterminal/importprocess/POSImportEntryProcessor.java
+++ b/src/org/openbravo/retail/posterminal/importprocess/POSImportEntryProcessor.java
@@ -22,6 +22,7 @@
 import org.openbravo.client.kernel.event.EntityNewEvent;
 import org.openbravo.client.kernel.event.EntityPersistenceEventObserver;
 import org.openbravo.dal.service.OBDal;
+import org.openbravo.mobile.core.servercontroller.SynchronizedServerProcessCaller;
 import org.openbravo.retail.posterminal.OBPOSApplications;
 import org.openbravo.service.importprocess.ImportEntry;
 import org.openbravo.service.importprocess.ImportProcessUtils;
@@ -38,7 +39,8 @@
 
   private static List<String> POSTTYPEOFDATA = Arrays.asList("Order", "BusinessPartner",
       "BusinessPartnerLocation", "OBPOS_App_Cashup", "FIN_Finacc_Transaction",
-      "OBPOS_RejectQuotation", "OBPOS_VoidLayaway");
+      "OBPOS_RejectQuotation", "OBPOS_VoidLayaway",
+      SynchronizedServerProcessCaller.SYNCHRONIZED_DATA_TYPE);
 
   @Override
   protected Entity[] getObservedEntities() {
diff --git a/src/org/openbravo/retail/posterminal/master/CashupSynchronized.java b/src/org/openbravo/retail/posterminal/master/CashupSynchronized.java
new file mode 100644
--- /dev/null
+++ b/src/org/openbravo/retail/posterminal/master/CashupSynchronized.java
@@ -0,0 +1,103 @@
+/*
+ ************************************************************************************
+ * Copyright (C) 2016 Openbravo S.L.U.
+ * Licensed under the Openbravo Commercial License version 1.0
+ * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
+ * or in the legal folder of this module distribution.
+ ************************************************************************************
+ */
+package org.openbravo.retail.posterminal.master;
+
+import javax.servlet.ServletException;
+
+import org.apache.log4j.Logger;
+import org.codehaus.jettison.json.JSONException;
+import org.codehaus.jettison.json.JSONObject;
+import org.hibernate.Query;
+import org.openbravo.base.exception.OBException;
+import org.openbravo.dal.core.SessionHandler;
+import org.openbravo.mobile.core.servercontroller.MobileServerController;
+import org.openbravo.mobile.core.servercontroller.MobileServerRequestExecutor;
+import org.openbravo.mobile.core.servercontroller.MobileServerUtils;
+import org.openbravo.mobile.core.servercontroller.SynchronizedServerProcessCaller;
+import org.openbravo.model.common.order.Order;
+import org.openbravo.retail.posterminal.OBPOSErrors;
+import org.openbravo.retail.posterminal.ProcessCashClose;
+import org.openbravo.service.importprocess.ImportEntry;
+
+/**
+ * A read cashup information class which is used in case of running in synchronized mode. First call
+ * the central server to get the latest cashup information and return that if available.
+ * 
+ * @author mtaal
+ */
+public class CashupSynchronized extends Cashup {
+  private static final Logger log = Logger.getLogger(ProcessCashClose.class);
+
+  @Override
+  public JSONObject exec(JSONObject json) throws JSONException, ServletException {
+    if (MobileServerController.getInstance().isThisACentralServer()) {
+      return executeLocal(json);
+    } else if (MobileServerController.getInstance().isCentralServerOnline()) {
+      log.debug("Central server is online, first see if there are errors in the queue");
+      if (isDataInQueue(json)) {
+        // errors in local, so call central
+        log.debug("errors in queue, try central");
+        try {
+          return MobileServerRequestExecutor.getInstance().executeCentralRequest(
+              MobileServerUtils.OBWSPATH + this.getClass().getName(), json);
+        } catch (Throwable t) {
+          // something goes wrong on central, try local
+          // should fail as there are errors in the import queue
+          return executeLocal(json);
+        }
+      } else {
+        // no local errors, take from local
+        return executeLocal(json);
+      }
+    } else {
+      return executeLocal(json);
+    }
+  }
+
+  private JSONObject executeLocal(JSONObject json) throws JSONException, ServletException {
+    if (isDataInQueue(json)) {
+      throw new OBException(
+          "Data on the server is in error/initial state, cashup information can not be retrieved");
+    }
+    return super.exec(json);
+  }
+
+  private boolean isDataInQueue(JSONObject json) throws JSONException {
+    final String posId = json.getString("pos");
+    {
+      final Query qry = SessionHandler
+          .getInstance()
+          .getSession()
+          .createQuery(
+              "select count(*) from " + ImportEntry.ENTITY_NAME + " where ("
+                  + ImportEntry.PROPERTY_IMPORTSTATUS + "='Error' or "
+                  + ImportEntry.PROPERTY_IMPORTSTATUS + "='Initial') and "
+                  + ImportEntry.PROPERTY_TYPEOFDATA + "='"
+                  + SynchronizedServerProcessCaller.SYNCHRONIZED_DATA_TYPE + "' and "
+                  + ImportEntry.PROPERTY_OBPOSPOSTERMINAL + "='" + posId + "'");
+      if (((Number) qry.uniqueResult()).intValue() > 0) {
+        return true;
+      }
+    }
+    {
+      final Query qry = SessionHandler
+          .getInstance()
+          .getSession()
+          .createQuery(
+              "select count(*) from " + OBPOSErrors.ENTITY_NAME + " where "
+                  + OBPOSErrors.PROPERTY_ORDERSTATUS + "='N' and "
+                  + OBPOSErrors.PROPERTY_TYPEOFDATA + "='" + Order.ENTITY_NAME + "' and "
+                  + OBPOSErrors.PROPERTY_OBPOSAPPLICATIONS + "='" + posId + "'");
+      if (((Number) qry.uniqueResult()).intValue() > 0) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
diff --git a/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js b/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
--- a/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
+++ b/web/org.openbravo.retail.posterminal/js/cashmgmt/model/cashmgmt-model.js
@@ -82,103 +82,120 @@
       }, null, this);
     }, this);
 
-    this.depsdropstosave.on('makeDeposits', function () {
-      // Done button has been clicked
-      me = this;
-      TestRegistry.CashMgmt = TestRegistry.CashMgmt || {};
-      TestRegistry.CashMgmt.isCashDepositPrinted = false;
+    var makeDepositsFunction = function (me) {
+        TestRegistry.CashMgmt = TestRegistry.CashMgmt || {};
+        TestRegistry.CashMgmt.isCashDepositPrinted = false;
 
-      OB.UTIL.showLoading(true);
+        OB.UTIL.showLoading(true);
 
-      if (this.depsdropstosave.length === 0) {
-        // Nothing to do go to main window
-        OB.POS.navigate('retail.pointofsale');
-        return true;
-      }
+        if (me.depsdropstosave.length === 0) {
+          // Nothing to do go to main window
+          OB.POS.navigate('retail.pointofsale');
+          return true;
+        }
 
-      this.printCashMgmt = new OB.OBPOSCashMgmt.Print.CashMgmt();
+        me.printCashMgmt = new OB.OBPOSCashMgmt.Print.CashMgmt();
 
-      TestRegistry.CashMgmt.isCashDepositPrinted = true;
+        TestRegistry.CashMgmt.isCashDepositPrinted = true;
 
-      function runSync() {
-        if (OB.MobileApp.model.get('connectedToERP')) {
-          OB.MobileApp.model.runSyncProcess(function () {
+        function runSync() {
+          if (OB.MobileApp.model.get('connectedToERP')) {
+            OB.MobileApp.model.runSyncProcess(function () {
+              OB.UTIL.showLoading(false);
+              me.set("finished", true);
+              if (OB.MobileApp.model.hasPermission('OBPOS_print.cashmanagement')) {
+                me.printCashMgmt.print(me.depsdropstosave.toJSON());
+              }
+            }, function () {
+              if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                // fail, remove everything and go away
+                OB.Dal.removeAll(OB.Model.CashManagement, null, function () {
+                  OB.UTIL.calculateCurrentCash();
+                  me.depsdropstosave = new Backbone.Collection();
+                });
+              }
+            });
+          } else {
             OB.UTIL.showLoading(false);
             me.set("finished", true);
             if (OB.MobileApp.model.hasPermission('OBPOS_print.cashmanagement')) {
               me.printCashMgmt.print(me.depsdropstosave.toJSON());
             }
-          });
-        } else {
-          OB.UTIL.showLoading(false);
-          me.set("finished", true);
-          if (OB.MobileApp.model.hasPermission('OBPOS_print.cashmanagement')) {
-            me.printCashMgmt.print(me.depsdropstosave.toJSON());
           }
         }
-      }
 
-      var paymentList = new Backbone.Collection(),
-          found = false,
-          i;
+        var paymentList = new Backbone.Collection(),
+            found = false,
+            i;
 
-      function addAttributes(depdrop) {
-        var payment = new OB.Model.PaymentMethodCashUp();
-        if (depdrop.get('type') === 'deposit') {
-          payment.set('paymentMethodId', depdrop.get('paymentMethodId'));
-          payment.set('cashup_id', depdrop.get('cashup_id'));
-          payment.set('totalDeposits', depdrop.get('amount'));
-          payment.set('totalDrops', 0);
-        } else {
-          payment.set('paymentMethodId', depdrop.get('paymentMethodId'));
-          payment.set('cashup_id', depdrop.get('cashup_id'));
-          payment.set('totalDrops', depdrop.get('amount'));
-          payment.set('totalDeposits', 0);
+        function addAttributes(depdrop) {
+          var payment = new OB.Model.PaymentMethodCashUp();
+          if (depdrop.get('type') === 'deposit') {
+            payment.set('paymentMethodId', depdrop.get('paymentMethodId'));
+            payment.set('cashup_id', depdrop.get('cashup_id'));
+            payment.set('totalDeposits', depdrop.get('amount'));
+            payment.set('totalDrops', 0);
+          } else {
+            payment.set('paymentMethodId', depdrop.get('paymentMethodId'));
+            payment.set('cashup_id', depdrop.get('cashup_id'));
+            payment.set('totalDrops', depdrop.get('amount'));
+            payment.set('totalDeposits', 0);
+          }
+          return payment;
         }
-        return payment;
-      }
-      _.each(this.depsdropstosave.models, function (depdrop) {
-        if (paymentList.length > 0) {
-          for (i = 0; i < paymentList.length; i++) {
-            found = false;
-            if (paymentList.models[i].get('paymentMethodId') === depdrop.get('paymentMethodId')) {
-              var paymentMethod = paymentList.models[i],
-                  totalDeposits = 0,
-                  totalDrops = 0,
-                  depos = paymentMethod.get('totalDeposits'),
-                  drop = paymentMethod.get('totalDrops');
-              if (depdrop.get('type') === 'deposit') {
-                totalDeposits = OB.DEC.add(depos, depdrop.get('amount'));
-                paymentMethod.set('totalDeposits', totalDeposits);
-              } else {
-                totalDrops = OB.DEC.add(drop, depdrop.get('amount'));
-                paymentMethod.set('totalDrops', totalDrops);
+        _.each(me.depsdropstosave.models, function (depdrop) {
+          if (paymentList.length > 0) {
+            for (i = 0; i < paymentList.length; i++) {
+              found = false;
+              if (paymentList.models[i].get('paymentMethodId') === depdrop.get('paymentMethodId')) {
+                var paymentMethod = paymentList.models[i],
+                    totalDeposits = 0,
+                    totalDrops = 0,
+                    depos = paymentMethod.get('totalDeposits'),
+                    drop = paymentMethod.get('totalDrops');
+                if (depdrop.get('type') === 'deposit') {
+                  totalDeposits = OB.DEC.add(depos, depdrop.get('amount'));
+                  paymentMethod.set('totalDeposits', totalDeposits);
+                } else {
+                  totalDrops = OB.DEC.add(drop, depdrop.get('amount'));
+                  paymentMethod.set('totalDrops', totalDrops);
+                }
+                found = true;
+                break;
               }
-              found = true;
-              break;
             }
-          }
-          if (!found) {
+            if (!found) {
+              paymentList.add(addAttributes(depdrop));
+            }
+          } else {
             paymentList.add(addAttributes(depdrop));
           }
-        } else {
-          paymentList.add(addAttributes(depdrop));
-        }
-      }, this);
+        }, this);
 
-      var runSyncProcessCM = _.after(this.depsdropstosave.models.length, runSync);
-      // Sending drops/deposits to backend
-      _.each(this.depsdropstosave.models, function (depdrop, index) {
-        OB.Dal.save(depdrop, function () {
-          OB.UTIL.sumCashManagementToCashup(paymentList.models[index]);
-          OB.UTIL.calculateCurrentCash();
-          runSyncProcessCM();
-        }, function () {
-          OB.UTIL.showLoading(false);
-          me.set("finishedWrongly", true);
-          return;
-        }, true);
-      }, this);
+        var runSyncProcessCM = _.after(me.depsdropstosave.models.length, runSync);
+        // Sending drops/deposits to backend
+        _.each(me.depsdropstosave.models, function (depdrop, index) {
+          OB.Dal.save(depdrop, function () {
+            OB.UTIL.sumCashManagementToCashup(paymentList.models[index]);
+            OB.UTIL.calculateCurrentCash();
+            runSyncProcessCM();
+          }, function () {
+            OB.UTIL.showLoading(false);
+            me.set("finishedWrongly", true);
+            return;
+          }, true);
+        }, this);
+        };
+
+    this.depsdropstosave.on('makeDeposits', function (receipt) {
+      var me = this;
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+        OB.MobileApp.model.setSynchronizedCheckpoint(function () {
+          makeDepositsFunction(me);
+        });
+      } else {
+        makeDepositsFunction(me);
+      }
     }, this);
 
     // effective entry point
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-model.js b/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-model.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-model.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-model.js
@@ -730,12 +730,19 @@
                   me.printCashUp.print(me.get('cashUpReport').at(0), me.getCountCashSummary(), true);
                 }
                 };
+            var callbackFinishedWrongly = function () {
+                // reset to N
+                cashUp.at(0).set('isprocessed', 'N');
+                OB.Dal.save(cashUp.at(0));
+                me.set("finishedWrongly", true);
+                };
+
             var callbackFunc = function () {
                 OB.UTIL.SynchronizationHelper.finished(synchId, 'processAndFinishCashUp');
                 OB.MobileApp.model.runSyncProcess(function () {
                   callbackFinishedSuccess();
                 }, function () {
-                  callbackFinishedSuccess();
+                  callbackFinishedWrongly();
                 });
                 };
             callbackFunc();
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/view/closecash.js b/web/org.openbravo.retail.posterminal/js/closecash/view/closecash.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/view/closecash.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/view/closecash.js
@@ -352,6 +352,11 @@
     }, this);
     //finishedWrongly
     this.model.on('change:finishedWrongly', function (model) {
+      // in case of synchronized mode then don't do specific things
+      // message is already displayed
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+        return;
+      }
       var message = "";
       if (model.get('errorMessage')) {
         message = OB.I18N.getLabel(model.get('errorMessage'), [model.get('errorDetail')]);
@@ -567,8 +572,6 @@
   }
 });
 
-
-
 OB.POS.registerWindow({
   windowClass: OB.OBPOSCashUp.UI.CashUp,
   route: 'retail.cashup',
@@ -576,10 +579,22 @@
   menuPosition: 20,
   menuI18NLabel: 'OBPOS_LblCloseCash',
   permission: 'OBPOS_retail.cashup',
-  approvalType: 'OBPOS_approval.cashup'
+  approvalType: 'OBPOS_approval.cashup',
+  navigateTo: function () {
+    var me = this;
+    // in case of synchronized mode reload the cashup from the server
+    // this is needed because there is a slight change that the cashup on the client 
+    // is out of date
+    if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+      OB.UTIL.rebuildCashupFromServer(function () {
+        OB.MobileApp.model.navigate(me.route);
+      });
+    } else {
+      OB.MobileApp.model.navigate(me.route);
+    }
+  }
 });
 
-
 enyo.kind({
   name: 'OB.OBPOSCashUp.UI.CashUpPartial',
   kind: 'OB.OBPOSCashUp.UI.CashUp',
diff --git a/web/org.openbravo.retail.posterminal/js/data/datacustomeraddrsave.js b/web/org.openbravo.retail.posterminal/js/data/datacustomeraddrsave.js
--- a/web/org.openbravo.retail.posterminal/js/data/datacustomeraddrsave.js
+++ b/web/org.openbravo.retail.posterminal/js/data/datacustomeraddrsave.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2015 Openbravo S.L.U.
+ * Copyright (C) 2012-2016 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -18,49 +18,57 @@
   OB.DATA.CustomerAddrSave = function (model) {
     this.context = model;
     this.customerAddr = model.get('customerAddr');
+
+    // trigger is from previous code, keeping it for backward compat
     this.customerAddr.on('customerAddrSaved', function () {
-      var me = this,
-          customerAddrList, customerAddrId = this.customerAddr.get('id'),
+      OB.DATA.executeCustomerAddressSave(this.customerAddr);
+    }, this);
+
+    OB.DATA.executeCustomerAddressSave = function (customerAddr, callback) {
+      var customerAddrList, customerAddrId = this.customerAddr.get('id'),
           isNew = false,
           bpLocToSave = new OB.Model.ChangedBPlocation(),
           customerAddrListToChange;
 
       bpLocToSave.set('isbeingprocessed', 'N');
-      this.customerAddr.set('createdBy', OB.MobileApp.model.get('orgUserId'));
+      customerAddr.set('createdBy', OB.MobileApp.model.get('orgUserId'));
       bpLocToSave.set('createdBy', OB.MobileApp.model.get('orgUserId'));
       if (customerAddrId) {
-        this.customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-        bpLocToSave.set('json', JSON.stringify(this.customerAddr.serializeToJSON()));
-        bpLocToSave.set('c_bpartner_location_id', this.customerAddr.get('id'));
+        customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+        bpLocToSave.set('json', JSON.stringify(customerAddr.serializeToJSON()));
+        bpLocToSave.set('c_bpartner_location_id', customerAddr.get('id'));
       } else {
         isNew = true;
       }
       if (OB.MobileApp.model.hasPermission('OBPOS_remote.customer', true)) { //With high volume we only save adress we it is assigned to the order
         if (isNew) {
-          me.customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+          customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
           var uuid = OB.UTIL.get_UUID();
-          me.customerAddr.set('id', uuid);
-          me.customerAddr.id = uuid;
-          bpLocToSave.set('json', JSON.stringify(me.customerAddr.serializeToJSON()));
-          bpLocToSave.set('id', me.customerAddr.get('id'));
+          customerAddr.set('id', uuid);
+          customerAddr.id = uuid;
+          bpLocToSave.set('json', JSON.stringify(customerAddr.serializeToJSON()));
+          bpLocToSave.set('id', customerAddr.get('id'));
         }
         bpLocToSave.set('isbeingprocessed', 'Y');
         OB.Dal.save(bpLocToSave, function () {
-          bpLocToSave.set('json', me.customerAddr.serializeToJSON());
+          bpLocToSave.set('json', customerAddr.serializeToJSON());
           var successCallback, errorCallback, List;
           successCallback = function () {
-            OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerAddrSaved', [me.customerAddr.get('_identifier')]));
+            if (callback) {
+              callback();
+            }
+            OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerAddrSaved', [customerAddr.get('_identifier')]));
           };
           customerAddrListToChange = new OB.Collection.ChangedBPlocationList();
           customerAddrListToChange.add(bpLocToSave);
           OB.MobileApp.model.runSyncProcess(successCallback);
         }, function () {
           //error saving BP changes with changes in changedbusinesspartners
-          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrChn', [me.customerAddr.get('_identifier')]));
+          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrChn', [customerAddr.get('_identifier')]));
         }, isNew);
       } else {
         //save that the customer address is being processed by server
-        OB.Dal.save(this.customerAddr, function () {
+        OB.Dal.save(customerAddr, function () {
           // Update Default Address
 
           function errorCallback(tx, error) {
@@ -69,9 +77,9 @@
 
           function successCallbackBPs(dataBps) {
             if (dataBps.length === 0) {
-              OB.Dal.get(OB.Model.BusinessPartner, me.customerAddr.get('bpartner'), function success(dataBps) {
-                dataBps.set('locId', me.customerAddr.get('id'));
-                dataBps.set('locName', me.customerAddr.get('name'));
+              OB.Dal.get(OB.Model.BusinessPartner, customerAddr.get('bpartner'), function success(dataBps) {
+                dataBps.set('locId', customerAddr.get('id'));
+                dataBps.set('locName', customerAddr.get('name'));
                 OB.Dal.save(dataBps, function () {}, function (tx) {
                   OB.error(tx);
                 });
@@ -81,35 +89,38 @@
             }
           }
           var criteria = {};
-          criteria._whereClause = "where c_bpartner_id = '" + me.customerAddr.get('bpartner') + "' and c_bpartnerlocation_id > '" + me.customerAddr.get('id') + "'";
+          criteria._whereClause = "where c_bpartner_id = '" + customerAddr.get('bpartner') + "' and c_bpartnerlocation_id > '" + customerAddr.get('id') + "'";
           criteria.params = [];
           OB.Dal.find(OB.Model.BusinessPartner, criteria, successCallbackBPs, errorCallback);
 
           if (isNew) {
-            me.customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-            bpLocToSave.set('json', JSON.stringify(me.customerAddr.serializeToJSON()));
-            bpLocToSave.set('c_bpartner_location_id', me.customerAddr.get('id'));
+            customerAddr.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+            bpLocToSave.set('json', JSON.stringify(customerAddr.serializeToJSON()));
+            bpLocToSave.set('c_bpartner_location_id', customerAddr.get('id'));
           }
           bpLocToSave.set('isbeingprocessed', 'Y');
           OB.Dal.save(bpLocToSave, function () {
-            bpLocToSave.set('json', me.customerAddr.serializeToJSON());
+            bpLocToSave.set('json', customerAddr.serializeToJSON());
             var successCallback, errorCallback, List;
             successCallback = function () {
-              OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerAddrSaved', [me.customerAddr.get('_identifier')]));
+              if (callback) {
+                callback();
+              }
+              OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerAddrSaved', [customerAddr.get('_identifier')]));
             };
             customerAddrListToChange = new OB.Collection.ChangedBPlocationList();
             customerAddrListToChange.add(bpLocToSave);
             OB.MobileApp.model.runSyncProcess(successCallback);
           }, function () {
             //error saving BP changes with changes in changedbusinesspartners
-            OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrChn', [me.customerAddr.get('_identifier')]));
+            OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrChn', [customerAddr.get('_identifier')]));
           });
         }, function () {
           //error saving BP Location with new values in c_bpartner_location
           OB.error(arguments);
-          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrLocally', [me.customerAddr.get('_identifier')]));
+          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerAddrLocally', [customerAddr.get('_identifier')]));
         });
       }
-    }, this);
+    };
   };
 }());
\ No newline at end of file
diff --git a/web/org.openbravo.retail.posterminal/js/data/datacustomersave.js b/web/org.openbravo.retail.posterminal/js/data/datacustomersave.js
--- a/web/org.openbravo.retail.posterminal/js/data/datacustomersave.js
+++ b/web/org.openbravo.retail.posterminal/js/data/datacustomersave.js
@@ -17,34 +17,37 @@
     this.context = model;
     this.customer = model.get('customer');
 
+    // trigger is from previous code, keeping it for backward compat
+    this.customer.on('customerSaved', function () {
+      OB.DATA.executeCustomerSave(this.customer);
+    }, this);
 
-    this.customer.on('customerSaved', function () {
-      var me = this,
-          customersList, customerId = this.customer.get('id'),
+    OB.DATA.executeCustomerSave = function (customer, callback) {
+      var customersList, customerId = this.customer.get('id'),
           isNew = false,
           bpToSave = new OB.Model.ChangedBusinessPartners(),
           bpLocation, bpLocToSave = new OB.Model.BPLocation(),
           customersListToChange;
 
       bpToSave.set('isbeingprocessed', 'N');
-      this.customer.set('createdBy', OB.MobileApp.model.get('orgUserId'));
+      customer.set('createdBy', OB.MobileApp.model.get('orgUserId'));
       bpToSave.set('createdBy', OB.MobileApp.model.get('orgUserId'));
       if (customerId) {
-        this.customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-        bpToSave.set('json', JSON.stringify(this.customer.serializeEditedToJSON()));
-        bpToSave.set('c_bpartner_id', this.customer.get('id'));
+        customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+        bpToSave.set('json', JSON.stringify(customer.serializeEditedToJSON()));
+        bpToSave.set('c_bpartner_id', customer.get('id'));
       } else {
         isNew = true;
       }
 
       if (OB.MobileApp.model.hasPermission('OBPOS_remote.customer', true)) { //With high volume we only save localy when it is assigned to the order
         if (isNew) {
-          me.customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+          customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
           var uuid = OB.UTIL.get_UUID();
-          me.customer.set('id', uuid);
-          me.customer.id = uuid;
-          bpToSave.set('json', JSON.stringify(me.customer.serializeToJSON()));
-          bpToSave.set('id', me.customer.get('id'));
+          customer.set('id', uuid);
+          customer.id = uuid;
+          bpToSave.set('json', JSON.stringify(customer.serializeToJSON()));
+          bpToSave.set('id', customer.get('id'));
         }
 
         // the location is sent to the server as part of the BP save, but when the BP is 
@@ -54,12 +57,12 @@
         // but this takes another request, that's why it is created here as an object
         if (!bpToSave.get('locationModel')) {
           bpLocation = new OB.Model.BPLocation();
-          bpLocation.set('id', me.customer.get('locId'));
-          bpLocation.set('bpartner', me.customer.get('id'));
-          bpLocation.set('name', me.customer.get('locName'));
-          bpLocation.set('postalCode', me.customer.get('postalCode'));
-          bpLocation.set('cityName', me.customer.get('cityName'));
-          bpLocation.set('_identifier', me.customer.get('locName'));
+          bpLocation.set('id', customer.get('locId'));
+          bpLocation.set('bpartner', customer.get('id'));
+          bpLocation.set('name', customer.get('locName'));
+          bpLocation.set('postalCode', customer.get('postalCode'));
+          bpLocation.set('cityName', customer.get('cityName'));
+          bpLocation.set('_identifier', customer.get('locName'));
           bpLocation.set('countryName', OB.MobileApp.model.get('terminal').defaultbp_bpcountry_name);
           bpLocation.set('countryId', OB.MobileApp.model.get('terminal').defaultbp_bpcountry);
           bpToSave.set('locationModel', bpLocation);
@@ -67,33 +70,36 @@
 
         bpToSave.set('isbeingprocessed', 'Y');
         OB.UTIL.HookManager.executeHooks('OBPOS_PostCustomerSave', {
-          customer: me.customer,
+          customer: customer,
           bpToSave: bpToSave
         }, function (args) {
           OB.Dal.save(bpToSave, function () {
-            bpToSave.set('json', me.customer.serializeToJSON());
+            bpToSave.set('json', customer.serializeToJSON());
             var successCallback = function () {
-                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSaved', [me.customer.get('_identifier')]));
+                if (callback) {
+                  callback();
+                }
+                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSaved', [customer.get('_identifier')]));
                 };
             OB.MobileApp.model.runSyncProcess(successCallback);
           }, function () {
             //error saving BP changes with changes in changedbusinesspartners
-            OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerChanges', [me.customer.get('_identifier')]));
+            OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerChanges', [customer.get('_identifier')]));
           }, isNew);
         });
       } else {
         //save that the customer is being processed by server
-        OB.Dal.save(this.customer, function () {
-          //OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSavedSuccessfullyLocally',[me.customer.get('_identifier')]));
+        OB.Dal.save(customer, function () {
+          //OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSavedSuccessfullyLocally',[customer.get('_identifier')]));
           // Saving Customer Address locally
           if (!isNew) {
             //load the BPlocation and then update it
-            OB.Dal.get(OB.Model.BPLocation, me.customer.get('locId'), function (bpLocToUpdate) {
+            OB.Dal.get(OB.Model.BPLocation, customer.get('locId'), function (bpLocToUpdate) {
               if (bpLocToUpdate) {
-                bpLocToUpdate.set('name', me.customer.get('locName'));
-                bpLocToUpdate.set('postalCode', me.customer.get('postalCode'));
-                bpLocToUpdate.set('cityName', me.customer.get('cityName'));
-                bpLocToUpdate.set('_identifier', me.customer.get('locName'));
+                bpLocToUpdate.set('name', customer.get('locName'));
+                bpLocToUpdate.set('postalCode', customer.get('postalCode'));
+                bpLocToUpdate.set('cityName', customer.get('cityName'));
+                bpLocToUpdate.set('_identifier', customer.get('locName'));
                 OB.Dal.save(bpLocToUpdate, function () {
                   //customer location updated successfully. Nothing to do here.
                 }, function () {
@@ -107,12 +113,12 @@
             });
           } else {
             //create bploc from scratch
-            bpLocToSave.set('id', me.customer.get('locId'));
-            bpLocToSave.set('bpartner', me.customer.get('id'));
-            bpLocToSave.set('name', me.customer.get('locName'));
-            bpLocToSave.set('postalCode', me.customer.get('postalCode'));
-            bpLocToSave.set('cityName', me.customer.get('cityName'));
-            bpLocToSave.set('_identifier', me.customer.get('locName'));
+            bpLocToSave.set('id', customer.get('locId'));
+            bpLocToSave.set('bpartner', customer.get('id'));
+            bpLocToSave.set('name', customer.get('locName'));
+            bpLocToSave.set('postalCode', customer.get('postalCode'));
+            bpLocToSave.set('cityName', customer.get('cityName'));
+            bpLocToSave.set('_identifier', customer.get('locName'));
             bpLocToSave.set('countryName', OB.MobileApp.model.get('terminal').defaultbp_bpcountry_name);
             bpLocToSave.set('countryId', OB.MobileApp.model.get('terminal').defaultbp_bpcountry);
             OB.Dal.save(bpLocToSave, function () {
@@ -123,33 +129,36 @@
           }
 
           if (isNew) {
-            me.customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-            bpToSave.set('json', JSON.stringify(me.customer.serializeToJSON()));
-            bpToSave.set('c_bpartner_id', me.customer.get('id'));
+            customer.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+            bpToSave.set('json', JSON.stringify(customer.serializeToJSON()));
+            bpToSave.set('c_bpartner_id', customer.get('id'));
           }
           bpToSave.set('isbeingprocessed', 'Y');
           OB.UTIL.HookManager.executeHooks('OBPOS_PostCustomerSave', {
-            customer: me.customer,
+            customer: customer,
             bpToSave: bpToSave
           }, function (args) {
             OB.Dal.save(bpToSave, function () {
-              bpToSave.set('json', me.customer.serializeToJSON());
+              bpToSave.set('json', customer.serializeToJSON());
               var successCallback, errorCallback, List;
               successCallback = function () {
-                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSaved', [me.customer.get('_identifier')]));
+                if (callback) {
+                  callback();
+                }
+                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_customerSaved', [customer.get('_identifier')]));
               };
               OB.MobileApp.model.runSyncProcess(successCallback);
             }, function () {
               //error saving BP changes with changes in changedbusinesspartners
-              OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerChanges', [me.customer.get('_identifier')]));
+              OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerChanges', [customer.get('_identifier')]));
             });
           });
         }, function () {
           //error saving BP with new values in c_bpartner
-          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerLocally', [me.customer.get('_identifier')]));
+          OB.UTIL.showError(OB.I18N.getLabel('OBPOS_errorSavingCustomerLocally', [customer.get('_identifier')]));
         });
       }
 
-    }, this);
+    };
   };
 }());
\ No newline at end of file
diff --git a/web/org.openbravo.retail.posterminal/js/data/dataordersave.js b/web/org.openbravo.retail.posterminal/js/data/dataordersave.js
--- a/web/org.openbravo.retail.posterminal/js/data/dataordersave.js
+++ b/web/org.openbravo.retail.posterminal/js/data/dataordersave.js
@@ -69,292 +69,413 @@
     });
 
     // finished receipt verifications
-    this.receipt.on('closed', function (eventParams) {
-      this.receipt = model.get('order');
+    var mainReceiptCloseFunction = function (eventParams) {
+        this.receipt = model.get('order');
 
+        if (this.receipt.get('isbeingprocessed') === 'Y') {
 
-      if (this.receipt.get('isbeingprocessed') === 'Y') {
-        //The receipt has already been sent, it should not be sent again
-        return;
-      }
+          // clean up some synched data as this method is called in synchronized mode also
+          OB.MobileApp.model.resetCheckpointData();
+          //The receipt has already been sent, it should not be sent again
+          return;
+        }
 
-      OB.info('Ticket closed: ', OB.UTIL.argumentsToStringifyed(this.receipt.getOrderDescription()), "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
+        OB.info('Ticket closed: ', OB.UTIL.argumentsToStringifyed(this.receipt.getOrderDescription()), "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
 
-      var orderDate = new Date();
-      var normalizedCreationDate = OB.I18N.normalizeDate(this.receipt.get('creationDate'));
-      var creationDate;
-      if (normalizedCreationDate === null) {
-        creationDate = new Date();
-        normalizedCreationDate = OB.I18N.normalizeDate(creationDate);
-      } else {
-        creationDate = new Date(normalizedCreationDate);
-      }
+        var orderDate = new Date();
+        var normalizedCreationDate = OB.I18N.normalizeDate(this.receipt.get('creationDate'));
+        var creationDate;
+        if (normalizedCreationDate === null) {
+          creationDate = new Date();
+          normalizedCreationDate = OB.I18N.normalizeDate(creationDate);
+        } else {
+          creationDate = new Date(normalizedCreationDate);
+        }
 
-      OB.trace('Executing pre order save hook.');
+        OB.trace('Executing pre order save hook.');
 
-      OB.UTIL.HookManager.executeHooks('OBPOS_PreOrderSave', {
-        context: this,
-        model: model,
-        receipt: model.get('order')
-      }, function (args) {
-        var receipt = args.context.receipt;
-        if (args && args.cancellation && args.cancellation === true) {
-          args.context.receipt.set('isbeingprocessed', 'N');
-          args.context.receipt.set('hasbeenpaid', 'N');
-          args.context.receipt.trigger('paymentCancel');
-          if (eventParams && eventParams.callback) {
-            eventParams.callback({
-              frozenReceipt: receipt,
-              isCancelled: true
+        OB.UTIL.HookManager.executeHooks('OBPOS_PreOrderSave', {
+          context: this,
+          model: model,
+          receipt: model.get('order')
+        }, function (args) {
+          var receipt = args.context.receipt;
+          if (args && args.cancellation && args.cancellation === true) {
+            args.context.receipt.set('isbeingprocessed', 'N');
+            args.context.receipt.set('hasbeenpaid', 'N');
+            args.context.receipt.trigger('paymentCancel');
+            if (eventParams && eventParams.callback) {
+              eventParams.callback({
+                frozenReceipt: receipt,
+                isCancelled: true
+              });
+            }
+            args.context.receipt.setIsCalculateReceiptLockState(false);
+            args.context.receipt.setIsCalculateGrossLockState(false);
+            return true;
+          }
+
+          if (OB.UTIL.RfidController.isRfidConfigured()) {
+            OB.UTIL.RfidController.processRemainingCodes(receipt);
+            OB.UTIL.RfidController.updateEpcBuffers();
+          }
+
+          OB.trace('Execution of pre order save hook OK.');
+          delete receipt.attributes.json;
+          receipt.set('creationDate', normalizedCreationDate);
+          receipt.set('timezoneOffset', creationDate.getTimezoneOffset());
+          receipt.set('created', creationDate.getTime());
+          receipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate));
+          receipt.set('orderDate', orderDate);
+          receipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
+          receipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
+
+          // multiterminal support
+          // be sure that the active terminal is the one set as the order proprietary
+          receipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+          receipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
+
+          receipt.get("approvals").forEach(function (approval) {
+            if (typeof (approval.approvalType) === 'object') {
+              approval.approvalMessage = OB.I18N.getLabel(approval.approvalType.message, approval.approvalType.params);
+              approval.approvalType = approval.approvalType.approval;
+            }
+          });
+
+          receipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
+          // convert returns
+          if (receipt.getGross() < 0) {
+            _.forEach(receipt.get('payments').models, function (item) {
+              item.set('amount', -item.get('amount'));
+              item.set('origAmount', -item.get('origAmount'));
+              item.set('paid', -item.get('paid'));
             });
           }
-          args.context.receipt.setIsCalculateReceiptLockState(false);
-          args.context.receipt.setIsCalculateGrossLockState(false);
-          return true;
-        }
+          receipt.set('json', JSON.stringify(receipt.serializeToJSON()));
 
-        if (OB.UTIL.RfidController.isRfidConfigured()) {
-          OB.UTIL.RfidController.processRemainingCodes(receipt);
-          OB.UTIL.RfidController.updateEpcBuffers();
-        }
+          OB.trace('Calculationg cashup information.');
 
-        OB.trace('Execution of pre order save hook OK.');
-        delete receipt.attributes.json;
-        receipt.set('creationDate', normalizedCreationDate);
-        receipt.set('timezoneOffset', creationDate.getTimezoneOffset());
-        receipt.set('created', creationDate.getTime());
-        receipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate));
-        receipt.set('orderDate', orderDate);
-        receipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
-        receipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
-
-        // multiterminal support
-        // be sure that the active terminal is the one set as the order proprietary
-        receipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-        receipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
-
-        receipt.get("approvals").forEach(function (approval) {
-          if (typeof (approval.approvalType) === 'object') {
-            approval.approvalMessage = OB.I18N.getLabel(approval.approvalType.message, approval.approvalType.params);
-            approval.approvalType = approval.approvalType.approval;
-          }
-        });
-
-        receipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
-        // convert returns
-        if (receipt.getGross() < 0) {
-          _.forEach(receipt.get('payments').models, function (item) {
-            item.set('amount', -item.get('amount'));
-            item.set('origAmount', -item.get('origAmount'));
-            item.set('paid', -item.get('paid'));
-          });
-        }
-        receipt.set('json', JSON.stringify(receipt.serializeToJSON()));
-
-        OB.trace('Calculationg cashup information.');
-
-        // Important: at this point, the receipt is considered final. Nothing must alter it
-        var frozenReceipt = new OB.Model.Order();
-        OB.UTIL.clone(receipt, frozenReceipt);
-        OB.info("[receipt.closed] Starting transaction. ReceiptId: " + receipt.get('id'));
-        OB.Dal.transaction(function (tx) {
-          receipt.set('hasbeenpaid', 'Y');
-          frozenReceipt.set('hasbeenpaid', 'Y');
-          // when all the properties of the receipt have been set, keep a copy
-          OB.UTIL.cashUpReport(receipt, function () {
-            OB.UTIL.calculateCurrentCash(null, tx);
-            OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(receipt.get('documentnoSuffix'), receipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'), function () {
-              OB.trace('Saving receipt.');
-              OB.Dal.saveInTransaction(tx, receipt, function () {
-                // the trigger is fired on the receipt object, as there is only 1 that is being updated
-                receipt.trigger('integrityOk'); // Is important for module print last receipt. This module listen trigger.   
-              });
+          // Important: at this point, the receipt is considered final. Nothing must alter it
+          var frozenReceipt = new OB.Model.Order();
+          OB.UTIL.clone(receipt, frozenReceipt);
+          OB.info("[receipt.closed] Starting transaction. ReceiptId: " + receipt.get('id'));
+          OB.Dal.transaction(function (tx) {
+            receipt.set('hasbeenpaid', 'Y');
+            frozenReceipt.set('hasbeenpaid', 'Y');
+            // when all the properties of the receipt have been set, keep a copy
+            OB.UTIL.cashUpReport(receipt, function () {
+              if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                OB.Dal.saveInTransaction(tx, receipt);
+              } else {
+                OB.UTIL.calculateCurrentCash(null, tx);
+                OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(receipt.get('documentnoSuffix'), receipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'), function () {
+                  OB.trace('Saving receipt.');
+                  OB.Dal.saveInTransaction(tx, receipt, function () {
+                    // the trigger is fired on the receipt object, as there is only 1 that is being updated
+                    receipt.trigger('integrityOk'); // Is important for module print last receipt. This module listen trigger.   
+                  });
+                }, tx);
+              }
             }, tx);
-          }, tx);
-        }, function () {
-          // the transaction failed
-          OB.error("[receipt.closed] The transaction failed to be commited. ReceiptId: " + receipt.get('id'));
-          // rollback other changes
-          receipt.set('hasbeenpaid', 'N');
-          frozenReceipt.set('hasbeenpaid', 'N');
-          if (eventParams && eventParams.callback) {
-            eventParams.callback({
-              frozenReceipt: frozenReceipt,
-              isCancelled: false
-            });
-          }
-        }, function () {
-          // success transaction...
-          OB.info("[receipt.closed] Transaction success. ReceiptId: " + receipt.get('id'));
-
-          function serverMessageForQuotation(receipt) {
-            var isLayaway = (receipt.get('orderType') === 2 || receipt.get('isLayaway'));
-            var currentDocNo = receipt.get('documentNo');
-            if (receipt && receipt.get('isQuotation')) {
-              OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_QuotationSaved', [currentDocNo]));
-            } else {
-              if (isLayaway) {
-                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgLayawaySaved', [currentDocNo]));
-              } else {
-                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgReceiptSaved', [currentDocNo]));
-              }
-            }
-
-            OB.trace('Order successfully removed.');
-          }
-
-          // create a clone of the receipt to be used when executing the final callback
-          if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
-            // create a clone of the receipt to be used within the hook
-            var receiptForPostSyncReceipt = new OB.Model.Order();
-            OB.UTIL.clone(receipt, receiptForPostSyncReceipt);
-            //If there are elements in the hook, we are forced to execute the callback only after the synchronization process
-            //has been executed, to prevent race conditions with the callback processes (printing and deleting the receipt)
-            OB.trace('Execution Sync process.');
-
-            OB.MobileApp.model.runSyncProcess(function () {
-              OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
-                receipt: receiptForPostSyncReceipt
-              }, function () {
-                serverMessageForQuotation(receipt);
-                if (eventParams && eventParams.callback) {
-                  eventParams.callback({
-                    frozenReceipt: frozenReceipt,
-                    isCancelled: false
-                  });
-                }
-              });
-            }, function () {
-              OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
-                receipt: receiptForPostSyncReceipt
-              }, function () {
-                if (eventParams && eventParams.callback) {
-                  eventParams.callback({
-                    frozenReceipt: frozenReceipt,
-                    isCancelled: false
-                  });
-                }
-              });
-            });
-          } else {
-            OB.trace('Execution Sync process.');
-            //If there are no elements in the hook, we can execute the callback asynchronusly with the synchronization process
+          }, function () {
+            // the transaction failed
+            OB.error("[receipt.closed] The transaction failed to be commited. ReceiptId: " + receipt.get('id'));
+            // rollback other changes
+            receipt.set('hasbeenpaid', 'N');
+            frozenReceipt.set('hasbeenpaid', 'N');
             if (eventParams && eventParams.callback) {
               eventParams.callback({
                 frozenReceipt: frozenReceipt,
                 isCancelled: false
               });
             }
-            OB.MobileApp.model.runSyncProcess(function () {
-              serverMessageForQuotation(frozenReceipt);
-              OB.debug("Ticket closed: runSyncProcess executed");
-            });
+          }, function () {
+            // success transaction...
+            OB.info("[receipt.closed] Transaction success. ReceiptId: " + receipt.get('id'));
+
+            function serverMessageForQuotation(receipt) {
+              var isLayaway = (receipt.get('orderType') === 2 || receipt.get('isLayaway'));
+              var currentDocNo = receipt.get('documentNo');
+              if (receipt && receipt.get('isQuotation')) {
+                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_QuotationSaved', [currentDocNo]));
+              } else {
+                if (isLayaway) {
+                  OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgLayawaySaved', [currentDocNo]));
+                } else {
+                  OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgReceiptSaved', [currentDocNo]));
+                }
+              }
+
+              OB.trace('Order successfully removed.');
+            }
+
+            var synErrorCallback = function () {
+                if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                  // rollback other changes
+                  receipt.set('hasbeenpaid', 'N');
+                  frozenReceipt.set('hasbeenpaid', 'N');
+
+                  OB.Dal.save(receipt, function () {
+                    OB.UTIL.calculateCurrentCash();
+
+                    if (eventParams && eventParams.callback) {
+                      eventParams.callback({
+                        frozenReceipt: frozenReceipt,
+                        isCancelled: true
+                      });
+                      receipt.trigger('paymentCancel');
+                    }
+                  }, null, false);
+                } else if (eventParams && eventParams.callback) {
+                  eventParams.callback({
+                    frozenReceipt: frozenReceipt,
+                    isCancelled: false
+                  });
+                }
+                };
+
+            // create a clone of the receipt to be used when executing the final callback
+            if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
+              // create a clone of the receipt to be used within the hook
+              var receiptForPostSyncReceipt = new OB.Model.Order();
+              OB.UTIL.clone(receipt, receiptForPostSyncReceipt);
+              //If there are elements in the hook, we are forced to execute the callback only after the synchronization process
+              //has been executed, to prevent race conditions with the callback processes (printing and deleting the receipt)
+              OB.trace('Execution Sync process.');
+
+              OB.MobileApp.model.runSyncProcess(function () {
+                var successStep = function () {
+                    OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
+                      receipt: receiptForPostSyncReceipt
+                    }, function () {
+                      serverMessageForQuotation(receipt);
+                      if (eventParams && eventParams.callback) {
+                        eventParams.callback({
+                          frozenReceipt: frozenReceipt,
+                          isCancelled: false
+                        });
+                      }
+                    });
+                    };
+
+                // in synchronized mode do the doc sequence update in the success
+                if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                  OB.UTIL.calculateCurrentCash();
+                  OB.Dal.transaction(function (tx) {
+                    OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(receipt.get('documentnoSuffix'), receipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'), function () {
+                      OB.trace('Saving receipt.');
+                      OB.Dal.saveInTransaction(tx, receipt, function () {
+                        // the trigger is fired on the receipt object, as there is only 1 that is being updated
+                        receipt.trigger('integrityOk'); // Is important for module print last receipt. This module listen trigger.   
+                        successStep();
+                      });
+                    }, tx);
+                  });
+                } else {
+                  successStep();
+                }
+              }, function () {
+                OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
+                  receipt: receiptForPostSyncReceipt
+                }, synErrorCallback);
+              });
+            } else {
+              OB.trace('Execution Sync process.');
+              //If there are no elements in the hook, we can execute the callback asynchronusly with the synchronization process
+              // for non-sync do it here, for sync do it in the success callback of runsyncprocess
+              if (!OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true) && eventParams && eventParams.callback) {
+                eventParams.callback({
+                  frozenReceipt: frozenReceipt,
+                  isCancelled: false
+                });
+              }
+              OB.MobileApp.model.runSyncProcess(function () {
+                // in synchronized mode do the doc sequence update in the success and navigate back
+                if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                  OB.UTIL.calculateCurrentCash();
+                  OB.Dal.transaction(function (tx) {
+                    OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(receipt.get('documentnoSuffix'), receipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'), function () {
+                      OB.trace('Saving receipt.');
+                      OB.Dal.saveInTransaction(tx, receipt, function () {
+                        // the trigger is fired on the receipt object, as there is only 1 that is being updated
+                        receipt.trigger('integrityOk'); // Is important for module print last receipt. This module listen trigger.   
+                        if (eventParams && eventParams.callback) {
+                          eventParams.callback({
+                            frozenReceipt: frozenReceipt,
+                            isCancelled: false
+                          });
+                        }
+                      });
+                    }, tx);
+                  });
+                }
+
+                serverMessageForQuotation(frozenReceipt);
+                OB.debug("Ticket closed: runSyncProcess executed");
+              }, synErrorCallback);
+            }
+          });
+        });
+        };
+
+    this.receipt.on('closed', function (eventParams) {
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+        OB.MobileApp.model.setSynchronizedCheckpoint(function () {
+          mainReceiptCloseFunction(eventParams);
+        });
+      } else {
+        mainReceiptCloseFunction(eventParams);
+      }
+    }, this);
+
+    var multiOrdersFunction = function (receipt, me) {
+        var synchId = OB.UTIL.SynchronizationHelper.busyUntilFinishes("multiOrdersClosed");
+
+        OB.info('Multiorders ticket closed', receipt, "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
+
+        if (!_.isUndefined(receipt)) {
+          me.receipt = receipt;
+        }
+        var receiptId = me.receipt.get('id');
+
+        var normalizedCreationDate = OB.I18N.normalizeDate(me.receipt.get('creationDate'));
+        var creationDate;
+        if (normalizedCreationDate === null) {
+          creationDate = new Date();
+          normalizedCreationDate = OB.I18N.normalizeDate(creationDate);
+        } else {
+          creationDate = new Date(normalizedCreationDate);
+        }
+
+        me.receipt.set('creationDate', normalizedCreationDate);
+        me.receipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
+        me.receipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
+        me.receipt.set('hasbeenpaid', 'Y');
+        me.context.get('multiOrders').trigger('integrityOk', me.receipt);
+
+        if (!OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+          OB.UTIL.calculateCurrentCash();
+          me.context.get('multiOrders').trigger('integrityOk', me.receipt);
+          OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(me.receipt.get('documentnoSuffix'), me.receipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'));
+        }
+
+        delete me.receipt.attributes.json;
+        me.receipt.set('timezoneOffset', creationDate.getTimezoneOffset());
+        me.receipt.set('created', creationDate.getTime());
+        me.receipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate)); // Absolute date in ISO format
+        // multiterminal support
+        // be sure that the active terminal is the one set as the order proprietary
+        receipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+        receipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
+
+        me.receipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
+        me.receipt.set('json', JSON.stringify(me.receipt.serializeToJSON()));
+
+        OB.trace('Executing pre order save hook.');
+
+        OB.UTIL.HookManager.executeHooks('OBPOS_PreOrderSave', {
+          context: this,
+          model: model,
+          receipt: me.receipt
+        }, function (args) {
+
+          OB.trace('Execution of pre order save hook OK.');
+          if (args && args.cancellation && args.cancellation === true) {
+            args.context.receipt.set('isbeingprocessed', 'N');
+            OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
+            return true;
           }
+
+          OB.trace('Saving receipt.');
+
+          OB.Dal.save(me.receipt, function () {
+            OB.Dal.get(OB.Model.Order, receiptId, function (receipt) {
+
+              var successCallback = function () {
+                  OB.trace('Sync process success.');
+
+                  if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+
+                    enyo.$.scrim.hide();
+
+                    OB.UTIL.calculateCurrentCash();
+                    _.each(model.get('multiOrders').get('multiOrdersList').models, function (theReceipt) {
+                      me.context.get('multiOrders').trigger('print', theReceipt, {
+                        offline: true
+                      });
+                      me.context.get('multiOrders').trigger('integrityOk', theReceipt);
+                      OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(theReceipt.get('documentnoSuffix'), theReceipt.get('quotationnoSuffix'), receipt.get('returnnoSuffix'));
+                    });
+
+                    OB.UTIL.cashUpReport(model.get('multiOrders').get('multiOrdersList').models);
+
+                    //this logic executed when all orders are ready to be sent
+                    me.context.get('leftColumnViewManager').setOrderMode();
+                    if (me.context.get('orderList').length > _.filter(me.context.get('multiOrders').get('multiOrdersList').models, function (order) {
+                      return !order.get('isLayaway');
+                    }).length) {
+                      me.context.get('orderList').addNewOrder();
+                    }
+                  }
+
+                  model.get('multiOrders').resetValues();
+
+                  OB.UTIL.showLoading(false);
+                  if (me.hasInvLayaways) {
+                    OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_noInvoiceIfLayaway'));
+                    me.hasInvLayaways = false;
+                  }
+                  OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgAllReceiptSaved'));
+                  OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
+                  };
+
+              var errorCallback = function () {
+                  OB.UTIL.showError(OB.I18N.getLabel('OBPOS_MsgAllReceiptNotSaved'));
+                  OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
+
+
+                  // recalculate after an error also
+                  if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                    OB.UTIL.calculateCurrentCash();
+                  }
+                  model.get('multiOrders').resetValues();
+                  };
+
+              if (!_.isUndefined(receipt.get('amountToLayaway')) && !_.isNull(receipt.get('amountToLayaway')) && receipt.get('generateInvoice')) {
+                me.hasInvLayaways = true;
+              }
+              model.get('orderList').current = receipt;
+              model.get('orderList').deleteCurrent();
+              me.ordersToSend += 1;
+              if (model.get('multiOrders').get('multiOrdersList').length === me.ordersToSend) {
+                OB.trace('Execution Sync process.');
+
+                OB.MobileApp.model.runSyncProcess(successCallback, errorCallback);
+                me.ordersToSend = OB.DEC.Zero;
+              } else {
+                OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
+              }
+
+            }, null);
+          }, function () {
+            // We do nothing:
+            //      we don't need to alert the user, as the order is still present in the database, so it will be resent as soon as the user logs in again
+            OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
+          });
         });
 
-      });
-    }, this);
+        };
 
     this.context.get('multiOrders').on('closed', function (receipt) {
-      var synchId = OB.UTIL.SynchronizationHelper.busyUntilFinishes("multiOrdersClosed");
+      var me = this;
 
-      OB.info('Multiorders ticket closed', receipt, "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
-
-      var me = this;
-      if (!_.isUndefined(receipt)) {
-        this.receipt = receipt;
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true) && me.ordersToSend === 0) {
+        OB.MobileApp.model.setSynchronizedCheckpoint(function () {
+          multiOrdersFunction(receipt, me);
+        });
+      } else {
+        multiOrdersFunction(receipt, me);
       }
-      var receiptId = this.receipt.get('id');
-
-      var normalizedCreationDate = OB.I18N.normalizeDate(this.receipt.get('creationDate'));
-      var creationDate;
-      if (normalizedCreationDate === null) {
-        creationDate = new Date();
-        normalizedCreationDate = OB.I18N.normalizeDate(creationDate);
-      } else {
-        creationDate = new Date(normalizedCreationDate);
-      }
-
-      this.receipt.set('creationDate', normalizedCreationDate);
-      this.receipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
-      this.receipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
-      this.receipt.set('hasbeenpaid', 'Y');
-      this.context.get('multiOrders').trigger('integrityOk', this.receipt);
-      OB.UTIL.calculateCurrentCash();
-      OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(this.receipt.get('documentnoSuffix'), this.receipt.get('quotationnoSuffix'), this.receipt.get('returnnoSuffix'));
-
-      delete this.receipt.attributes.json;
-      this.receipt.set('timezoneOffset', creationDate.getTimezoneOffset());
-      this.receipt.set('created', creationDate.getTime());
-      this.receipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate)); // Absolute date in ISO format
-      // multiterminal support
-      // be sure that the active terminal is the one set as the order proprietary
-      receipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-      receipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
-
-      this.receipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
-      this.receipt.set('json', JSON.stringify(this.receipt.serializeToJSON()));
-
-      OB.trace('Executing pre order save hook.');
-
-      OB.UTIL.HookManager.executeHooks('OBPOS_PreOrderSave', {
-        context: this,
-        model: model,
-        receipt: this.receipt
-      }, function (args) {
-
-        OB.trace('Execution of pre order save hook OK.');
-        if (args && args.cancellation && args.cancellation === true) {
-          args.context.receipt.set('isbeingprocessed', 'N');
-          OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
-          return true;
-        }
-
-        OB.trace('Saving receipt.');
-
-        OB.Dal.save(me.receipt, function () {
-          OB.Dal.get(OB.Model.Order, receiptId, function (receipt) {
-
-            var successCallback = function () {
-                OB.trace('Sync process success.');
-                OB.UTIL.showLoading(false);
-                if (me.hasInvLayaways) {
-                  OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_noInvoiceIfLayaway'));
-                  me.hasInvLayaways = false;
-                }
-                OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_MsgAllReceiptSaved'));
-                OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
-                };
-
-            var errorCallback = function () {
-                OB.UTIL.showError(OB.I18N.getLabel('OBPOS_MsgAllReceiptNotSaved'));
-                OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
-                };
-
-            if (!_.isUndefined(receipt.get('amountToLayaway')) && !_.isNull(receipt.get('amountToLayaway')) && receipt.get('generateInvoice')) {
-              me.hasInvLayaways = true;
-            }
-            model.get('orderList').current = receipt;
-            model.get('orderList').deleteCurrent();
-            me.ordersToSend += 1;
-            if (model.get('multiOrders').get('multiOrdersList').length === me.ordersToSend) {
-              model.get('multiOrders').resetValues();
-
-              OB.trace('Execution Sync process.');
-
-              OB.MobileApp.model.runSyncProcess(successCallback, errorCallback);
-              me.ordersToSend = OB.DEC.Zero;
-            } else {
-              OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
-            }
-
-          }, null);
-        }, function () {
-          // We do nothing:
-          //      we don't need to alert the user, as the order is still present in the database, so it will be resent as soon as the user logs in again
-          OB.UTIL.SynchronizationHelper.finished(synchId, "multiOrdersClosed");
-        });
-      });
 
     }, this);
   };
diff --git a/web/org.openbravo.retail.posterminal/js/login/model/login-model.js b/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
--- a/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
+++ b/web/org.openbravo.retail.posterminal/js/login/model/login-model.js
@@ -360,13 +360,23 @@
           if (dataToSync.length === 1 && this.model === OB.Model.CashUp && localStorage.lastCashupInfo === dataToSync.models[0].get('objToSend')) {
             me.skipSyncModel = true;
           }
-          localStorage.lastCashupInfo = dataToSync.models[0].get('objToSend');
+          localStorage.lastCashupSendInfo = dataToSync.models[0].get('objToSend');
+        },
+        // keep track of successfull send
+        successSendModel: function () {
+          localStorage.lastCashupInfo = localStorage.lastCashupSendInfo;
         }
       });
 
       this.on('ready', function () {
         OB.debug("next process: 'retail.pointofsale' window");
 
+        // register models which are cached during synchronized transactions
+        OB.MobileApp.model.addSyncCheckpointModel(OB.Model.Order);
+        OB.MobileApp.model.addSyncCheckpointModel(OB.Model.PaymentMethodCashUp);
+        OB.MobileApp.model.addSyncCheckpointModel(OB.Model.TaxCashUp);
+        OB.MobileApp.model.addSyncCheckpointModel(OB.Model.CashUp);
+
         var terminal = this.get('terminal');
         OB.UTIL.initCashUp(OB.UTIL.calculateCurrentCash);
         // Set Hardware..
diff --git a/web/org.openbravo.retail.posterminal/js/model/bplocation.js b/web/org.openbravo.retail.posterminal/js/model/bplocation.js
--- a/web/org.openbravo.retail.posterminal/js/model/bplocation.js
+++ b/web/org.openbravo.retail.posterminal/js/model/bplocation.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2015 Openbravo S.L.U.
+ * Copyright (C) 2012-2016 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -21,14 +21,19 @@
     dataLimit: OB.Dal.DATALIMIT,
     local: false,
     remote: 'OBPOS_remote.customer',
-    saveCustomerAddr: function (silent) {
+    saveCustomerAddr: function (callback) {
       var nameLength, newSk;
 
       this.set('_identifier', this.get('name'));
-      this.trigger('customerAddrSaved');
+
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+        OB.DATA.executeCustomerAddressSave(this, callback);
+      } else {
+        this.trigger('customerAddrSaved');
+        callback();
+      }
+
       return true;
-      //datacustomeraddrsave will catch this event and save this locally with changed = 'Y'
-      //Then it will try to send to the backend
     },
     loadById: function (CusAddrId, userCallback) {
       //search data in local DB and load it to this
diff --git a/web/org.openbravo.retail.posterminal/js/model/businesspartner.js b/web/org.openbravo.retail.posterminal/js/model/businesspartner.js
--- a/web/org.openbravo.retail.posterminal/js/model/businesspartner.js
+++ b/web/org.openbravo.retail.posterminal/js/model/businesspartner.js
@@ -18,7 +18,7 @@
     source: 'org.openbravo.retail.posterminal.master.BusinessPartner',
     dataLimit: OB.Dal.DATALIMIT,
     remote: 'OBPOS_remote.customer',
-    saveCustomer: function (silent) {
+    saveCustomer: function (callback) {
       var nameLength, newSk;
 
       if (!this.get("name")) {
@@ -50,9 +50,13 @@
 
       this.set('_identifier', this.get('name'));
 
-      this.trigger('customerSaved');
-      //datacustomersave will catch this event and save this locally with changed = 'Y'
-      //Then it will try to send to the backend
+      // in case of synchronized then directly call customer save with the callback
+      if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+        OB.DATA.executeCustomerSave(this, callback);
+      } else {
+        this.trigger('customerSaved');
+        callback();
+      }
       return true;
     },
     loadById: function (CusId, userCallback) {
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-model.js b/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-model.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-model.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/model/pointofsale-model.js
@@ -496,16 +496,18 @@
           }
         }
         me.get('multiOrders').trigger('closed', order);
-        enyo.$.scrim.hide();
-        me.get('multiOrders').trigger('print', order, {
-          offline: true
-        }); // to guaranty execution order
-        SyncReadyToSendFunction();
+        if (!OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+          enyo.$.scrim.hide();
+          me.get('multiOrders').trigger('print', order, {
+            offline: true
+          }); // to guaranty execution order
+          SyncReadyToSendFunction();
 
-        auxReceiptList.push(auxReceipt);
-        if (auxReceiptList.length === me.get('multiOrders').get('multiOrdersList').length) {
-          OB.UTIL.cashUpReport(auxReceiptList);
-          auxReceiptList = [];
+          auxReceiptList.push(auxReceipt);
+          if (auxReceiptList.length === me.get('multiOrders').get('multiOrdersList').length) {
+            OB.UTIL.cashUpReport(auxReceiptList);
+            auxReceiptList = [];
+          }
         }
       }
       var i, j;
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customeraddress/components/sharedcomponents.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customeraddress/components/sharedcomponents.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customeraddress/components/sharedcomponents.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customeraddress/components/sharedcomponents.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012 Openbravo S.L.U.
+ * Copyright (C) 2012-2016 Openbravo S.L.U.
  * Licensed under the Openbravo Commercial License version 1.0
  * You may obtain a copy of the License at http://www.openbravo.com/legal/obcl.html
  * or in the legal folder of this module distribution.
@@ -174,11 +174,14 @@
       if (this.model.get('customerAddr').get('name') === '') {
         OB.UTIL.showWarning('Address is required for BPartner');
         return false;
-      } else if (this.model.get('customerAddr').saveCustomerAddr()) {
-        goToViewWindow(sw, {
-          customer: OB.UTIL.clone(this.customer),
-          customerAddr: OB.UTIL.clone(this.model.get('customerAddr'))
-        });
+      } else {
+        var callback = function () {
+            goToViewWindow(sw, {
+              customer: OB.UTIL.clone(me.customer),
+              customerAddr: OB.UTIL.clone(me.model.get('customerAddr'))
+            });
+            };
+        this.model.get('customerAddr').saveCustomerAddr(callback);
       }
     } else {
       this.model.get('customerAddr').loadById(this.customerAddr.get('id'), function (customerAddr) {
@@ -186,28 +189,30 @@
           OB.UTIL.showWarning(OB.I18N.getLabel('OBPOS_BPartnerAddressRequired'));
           return false;
         } else {
+          var callback = function () {
+              goToViewWindow(sw, {
+                customer: me.customer,
+                customerAddr: customerAddr
+              });
+              if (customerAddr.get('id') === me.customer.get("locId")) {
+                me.customer.set('locId', customerAddr.get('id'));
+                me.customer.set('locName', customerAddr.get('name'));
+                me.customer.set('locationModel', customerAddr);
+                OB.Dal.save(me.customer, function success(tx) {
+                  me.doChangeBusinessPartner({
+                    businessPartner: me.customer
+                  });
+                }, function error(tx) {
+                  OB.error(tx);
+                });
+
+              }
+
+              };
           getCustomerAddrValues({
             customerAddr: customerAddr
           });
-          if (customerAddr.saveCustomerAddr()) {
-            goToViewWindow(sw, {
-              customer: me.customer,
-              customerAddr: customerAddr
-            });
-            if (customerAddr.get('id') === me.customer.get("locId")) {
-              me.customer.set('locId', customerAddr.get('id'));
-              me.customer.set('locName', customerAddr.get('name'));
-              me.customer.set('locationModel', customerAddr);
-              OB.Dal.save(me.customer, function success(tx) {
-                me.doChangeBusinessPartner({
-                  businessPartner: me.customer
-                });
-              }, function error(tx) {
-                OB.error(tx);
-              });
-
-            }
-          }
+          customerAddr.saveCustomerAddr(callback);
         }
       });
     }
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customers/components/sharedcomponents.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customers/components/sharedcomponents.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customers/components/sharedcomponents.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/subwindows/customers/components/sharedcomponents.js
@@ -244,12 +244,11 @@
         if (args && args.cancellation && args.cancellation === true) {
           return true;
         }
-        var success = args.customer.saveCustomer();
-        if (success) {
+        args.customer.saveCustomer(function () {
           goToViewWindow(sw, {
             customer: OB.UTIL.clone(args.customer)
           });
-        }
+        });
       });
     } else {
       var that = this;
@@ -265,12 +264,11 @@
           if (args && args.cancellation && args.cancellation === true) {
             return true;
           }
-          var success = args.customer.saveCustomer();
-          if (success) {
+          args.customer.saveCustomer(function () {
             goToViewWindow(sw, {
               customer: args.customer
             });
-          }
+          });
         });
       });
     }
diff --git a/web/org.openbravo.retail.posterminal/js/utils/cashUpReportUtils.js b/web/org.openbravo.retail.posterminal/js/utils/cashUpReportUtils.js
--- a/web/org.openbravo.retail.posterminal/js/utils/cashUpReportUtils.js
+++ b/web/org.openbravo.retail.posterminal/js/utils/cashUpReportUtils.js
@@ -359,6 +359,45 @@
     }, this);
   };
 
+  // 1. call server for cashup info
+  // 2. when returns delete current cashup info 
+  // 3. recreate
+  OB.UTIL.rebuildCashupFromServer = function (callback) {
+    var service = 'org.openbravo.retail.posterminal.master.Cashup';
+    if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+      service = 'org.openbravo.retail.posterminal.master.CashupSynchronized';
+    }
+    new OB.DS.Process(service).exec({
+      isprocessed: 'N',
+      isprocessedbo: 'N'
+    }, function (data) {
+      var afterDeleteCallback = function () {
+          // Found non processed cashups
+          if (data[0]) {
+            var cashUp = new OB.Model.CashUp();
+            cashUp.set(data[0]);
+            var cashUpCollection = new Backbone.Collection();
+            cashUpCollection.push(cashUp);
+            OB.UTIL.createNewCashupFromServer(cashUp, function () {
+              OB.UTIL.composeCashupInfo(cashUpCollection, null, null);
+              OB.UTIL.calculateCurrentCash(callback);
+            });
+          } else {
+            OB.UTIL.createNewCashup(callback);
+          }
+          };
+
+      // remove the current cashup
+      OB.Dal.transaction(function (tx) {
+        OB.Dal.removeAllInTransaction(tx, OB.Model.PaymentMethodCashUp);
+        OB.Dal.removeAllInTransaction(tx, OB.Model.TaxCashUp);
+        OB.Dal.removeAllInTransaction(tx, OB.Model.CashUp);
+        OB.Dal.removeAllInTransaction(tx, OB.Model.CashManagement);
+      }, null, afterDeleteCallback);
+
+    });
+  };
+
   OB.UTIL.initCashUp = function (callback, errorCallback, skipSearchBackend) {
 
     //1. Search non processed cashup in local DB
