diff --git a/src/org/openbravo/retail/posterminal/OrderLoader.java b/src/org/openbravo/retail/posterminal/OrderLoader.java
--- a/src/org/openbravo/retail/posterminal/OrderLoader.java
+++ b/src/org/openbravo/retail/posterminal/OrderLoader.java
@@ -1305,10 +1305,10 @@
       if (payment.optBoolean("isPrePayment", false)) {
         continue;
       }
-      
+
       BigDecimal amount = BigDecimal.valueOf(payment.getDouble("origAmount"))
           .setScale(pricePrecision, RoundingMode.HALF_UP);
-      if(amount.signum()==0) {
+      if (amount.signum() == 0) {
         continue;
       }
 
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
@@ -124,7 +124,6 @@
         context.receipt = model.get('order');
 
         if (context.receipt.get('isbeingprocessed') === 'Y') {
-
           // 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
@@ -134,8 +133,7 @@
         var orderDate = new Date();
         var normalizedCreationDate = OB.I18N.normalizeDate(context.receipt.get('creationDate'));
         var creationDate;
-        var frozenReceipt = new OB.Model.Order(),
-            diffReceipt = new OB.Model.Order();
+        var diffReceipt = new OB.Model.Order();
         if (normalizedCreationDate === null) {
           creationDate = new Date();
           normalizedCreationDate = OB.I18N.normalizeDate(creationDate);
@@ -150,7 +148,8 @@
           model: model,
           receipt: model.get('order')
         }, function (args) {
-          var receipt = args.context.receipt;
+          var receipt = args.context.receipt,
+              closedOrderList = [args.context.receipt];
           if (args && args.cancellation && args.cancellation === true) {
             args.context.receipt.set('isbeingprocessed', 'N');
             args.context.receipt.set('hasbeenpaid', 'N');
@@ -166,221 +165,263 @@
             args.context.receipt.setIsCalculateGrossLockState(false);
             return true;
           }
-          OB.UTIL.clone(receipt, frozenReceipt);
-
-          OB.UTIL.TicketCloseUtils.processChangePayments(frozenReceipt, function () {
-            receipt.trigger('checkOpenDrawer');
 
-            if (OB.UTIL.RfidController.isRfidConfigured()) {
-              OB.UTIL.RfidController.processRemainingCodes(frozenReceipt);
-              OB.UTIL.RfidController.updateEpcBuffers();
-            }
+          //New Hook From Here
+          OB.UTIL.HookManager.executeHooks('OBPOS_PreProcessActions', {
+            closedOrder: model.get('order'),
+            closedOrderList: closedOrderList
+          }, function (args) {
+            var frozenOrderList = [];
+            var syncReceipt, updateCashup, completeOrder;
+
+            syncReceipt = function () {
 
-            OB.trace('Execution of pre order save hook OK.');
-            delete frozenReceipt.attributes.json;
-            frozenReceipt.set('creationDate', normalizedCreationDate);
-            frozenReceipt.set('timezoneOffset', creationDate.getTimezoneOffset());
-            frozenReceipt.set('created', creationDate.getTime());
-            frozenReceipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate));
-            frozenReceipt.set('orderDate', orderDate);
-            frozenReceipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
-            frozenReceipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
-            frozenReceipt.set('undo', null);
-            frozenReceipt.set('multipleUndo', null);
-
-            // Set the quantities to deliver
-            frozenReceipt.setQuantitiesToDeliver();
+              var frozenReceipt = frozenOrderList[0],
+                  syncSuccessCallback, syncErrorCallback, closeParamCallback, restoreReceiptCallback, serverMessageForQuotation, receiptForPostSyncReceipt;
+              // success transaction...
+              OB.info("[receipt.closed] Transaction success. ReceiptId: " + frozenReceipt.get('id'));
+              OB.info('Ticket closed: ', frozenReceipt.get('json').replace(/logclientErrors/g, "logErrors"), "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
 
-            frozenReceipt.set('paymentMethodKind', null);
-            if (frozenReceipt.get('payments').length === 1 && frozenReceipt.get('completeTicket') && frozenReceipt.isFullyPaid()) {
-              var payment = frozenReceipt.get('payments').models[0];
-              frozenReceipt.set('paymentMethodKind', payment.get('kind'));
-            }
-
-            // multiterminal support
-            // be sure that the active terminal is the one set as the order proprietary
-            frozenReceipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
-            frozenReceipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
-
-            frozenReceipt.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;
+              // create a clone of the receipt to be used when executing the final callback
+              receipt.clearWith(frozenReceipt);
+              OB.UTIL.clone(receipt, diffReceipt);
+              if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
+                receiptForPostSyncReceipt = new OB.Model.Order();
+                OB.UTIL.clone(frozenReceipt, receiptForPostSyncReceipt);
               }
-            });
 
-            frozenReceipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
-            // convert returns
-            if (receipt.isNegative()) {
-              _.forEach(frozenReceipt.get('payments').models, function (item) {
-                if (!item.get('isPrePayment') && !item.get('reversedPaymentId') && !frozenReceipt.get('isPaid')) {
-                  item.set('amount', -item.get('amount'));
-                  if (item.get('amountRounded')) {
-                    item.set('amountRounded', -item.get('amountRounded'));
+              serverMessageForQuotation = function (frozenReceipt) {
+                var isLayaway = (frozenReceipt.get('orderType') === 2 || frozenReceipt.get('isLayaway'));
+                var currentDocNo = frozenReceipt.get('documentNo');
+                if (frozenReceipt && frozenReceipt.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]));
                   }
-                  item.set('origAmount', -item.get('origAmount'));
-                  if (item.get('origAmountRounded')) {
-                    item.set('origAmountRounded', -item.get('origAmountRounded'));
-                  }
-                  item.set('paid', -item.get('paid'));
-                } else {
-                  item.set('paid', item.get('amount'));
                 }
-              });
-            }
-
-            var successCallback = function () {
+                OB.trace('Order successfully removed.');
+              };
 
-                var syncSuccessCallback, syncErrorCallback, closeParamCallback, restoreReceiptCallback, serverMessageForQuotation, receiptForPostSyncReceipt;
-                // success transaction...
-                OB.info("[receipt.closed] Transaction success. ReceiptId: " + frozenReceipt.get('id'));
-                OB.info('Ticket closed: ', frozenReceipt.get('json').replace(/logclientErrors/g, "logErrors"), "caller: " + OB.UTIL.getStackTrace('Backbone.Events.trigger', true));
-
-                // create a clone of the receipt to be used when executing the final callback
-                receipt.clearWith(frozenReceipt);
-                OB.UTIL.clone(receipt, diffReceipt);
-                if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
-                  receiptForPostSyncReceipt = new OB.Model.Order();
-                  OB.UTIL.clone(frozenReceipt, receiptForPostSyncReceipt);
+              closeParamCallback = function () {
+                if (eventParams && eventParams.callback) {
+                  eventParams.callback({
+                    frozenReceipt: frozenReceipt,
+                    diffReceipt: diffReceipt,
+                    isCancelled: false
+                  });
                 }
+              };
 
-                serverMessageForQuotation = function (frozenReceipt) {
-                  var isLayaway = (frozenReceipt.get('orderType') === 2 || frozenReceipt.get('isLayaway'));
-                  var currentDocNo = frozenReceipt.get('documentNo');
-                  if (frozenReceipt && frozenReceipt.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.');
-                };
+              syncSuccessCallback = function (callback, eventParams) {
+                if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt') && (!eventParams || (eventParams && !eventParams.ignoreSyncProcess))) {
+                  OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
+                    receipt: receiptForPostSyncReceipt,
+                    syncSuccess: true
+                  }, function () {
+                    callback();
+                  });
+                } else {
+                  callback();
+                }
+              };
+
+              restoreReceiptCallback = function () {
+                restoreReceiptOnError(eventParams, receipt);
+              };
 
-                closeParamCallback = function () {
-                  if (eventParams && eventParams.callback) {
-                    eventParams.callback({
-                      frozenReceipt: frozenReceipt,
-                      diffReceipt: diffReceipt,
-                      isCancelled: false
-                    });
-                  }
-                };
+              syncErrorCallback = function () {
+                if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
+                  OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
+                    receipt: receiptForPostSyncReceipt,
+                    syncSuccess: false
+                  }, restoreReceiptCallback);
+                } else {
+                  restoreReceiptCallback();
+                }
+              };
 
-                syncSuccessCallback = function (callback, eventParams) {
-                  if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt') && (!eventParams || (eventParams && !eventParams.ignoreSyncProcess))) {
-                    OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
-                      receipt: receiptForPostSyncReceipt,
-                      syncSuccess: true
-                    }, function () {
-                      callback();
-                    });
-                  } else {
-                    callback();
-                  }
-                };
-
-                restoreReceiptCallback = function () {
-                  restoreReceiptOnError(eventParams, receipt);
-                };
-
-                syncErrorCallback = function () {
-                  if (OB.UTIL.HookManager.get('OBPOS_PostSyncReceipt')) {
-                    OB.UTIL.HookManager.executeHooks('OBPOS_PostSyncReceipt', {
-                      receipt: receiptForPostSyncReceipt,
-                      syncSuccess: false
-                    }, restoreReceiptCallback);
-                  } else {
-                    restoreReceiptCallback();
-                  }
-                };
-
-                if (!OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
-                  // the trigger is fired on the receipt object, as there is only 1 that is being updated
-                  receipt.trigger('integrityOk', frozenReceipt); // Is important for module print last receipt. This module listen trigger.  
-                  closeParamCallback();
-                }
+              if (!OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                // the trigger is fired on the receipt object, as there is only 1 that is being updated
+                //TODO: Check this event
+                receipt.trigger('integrityOk', frozenReceipt); // Is important for module print last receipt. This module listen trigger.  
+                closeParamCallback();
+              }
 
-                OB.trace('Execution Sync process.');
-                OB.MobileApp.model.runSyncProcess(function () {
-                  // in synchronized mode do the doc sequence update in the success
-                  if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
-                    OB.Dal.transaction(function (tx) {
-                      OB.UTIL.calculateCurrentCash(null, tx);
-                      OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(frozenReceipt.get('documentnoSuffix'), frozenReceipt.get('quotationnoSuffix'), frozenReceipt.get('returnnoSuffix'), function () {
-                        // the trigger is fired on the receipt object, as there is only 1 that is being updated
-                        receipt.trigger('integrityOk', frozenReceipt); // Is important for module print last receipt. This module listen trigger.
-                        syncSuccessCallback(function () {
-                          serverMessageForQuotation(frozenReceipt);
-                          closeParamCallback();
-                        }, eventParams);
-                      }, tx);
-                    });
-                  } else {
-                    syncSuccessCallback(function () {
-                      serverMessageForQuotation(frozenReceipt);
-                    }, eventParams);
-                  }
-                  OB.debug("Ticket closed: runSyncProcess executed");
-                }, function () {
-                  syncErrorCallback();
-                });
-                };
+              OB.trace('Execution Sync process.');
+              OB.MobileApp.model.runSyncProcess(function () {
+                // in synchronized mode do the doc sequence update in the success
+                if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                  OB.Dal.transaction(function (tx) {
+                    OB.UTIL.calculateCurrentCash(null, tx);
+                    OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(frozenReceipt.get('documentnoSuffix'), frozenReceipt.get('quotationnoSuffix'), frozenReceipt.get('returnnoSuffix'), function () {
+                      // the trigger is fired on the receipt object, as there is only 1 that is being updated
+                      //TODO: Check this event
+                      receipt.trigger('integrityOk', frozenReceipt); // Is important for module print last receipt. This module listen trigger.
+                      syncSuccessCallback(function () {
+                        serverMessageForQuotation(frozenReceipt);
+                        closeParamCallback();
+                      }, eventParams);
+                    }, tx);
+                  });
+                } else {
+                  syncSuccessCallback(function () {
+                    serverMessageForQuotation(frozenReceipt);
+                  }, eventParams);
+                }
+                OB.debug("Ticket closed: runSyncProcess executed");
+              }, function () {
+                syncErrorCallback();
+              });
+            };
+
+            updateCashup = function (idx, tx) {
+              if (idx === args.closedOrderList.length) {
+                OB.UTIL.setScanningFocus(true);
+                syncReceipt(tx);
+                return;
+              }
 
-            var executePreSyncReceipt = function (tx) {
-                OB.UTIL.HookManager.executeHooks('OBPOS_PreSyncReceipt', {
-                  receipt: frozenReceipt,
-                  model: model,
-                  tx: tx
-                }, function (args) {
-                  frozenReceipt.set('json', JSON.stringify(frozenReceipt.serializeToJSON()));
-                  frozenReceipt.set('hasbeenpaid', 'Y');
-                  // Important: at this point, the frozenReceipt is considered final. Nothing must alter it
-                  // when all the properties of the frozenReceipt have been set, keep a copy
-                  OB.UTIL.clone(receipt, diffReceipt);
+              var frozenReceipt = frozenOrderList[idx];
+              OB.UTIL.cashUpReport(frozenReceipt, function (cashUp) {
+                var executePreSyncReceipt = function (tx) {
+                    OB.UTIL.HookManager.executeHooks('OBPOS_PreSyncReceipt', {
+                      receipt: frozenReceipt,
+                      model: model,
+                      tx: tx
+                    }, function (args) {
+                      frozenReceipt.set('json', JSON.stringify(frozenReceipt.serializeToJSON()));
+                      frozenReceipt.set('hasbeenpaid', 'Y');
+                      if (idx === OB.DEC.Zero) {
+                        // Important: at this point, the frozenReceipt is considered final. Nothing must alter it
+                        // when all the properties of the frozenReceipt have been set, keep a copy
+                        OB.UTIL.clone(receipt, diffReceipt);
+                      } else {
+                        frozenReceipt.unset('preventOrderSave');
+                      }
+                      OB.Dal.saveInTransaction(tx, frozenReceipt, function () {
+                        updateCashup(idx + 1, tx);
+                      });
+                    });
+                    };
+
+                frozenReceipt.set('cashUpReportInformation', JSON.parse(cashUp.models[0].get('objToSend')));
+                frozenReceipt.set('json', JSON.stringify(frozenReceipt.serializeToJSON()));
+                if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
                   OB.Dal.saveInTransaction(tx, frozenReceipt, function () {
-                    successCallback();
+                    executePreSyncReceipt(tx);
                   });
-                });
-                };
-
-            //Create the invoice
-            frozenReceipt.generateInvoice(function (invoice) {
-              if (invoice) {
-                frozenReceipt.set('calculatedInvoice', invoice);
-              }
-              OB.info("[receipt.closed] Starting transaction. ReceiptId: " + frozenReceipt.get('id'));
-              OB.Dal.transaction(function (tx) {
-                OB.trace('Calculationg cashup information.');
-                OB.UTIL.cashUpReport(frozenReceipt, function (cashUp) {
-                  frozenReceipt.set('cashUpReportInformation', JSON.parse(cashUp.models[0].get('objToSend')));
-                  frozenReceipt.set('json', JSON.stringify(frozenReceipt.serializeToJSON()));
-                  OB.UTIL.setScanningFocus(true);
-                  if (OB.MobileApp.model.hasPermission('OBMOBC_SynchronizedMode', true)) {
+                } else {
+                  OB.UTIL.calculateCurrentCash(null, tx);
+                  OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(frozenReceipt.get('documentnoSuffix'), frozenReceipt.get('quotationnoSuffix'), frozenReceipt.get('returnnoSuffix'), function () {
+                    OB.trace('Saving receipt.');
                     OB.Dal.saveInTransaction(tx, frozenReceipt, function () {
                       executePreSyncReceipt(tx);
                     });
-                  } else {
-                    OB.UTIL.calculateCurrentCash(null, tx);
-                    OB.MobileApp.model.updateDocumentSequenceWhenOrderSaved(frozenReceipt.get('documentnoSuffix'), frozenReceipt.get('quotationnoSuffix'), frozenReceipt.get('returnnoSuffix'), function () {
-                      OB.trace('Saving receipt.');
-                      OB.Dal.saveInTransaction(tx, frozenReceipt, function () {
-                        executePreSyncReceipt(tx);
-                      });
-                    }, tx);
+                  }, tx);
+                }
+              }, tx);
+            };
+
+            completeOrder = function (idx) {
+              var frozenReceipt = new OB.Model.Order(),
+                  currentReceipt = args.closedOrderList[idx];
+              if (idx === args.closedOrderList.length) {
+                frozenReceipt = frozenOrderList[0];
+                OB.info("[receipt.closed] Starting transaction. ReceiptId: " + receipt.get('id'));
+                OB.Dal.transaction(function (tx) {
+                  OB.trace('Calculationg cashup information.');
+                  updateCashup(OB.DEC.Zero, tx);
+                }, function () {
+                  // the transaction failed
+                  OB.UTIL.showError("[receipt.closed] The transaction failed to be commited. ReceiptId: " + receipt.get('id'));
+                  // rollback other changes
+                  receipt.set('hasbeenpaid', 'N');
+                  frozenReceipt.set('hasbeenpaid', 'N');
+                }, null);
+                return;
+              }
+
+              OB.UTIL.clone(currentReceipt, frozenReceipt);
+
+              frozenOrderList.push(frozenReceipt);
+
+              OB.UTIL.TicketCloseUtils.processChangePayments(frozenReceipt, function () {
+                receipt.trigger('checkOpenDrawer');
+
+                if (OB.UTIL.RfidController.isRfidConfigured()) {
+                  OB.UTIL.RfidController.processRemainingCodes(frozenReceipt);
+                  OB.UTIL.RfidController.updateEpcBuffers();
+                }
+
+                OB.trace('Execution of pre order save hook OK.');
+                delete frozenReceipt.attributes.json;
+                frozenReceipt.set('creationDate', normalizedCreationDate);
+                frozenReceipt.set('timezoneOffset', creationDate.getTimezoneOffset());
+                frozenReceipt.set('created', creationDate.getTime());
+                frozenReceipt.set('obposCreatedabsolute', OB.I18N.formatDateISO(creationDate));
+                frozenReceipt.set('orderDate', orderDate);
+                frozenReceipt.set('movementDate', OB.I18N.normalizeDate(new Date()));
+                frozenReceipt.set('accountingDate', OB.I18N.normalizeDate(new Date()));
+                frozenReceipt.set('undo', null);
+                frozenReceipt.set('multipleUndo', null);
+
+                // Set the quantities to deliver
+                frozenReceipt.setQuantitiesToDeliver();
+
+                frozenReceipt.set('paymentMethodKind', null);
+                if (frozenReceipt.get('payments').length === 1 && frozenReceipt.get('completeTicket') && frozenReceipt.isFullyPaid()) {
+                  var payment = frozenReceipt.get('payments').models[0];
+                  frozenReceipt.set('paymentMethodKind', payment.get('kind'));
+                }
+
+                // multiterminal support
+                // be sure that the active terminal is the one set as the order proprietary
+                frozenReceipt.set('posTerminal', OB.MobileApp.model.get('terminal').id);
+                frozenReceipt.set('posTerminal' + OB.Constants.FIELDSEPARATOR + OB.Constants.IDENTIFIER, OB.MobileApp.model.get('terminal')._identifier);
+
+                frozenReceipt.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;
                   }
-                }, tx);
-              }, function () {
-                // the transaction failed
-                OB.UTIL.showError("[receipt.closed] The transaction failed to be commited. ReceiptId: " + receipt.get('id'));
-                // rollback other changes
-                receipt.set('hasbeenpaid', 'N');
-                frozenReceipt.set('hasbeenpaid', 'N');
-              }, null);
-            });
+                });
+
+                frozenReceipt.set('obposAppCashup', OB.MobileApp.model.get('terminal').cashUpId);
+                // convert returns
+                if (currentReceipt.isNegative()) {
+                  _.forEach(frozenReceipt.get('payments').models, function (item) {
+                    if (!item.get('isPrePayment') && !item.get('reversedPaymentId') && !frozenReceipt.get('isPaid')) {
+                      item.set('amount', -item.get('amount'));
+                      if (item.get('amountRounded')) {
+                        item.set('amountRounded', -item.get('amountRounded'));
+                      }
+                      item.set('origAmount', -item.get('origAmount'));
+                      if (item.get('origAmountRounded')) {
+                        item.set('origAmountRounded', -item.get('origAmountRounded'));
+                      }
+                      item.set('paid', -item.get('paid'));
+                    } else {
+                      item.set('paid', item.get('amount'));
+                    }
+                  });
+                }
+
+                //Create the invoice
+                frozenReceipt.generateInvoice(function (invoice) {
+                  if (invoice) {
+                    frozenReceipt.set('calculatedInvoice', invoice);
+                  }
+                  completeOrder(idx + 1);
+                });
+              });
+            };
+            completeOrder(0);
+            //To Here
           });
+          //
         });
         };
