diff --git a/src-db/database/sourcedata/AD_MESSAGE.xml b/src-db/database/sourcedata/AD_MESSAGE.xml
--- a/src-db/database/sourcedata/AD_MESSAGE.xml
+++ b/src-db/database/sourcedata/AD_MESSAGE.xml
@@ -2126,6 +2126,18 @@
 <!--355362DDE35646C4A75A902981A96B03-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
 <!--355362DDE35646C4A75A902981A96B03--></AD_MESSAGE>
 
+<!--35DB2B32740C4DA48FAB34D3F0F35D68--><AD_MESSAGE>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <AD_MESSAGE_ID><![CDATA[35DB2B32740C4DA48FAB34D3F0F35D68]]></AD_MESSAGE_ID>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <VALUE><![CDATA[OBPOS_LblOpenbravoSessionLog]]></VALUE>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <MSGTEXT><![CDATA[Back Office - Session Log]]></MSGTEXT>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <MSGTYPE><![CDATA[I]]></MSGTYPE>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <AD_MODULE_ID><![CDATA[FF808181326CC34901326D53DBCF0018]]></AD_MODULE_ID>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68-->  <ISINCLUDEINI18N><![CDATA[N]]></ISINCLUDEINI18N>
+<!--35DB2B32740C4DA48FAB34D3F0F35D68--></AD_MESSAGE>
+
 <!--35E1D8D0895641FD9F527BEAC7D0513B--><AD_MESSAGE>
 <!--35E1D8D0895641FD9F527BEAC7D0513B-->  <AD_MESSAGE_ID><![CDATA[35E1D8D0895641FD9F527BEAC7D0513B]]></AD_MESSAGE_ID>
 <!--35E1D8D0895641FD9F527BEAC7D0513B-->  <AD_CLIENT_ID><![CDATA[0]]></AD_CLIENT_ID>
diff --git a/src-db/database/sourcedata/AD_TREENODE.xml b/src-db/database/sourcedata/AD_TREENODE.xml
--- a/src-db/database/sourcedata/AD_TREENODE.xml
+++ b/src-db/database/sourcedata/AD_TREENODE.xml
@@ -63,7 +63,7 @@
 <!--5B959C75E4DD42D995503AAF244ABC72-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
 <!--5B959C75E4DD42D995503AAF244ABC72-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
 <!--5B959C75E4DD42D995503AAF244ABC72-->  <PARENT_ID><![CDATA[896AC285FD8F4C25A869689D4A98DD8E]]></PARENT_ID>
-<!--5B959C75E4DD42D995503AAF244ABC72-->  <SEQNO><![CDATA[70]]></SEQNO>
+<!--5B959C75E4DD42D995503AAF244ABC72-->  <SEQNO><![CDATA[80]]></SEQNO>
 <!--5B959C75E4DD42D995503AAF244ABC72--></AD_TREENODE>
 
 <!--9A34D67A680744E4B00E07A5585020F1--><AD_TREENODE>
@@ -74,7 +74,7 @@
 <!--9A34D67A680744E4B00E07A5585020F1-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
 <!--9A34D67A680744E4B00E07A5585020F1-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
 <!--9A34D67A680744E4B00E07A5585020F1-->  <PARENT_ID><![CDATA[896AC285FD8F4C25A869689D4A98DD8E]]></PARENT_ID>
-<!--9A34D67A680744E4B00E07A5585020F1-->  <SEQNO><![CDATA[70]]></SEQNO>
+<!--9A34D67A680744E4B00E07A5585020F1-->  <SEQNO><![CDATA[80]]></SEQNO>
 <!--9A34D67A680744E4B00E07A5585020F1--></AD_TREENODE>
 
 <!--D9163EBFF1184AFE9A275A1A78AA80B3--><AD_TREENODE>
@@ -96,7 +96,7 @@
 <!--DE04AE9BAC99463C83FD35867CFAB114-->  <AD_ORG_ID><![CDATA[0]]></AD_ORG_ID>
 <!--DE04AE9BAC99463C83FD35867CFAB114-->  <ISACTIVE><![CDATA[Y]]></ISACTIVE>
 <!--DE04AE9BAC99463C83FD35867CFAB114-->  <PARENT_ID><![CDATA[896AC285FD8F4C25A869689D4A98DD8E]]></PARENT_ID>
-<!--DE04AE9BAC99463C83FD35867CFAB114-->  <SEQNO><![CDATA[70]]></SEQNO>
+<!--DE04AE9BAC99463C83FD35867CFAB114-->  <SEQNO><![CDATA[80]]></SEQNO>
 <!--DE04AE9BAC99463C83FD35867CFAB114--></AD_TREENODE>
 
 <!--E832C351041C4AC4B7B1B871AC085A84--><AD_TREENODE>
diff --git a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
--- a/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
+++ b/src/org/openbravo/retail/posterminal/OBPOSComponentProvider.java
@@ -273,7 +273,7 @@
         "model/discounts",
 
         // Hook
-        "components/menuhook",
+        "components/menuhook", "hooks/hookPrePaymentSelected",
 
         // Websockets
         "utils/rfidWebsocket",
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
@@ -94,6 +94,7 @@
           } else {
             selectedPayment.set('listdepositsdrops', [addedCashMgmt]);
           }
+          OB.logUserAction((p.type === 'deposit' ? 'Deposit ' : 'Drop ') + p.identifier + ': ' + OB.I18N.formatCurrency(p.amount) + ' ' + p.isocode + ', ' + (p.type === 'deposit' ? 'Origin: ' : 'Destination: ') + model.get('name'));
           resolve();
         }, reject, this);
       });
diff --git a/web/org.openbravo.retail.posterminal/js/cashmgmt/view/cashmgmt.js b/web/org.openbravo.retail.posterminal/js/cashmgmt/view/cashmgmt.js
--- a/web/org.openbravo.retail.posterminal/js/cashmgmt/view/cashmgmt.js
+++ b/web/org.openbravo.retail.posterminal/js/cashmgmt/view/cashmgmt.js
@@ -21,6 +21,7 @@
     stepCount: 0,
     span: 6,
     tap: function () {
+      OB.logUserAction('Cancel Cash Management');
       OB.POS.hwserver.checkDrawer(function () {
         OB.POS.navigate('retail.pointofsale');
       });
@@ -43,6 +44,7 @@
       this.model = model;
     },
     tap: function () {
+      OB.logUserAction('Done Cash Management');
       OB.POS.hwserver.checkDrawer(function () {
         this.model.depsdropstosave.trigger('makeDeposits');
       }, this);
@@ -249,6 +251,7 @@
     if (_.filter(OB.MobileApp.model.paymentnames, function (payment) {
       return payment.paymentMethod.iscash === true;
     }).length > 0) {
+      OB.logUserAction('Menu > Cash Management');
       successCallback(args.route);
     } else {
       OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBPOS_CashMgmtError'), OB.I18N.getLabel('OBPOS_NoCashPaymentMethod'), [{
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
@@ -506,6 +506,15 @@
       }
     }
   },
+  getCashupStep: function (cashupStep) {
+    var i;
+    for (i = 0; i < this.cashupsteps.length; i++) {
+      if (i === cashupStep) {
+        return this.cashupsteps[i];
+      }
+    }
+    return null;
+  },
   getStepToolbar: function () {
     var currentstep = this.get('step') - 1;
     return this.cashupsteps[currentstep].getToolbarName();
@@ -724,6 +733,7 @@
 
           OB.Dal.save(cashUp.at(0), function () {
             var callbackFinishedSuccess = function () {
+                OB.logUserAction('CashUp Finished Success');
                 OB.UTIL.showLoading(true);
                 me.set('finished', true);
                 if (OB.MobileApp.model.hasPermission('OBPOS_print.cashup')) {
@@ -731,6 +741,7 @@
                 }
                 };
             var callbackFinishedWrongly = function () {
+                OB.logUserAction('CashUp Finished Wrongly');
                 // reset to N
                 cashUp.at(0).set('isprocessed', 'N');
                 OB.Dal.save(cashUp.at(0));
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-steps.js b/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-steps.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-steps.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/model/cashup-steps.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2013-2016 Openbravo S.L.U.
+ * Copyright (C) 2013-2018 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.
@@ -61,6 +61,15 @@
   getStepComponent: function (leftpanel$) {
     return leftpanel$.cashPayments;
   },
+  logUserAction: function (substep) {
+    var payment = _.find(this.model.get('paymentList').models, function (pay) {
+      return pay.get('_id') === 'OBPOS_payment.cash';
+    });
+    if (payment) {
+      var foreignCounted = payment.get('foreignCounted');
+      OB.logUserAction('Count Cash: ' + payment.get('name') + ' [Counted: ' + (foreignCounted ? OB.I18N.formatCurrency(foreignCounted) : "-") + ', Expected: ' + OB.I18N.formatCurrency(payment.get('foreignExpected')) + '] ' + payment.get('isocode'));
+    }
+  },
   getToolbarName: function () {
     return 'toolbarcashpayments';
   },
@@ -112,6 +121,10 @@
   getStepComponent: function (leftpanel$) {
     return leftpanel$.cashToKeep;
   },
+  logUserAction: function (substep) {
+    var payment = this.model.get('paymentList').at(substep);
+    OB.logUserAction(payment.get('name') + ' to keep: ' + OB.I18N.formatCurrency(payment.get('qtyToKeep')) + ' ' + payment.get('isocode'));
+  },
   getToolbarName: function () {
     if (this.model.get('paymentList').at(this.model.get('substep')).get('paymentMethod').allowvariableamount) {
       return 'toolbarother';
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
@@ -44,6 +44,7 @@
   },
   tap: function () {
     OB.POS.hwserver.checkDrawer(function () {
+      OB.logUserAction('Cancel Cash Up');
       this.doCancelCashup();
     }, this);
   }
@@ -539,6 +540,17 @@
       this.moveStep(1);
     } else if (this.model.isSubstepAvailable(nextstep, nextsubstep)) {
       // go to step
+      if (direction > 0) {
+        var cashupStep = nextstep - 1,
+            cashupSubstep = this.model.get('substep');
+        if (cashupSubstep === -1) {
+          cashupStep--;
+        }
+        var tempStep = this.model.getCashupStep(cashupStep);
+        if (tempStep && tempStep.logUserAction) {
+          tempStep.logUserAction(cashupSubstep === -1 ? tempStep.getSubstepsLength(this.model) - 1 : cashupSubstep);
+        }
+      }
       this.model.set('step', nextstep);
       this.model.set('substep', nextsubstep);
       this.refresh();
@@ -597,6 +609,7 @@
   rfidState: false,
   navigateTo: function (args, successCallback, errorCallback) {
     var me = this;
+    OB.logUserAction('Menu > Cash Up');
     // Cannot navigate to the cashup window in case of being a seller terminal
     if (!OB.MobileApp.model.get('hasPaymentsForCashup')) {
       OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBPOS_NavigationNotAllowedHeader'), OB.I18N.getLabel('OBPOS_CannotNavigateToCashUp'), [{
@@ -635,6 +648,7 @@
   finishCloseDialogLabel: 'OBPOS_FinishPartialDialog',
   cashupSentHook: 'OBPOS_AfterCashUpPartialSent',
   finalAction: function () {
+    OB.logUserAction('Menu > Cash Up Partial');
     OB.POS.navigate('retail.pointofsale');
   }
 });
@@ -649,6 +663,7 @@
   approvalType: 'OBPOS_approval.cashuppartial',
   rfidState: false,
   navigateTo: function (args, successCallback, errorCallback) {
+    OB.logUserAction('Menu > Cash Partial');
     if (!OB.MobileApp.model.get('hasPaymentsForCashup')) {
       // Cannot navigate to the cashup partial window in case of being a seller terminal
       OB.UTIL.showConfirmation.display(OB.I18N.getLabel('OBPOS_NavigationNotAllowedHeader'), OB.I18N.getLabel('OBPOS_CannotNavigateToPartialCashUp'), [{
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/view/closekeyboard.js b/web/org.openbravo.retail.posterminal/js/closecash/view/closekeyboard.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/view/closekeyboard.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/view/closekeyboard.js
@@ -151,6 +151,7 @@
                 }
                 payment.set('foreignCounted', OB.DEC.add(0, convAmt));
                 payment.set('counted', OB.DEC.mul(convAmt, payment.get('rate')));
+                OB.logUserAction('Edit Count Cash: ' + payment.get('name') + ' [Counted: ' + OB.I18N.formatCurrency(convAmt) + ', Expected: ' + OB.I18N.formatCurrency(payment.get('foreignExpected')) + '] ' + payment.get('isocode'));
               }
             },
             label: payment.get('name')
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/view/tabcashmaster.js b/web/org.openbravo.retail.posterminal/js/closecash/view/tabcashmaster.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/view/tabcashmaster.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/view/tabcashmaster.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2015 Openbravo S.L.U.
+ * Copyright (C) 2015-2018 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.
@@ -112,6 +112,7 @@
       }, function (data) {
         if (data && data.exception) {
           // Error handler 
+          OB.logUserAction('Cash Up Master: Process error -> ' + data.exception.message);
           OB.log('error', data.exception.message);
           OB.UTIL.showConfirmation.display(
           OB.I18N.getLabel('OBPOS_CashMgmtError'), OB.I18N.getLabel('OBPOS_ErrorServerGeneric') + data.exception.message, [{
@@ -140,7 +141,16 @@
         col.add(data.terminals);
         me.$.slaveList.setCollection(col);
         if (data.finishAll) {
+          OB.logUserAction('Cash Up Master: Slaves closed');
           me.updateCashUpModel(model, data.payments);
+        } else {
+          var slaveTerm = [];
+          _.each(data.terminals, function (term) {
+            if (term.finish === false && term.noOfTransactions > 0) {
+              slaveTerm.push(term.name);
+            }
+          });
+          OB.logUserAction('Cash Up Master: Slaves not closed [' + slaveTerm.join(', ') + ']');
         }
         model.set('slavesCashupCompleted', data.finishAll);
       });
diff --git a/web/org.openbravo.retail.posterminal/js/closecash/view/tabcountcash.js b/web/org.openbravo.retail.posterminal/js/closecash/view/tabcountcash.js
--- a/web/org.openbravo.retail.posterminal/js/closecash/view/tabcountcash.js
+++ b/web/org.openbravo.retail.posterminal/js/closecash/view/tabcountcash.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -96,6 +96,7 @@
   lineOK: function (inSender, inEvent) {
     this.model.set('counted', this.model.get('expected'));
     this.model.set('foreignCounted', this.model.get('foreignExpected'));
+    OB.logUserAction('Count Cash: ' + this.model.get('name') + ' [Counted: ' + OB.I18N.formatCurrency(this.model.get('foreignCounted')) + ', Expected: ' + OB.I18N.formatCurrency(this.model.get('foreignExpected')) + '] ' + this.model.get('isocode'));
   }
 });
 
diff --git a/web/org.openbravo.retail.posterminal/js/components/bplocation.js b/web/org.openbravo.retail.posterminal/js/components/bplocation.js
--- a/web/org.openbravo.retail.posterminal/js/components/bplocation.js
+++ b/web/org.openbravo.retail.posterminal/js/components/bplocation.js
@@ -839,6 +839,11 @@
             }
           });
         } else {
+          var logLocation = dataBps.get('locName');
+          if (logLocation !== dataBps.get('shipLocName')) {
+            logLocation = 'Invoice (' + logLocation + '), Shipping (' + dataBps.get('shipLocName') + ')';
+          }
+          OB.logUserAction('Change Customer Location to: ' + logLocation);
           me.doChangeBusinessPartner({
             businessPartner: dataBps,
             target: me.owner.owner.args.target
diff --git a/web/org.openbravo.retail.posterminal/js/components/bplocationship.js b/web/org.openbravo.retail.posterminal/js/components/bplocationship.js
--- a/web/org.openbravo.retail.posterminal/js/components/bplocationship.js
+++ b/web/org.openbravo.retail.posterminal/js/components/bplocationship.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -148,6 +148,7 @@
             }
           });
         } else {
+          OB.logUserAction('Change Customer Shipping Location to: ' + dataBps.get('shipLocName'));
           me.doChangeBusinessPartner({
             businessPartner: dataBps,
             target: me.owner.owner.args.target
diff --git a/web/org.openbravo.retail.posterminal/js/components/businesspartner_selector.js b/web/org.openbravo.retail.posterminal/js/components/businesspartner_selector.js
--- a/web/org.openbravo.retail.posterminal/js/components/businesspartner_selector.js
+++ b/web/org.openbravo.retail.posterminal/js/components/businesspartner_selector.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2016-2017 Openbravo S.L.U.
+ * Copyright (C) 2016-2018 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.
@@ -747,6 +747,7 @@
           }
         });
       } else {
+        OB.logUserAction('Change Customer for "' + me.target + '" to: ' + bp.get('name'));
         me.doChangeBusinessPartner({
           businessPartner: bp,
           target: me.target
diff --git a/web/org.openbravo.retail.posterminal/js/components/menu.js b/web/org.openbravo.retail.posterminal/js/components/menu.js
--- a/web/org.openbravo.retail.posterminal/js/components/menu.js
+++ b/web/org.openbravo.retail.posterminal/js/components/menu.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -24,6 +24,7 @@
     }
     this.inherited(arguments); // Manual dropdown menu closure
     this.model.get('order').setDocumentNo(true, false);
+    OB.logUserAction('Menu > Return This Receipt: ' + this.model.get('order').get('documentNo'));
     this.doShowDivText({
       permission: this.permission,
       orderType: 1
@@ -92,6 +93,7 @@
     }
     this.inherited(arguments); // Manual dropdown menu closure
     this.model.get('order').checkNotProcessedPayments(function () {
+      OB.logUserAction('Menu > Void this Layaway: ' + me.model.get('order').get('documentNo'));
       me.model.get('order').set('voidLayaway', true);
       me.doShowDivText({
         permission: me.permission,
@@ -175,6 +177,7 @@
     }, this);
 
     if (errorsConvertingLayawayToReceipt.length === 0) {
+      OB.logUserAction('Menu > Receipt this Layaway: ' + this.model.get('order').get('documentNo'));
       this.doShowDivText({
         permission: this.permission,
         orderType: 0
@@ -247,6 +250,7 @@
       return;
     }
 
+    OB.logUserAction('Menu > Cancel this Layaway: ' + this.model.get('order').get('documentNo'));
     this.model.get('order').cancelLayaway(this);
   },
   displayLogic: function () {
@@ -359,6 +363,7 @@
       if (args && args.cancelOperation && args.cancelOperation === true) {
         return;
       }
+      OB.logUserAction('Menu > Layaway this receipt: ' + args.context.model.get('order').get('documentNo'));
       me.doShowDivText({
         permission: me.permission,
         orderType: 2
@@ -438,6 +443,7 @@
       return true;
     }
     this.inherited(arguments); // Manual dropdown menu closure
+    OB.logUserAction('Menu > Receipt Properties: ' + this.model.get('order').get('documentNo'));
     this.doShowReceiptProperties();
   },
   init: function (model) {
@@ -482,6 +488,7 @@
       return true;
     }
     this.inherited(arguments); // Manual dropdown menu closure
+    OB.logUserAction('Menu > Invoice This Receipt: ' + this.model.get('order').get('documentNo'));
     this.taxIdValidation(this.model.get('order'));
   },
   taxIdValidation: function (model) {
@@ -594,6 +601,7 @@
       return true;
     }
     this.inherited(arguments); // Manual dropdown menu closure
+    OB.logUserAction('Menu > Customer');
     this.doShowPopup({
       popup: 'modalcustomer',
       args: {
@@ -628,8 +636,12 @@
     }
     this.inherited(arguments); // Manual dropdown menu closure
     if (OB.MobileApp.model.hasPermission(this.permission)) {
+      OB.logUserAction('Menu > Print this Receipt: ' + this.model.get('order').get('documentNo'));
       this.doPrintReceipt();
     }
+  },
+  init: function (model) {
+    this.model = model;
   }
 });
 
@@ -938,6 +950,7 @@
       return;
     }
     if (OB.MobileApp.model.hasPermission(this.permission)) {
+      OB.logUserAction('Menu > Pay Open Tickets');
       this.doMultiOrders();
     }
   },
@@ -984,6 +997,39 @@
 });
 
 enyo.kind({
+  name: 'OB.UI.MenuBackOfficeSessionLog',
+  kind: 'OB.UI.MenuAction',
+  permission: 'OBPOS_retail.backoffice',
+  url: '../..',
+  events: {
+    onBackOffice: ''
+  },
+  i18nLabel: 'OBPOS_LblOpenbravoSessionLog',
+  tap: function () {
+    var useURL = this.url;
+    if (this.disabled) {
+      return true;
+    }
+
+    // use the central server url
+    _.each(OB.RR.RequestRouter.servers.models, function (server) {
+      if (server.get('mainServer') && server.get('address')) {
+        useURL = server.get('address');
+      }
+    });
+
+    this.inherited(arguments); // Manual dropdown menu closure
+    if (OB.MobileApp.model.hasPermission(this.permission)) {
+      var params = encodeURI('?tabId=6805A073CC3B469AAD3F81DE192A6D27&criteria={"operator":"and","_constructor":"AdvancedCriteria","criteria":[{"fieldName":"cacheSessionId","operator":"iContains","value":"' + OB.UTIL.localStorage.getItem('cacheSessionId') + '","_constructor":"AdvancedCriteria"}]}&emptyFilterClause=true');
+      this.doBackOffice({
+        url: useURL + params
+      });
+    }
+  }
+});
+
+
+enyo.kind({
   name: 'OB.UI.MenuDisableEnableRFIDReader',
   kind: 'OB.UI.MenuAction',
   permission: 'OBPOS_retail.disableEnableRFIDReader',
@@ -1151,6 +1197,7 @@
       return true;
     }
     this.inherited(arguments); // Manual dropdown menu closure
+    OB.logUserAction('Menu > Cancel and Replace: ' + this.model.get('order').get('documentNo'));
     this.model.get('order').verifyCancelAndReplace(this);
   },
   updateVisibility: function () {
diff --git a/web/org.openbravo.retail.posterminal/js/components/modalmorepaymentmethods.js b/web/org.openbravo.retail.posterminal/js/components/modalmorepaymentmethods.js
--- a/web/org.openbravo.retail.posterminal/js/components/modalmorepaymentmethods.js
+++ b/web/org.openbravo.retail.posterminal/js/components/modalmorepaymentmethods.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2017 Openbravo S.L.U.
+ * Copyright (C) 2017-2018 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.
@@ -40,6 +40,7 @@
     enyo.forEach(this.sideButtons, function (sidebutton) {
       if (sidebutton.active) {
         sidebutton.btn.definition.includedInPopUp = true;
+        sidebutton.btn.definition.dialog = this;
         this.$.body.$.buttonslist.createComponent(sidebutton);
       }
     }, this);
diff --git a/web/org.openbravo.retail.posterminal/js/components/modalmultiorders.js b/web/org.openbravo.retail.posterminal/js/components/modalmultiorders.js
--- a/web/org.openbravo.retail.posterminal/js/components/modalmultiorders.js
+++ b/web/org.openbravo.retail.posterminal/js/components/modalmultiorders.js
@@ -397,6 +397,12 @@
       return true;
     }
 
+    var ordersNum = [];
+    _.each(checkedMultiOrders, function (iter) {
+      ordersNum.push(iter.get('documentNo'));
+    });
+    OB.logUserAction('Pay Open Tickets: ' + ordersNum.join(', '));
+
     function newReversalOrder() {
       var i;
       for (i = 0; i < selectedMultiOrders.length; i++) {
diff --git a/web/org.openbravo.retail.posterminal/js/components/modalmultiorderslayaway.js b/web/org.openbravo.retail.posterminal/js/components/modalmultiorderslayaway.js
--- a/web/org.openbravo.retail.posterminal/js/components/modalmultiorderslayaway.js
+++ b/web/org.openbravo.retail.posterminal/js/components/modalmultiorderslayaway.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2013-2017 Openbravo S.L.U.
+ * Copyright (C) 2013-2018 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.
@@ -96,6 +96,7 @@
       this.doHideThisPopup();
       return;
     }
+    OB.logUserAction('Change Layaway Amount to: ' + OB.I18N.formatCurrency(amount) + ' in order: ' + currentOrder.get('documentNo'));
     currentOrder.set('amountToLayaway', amount);
     currentOrder.setOrderType(null, 2);
     currentOrder.trigger('amountToLayaway');
diff --git a/web/org.openbravo.retail.posterminal/js/components/modalreceiptlineproperties.js b/web/org.openbravo.retail.posterminal/js/components/modalreceiptlineproperties.js
--- a/web/org.openbravo.retail.posterminal/js/components/modalreceiptlineproperties.js
+++ b/web/org.openbravo.retail.posterminal/js/components/modalreceiptlineproperties.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -84,10 +84,12 @@
   },
   applyChanges: function (inSender, inEvent) {
     var diff, att, result = true;
+    OB.logUserAction('Change line properties: "' + this.currentLine.get('product').get('_identifier') + '" (Qty: ' + this.currentLine.get('qty') + ')');
     diff = this.propertycomponents;
     for (att in diff) {
       if (diff.hasOwnProperty(att)) {
         if (diff[att].owner.owner.getShowing()) {
+          OB.logUserAction('Change line property: ' + att + ' = ' + (typeof diff[att].getValue === 'function' ? diff[att].getValue() : '<not defined>'));
           result = result && diff[att].applyValue(this.currentLine);
         }
       }
diff --git a/web/org.openbravo.retail.posterminal/js/components/modalsplitlines.js b/web/org.openbravo.retail.posterminal/js/components/modalsplitlines.js
--- a/web/org.openbravo.retail.posterminal/js/components/modalsplitlines.js
+++ b/web/org.openbravo.retail.posterminal/js/components/modalsplitlines.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2016 Openbravo S.L.U.
+ * Copyright (C) 2016-2018 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.
@@ -466,6 +466,7 @@
   splitLines: function () {
     this.indexToAdd = 1;
     this.qtysToAdd = this.$.bodyContent.$.qtyLines.getValues();
+    OB.logUserAction('Split line "' + this.orderline.get('product').get('_identifier') + '" into: [' + this.qtysToAdd.join(', ') + ']');
     this.orderline.set('splitline', true);
     this.receipt.set('skipCalculateReceipt', true);
     this.doAddProduct({
diff --git a/web/org.openbravo.retail.posterminal/js/datasource.js b/web/org.openbravo.retail.posterminal/js/datasource.js
--- a/web/org.openbravo.retail.posterminal/js/datasource.js
+++ b/web/org.openbravo.retail.posterminal/js/datasource.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2016 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -162,6 +162,9 @@
   this.print(template, null, function (args) {
     if (args && args.exception && args.exception.message) {
       OB.info('Error opening the drawer');
+      OB.logUserAction('Error opening the drawer');
+    } else {
+      OB.logUserAction('Open the drawer');
     }
   }, OB.DS.HWServer.DRAWER);
   if (OB.MobileApp.model.get('permissions').OBPOS_closeDrawerBeforeContinue) {
diff --git a/web/org.openbravo.retail.posterminal/js/hooks/hookPrePaymentSelected.js b/web/org.openbravo.retail.posterminal/js/hooks/hookPrePaymentSelected.js
new file mode 100644
--- /dev/null
+++ b/web/org.openbravo.retail.posterminal/js/hooks/hookPrePaymentSelected.js
@@ -0,0 +1,19 @@
+/*
+ ************************************************************************************
+ * Copyright (C) 2018 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.
+ ************************************************************************************
+ */
+
+(function () {
+
+  OB.UTIL.HookManager.registerHook('OBPOS_PrePaymentSelected', function (args, callbacks) {
+    if (args.paymentSelected) {
+      OB.logUserAction('Payment method selected: ' + args.paymentSelected.payment._identifier);
+    }
+    OB.UTIL.HookManager.callbackExecutor(args, callbacks);
+  });
+
+}());
\ No newline at end of file
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
@@ -783,6 +783,10 @@
 
     postLoginActions: function () {
       OB.debug("next process: renderTerminalMain");
+      var context = OB.MobileApp.model.get('context'),
+          msg = 'Login user: ' + (context && context.user ? context.user.username : '-') + //
+          ', Role: ' + (context && context.role ? context.role.name : '-') + (context && context.client ? ' - ' + context.client.name : '');
+      OB.logUserAction(msg);
       //MASTER DATA REFRESH
       var minIncRefresh = this.get('terminal').terminalType.minutestorefreshdatainc,
           minTotalRefresh = this.get('terminal').terminalType.minutestorefreshdatatotal * 60 * 1000,
@@ -940,6 +944,9 @@
         }
       }
 
+      var context = OB.MobileApp.model.get('context');
+      OB.logUserAction('Logout user: ' + (context && context.user ? OB.MobileApp.model.get('context').user.username : '-'));
+
       OB.UTIL.Approval.requestApproval(
       this, 'OBPOS_approval.removereceipts', function (approved, supervisor, approvalType) {
         if (approved) {
diff --git a/web/org.openbravo.retail.posterminal/js/model/order.js b/web/org.openbravo.retail.posterminal/js/model/order.js
--- a/web/org.openbravo.retail.posterminal/js/model/order.js
+++ b/web/org.openbravo.retail.posterminal/js/model/order.js
@@ -1148,6 +1148,7 @@
       if (!OB.DEC.isNumber(qty)) {
         qty = OB.DEC.One;
       }
+      OB.logUserAction('Add units (Qty: ' + qty + ') to product "' + line.get('product').get('_identifier') + '"');
       this.setUnit(line, OB.DEC.add(line.get('qty'), qty, OB.I18N.qtyScale()), OB.I18N.getLabel('OBPOS_AddUnits', [OB.DEC.toNumber(new BigDecimal((String)(qty.toString()))), line.get('product').get('_identifier')]));
     },
 
@@ -1252,6 +1253,8 @@
           return;
         }
 
+        OB.logUserAction('Change price (' + OB.I18N.formatCurrency(price) + ') to product "' + line.get('product').get('_identifier') + '"');
+
         options = args.options || {};
         options.setUndo = (_.isUndefined(options.setUndo) || _.isNull(options.setUndo) || options.setUndo !== false) ? true : options.setUndo;
 
@@ -1492,6 +1495,9 @@
       }
 
       function preDeleteLine() {
+        _.each(selectedModels, function (line) {
+          OB.logUserAction('Delete line: "' + line.get('product').get('_identifier') + '" (Qty: ' + line.get('qty') + ') from ticket "' + me.get('documentNo') + '"');
+        });
         OB.UTIL.HookManager.executeHooks('OBPOS_PreDeleteLine', {
           order: me,
           selectedLines: selectedModels
@@ -1991,6 +1997,7 @@
         }, this);
       }
 
+      OB.logUserAction('Delete line "' + line.get('product').get('_identifier') + '" (Qty: ' + line.get('qty') + ')');
       // trigger
       line.trigger('removed', line);
 
@@ -3267,6 +3274,8 @@
     createLine: function (p, units, options, attrs) {
       var newline, me = this;
 
+      OB.logUserAction('Add ' + (p.get('productType') === 'I' ? 'product' : 'service') + ' "' + p.get('_identifier') + '" (Qty: ' + units + ') to ticket "' + this.get('documentNo') + '"');
+
       function createLineAux(p, units, options, attrs, me) {
         if (me.validateAllowSalesWithReturn(units, ((options && options.allowLayawayWithReturn) || false))) {
           return;
@@ -3347,6 +3356,7 @@
     },
 
     returnLine: function (line, options, skipValidaton) {
+      OB.logUserAction('Return line "' + line.get('product').get('_identifier') + '" (Qty: ' + line.get('qty') + ')');
       var me = this;
       if (line.get('qty') > 0) {
         line.get('product').set('ignorePromotions', true);
@@ -4247,6 +4257,7 @@
           }
         }, args.order);
 
+        var quotationNo = args.order.get('documentNo');
         args.order.set('oldId', args.order.get('id'));
         args.order.set('id', null);
         args.order.set('isQuotation', false);
@@ -4278,6 +4289,8 @@
         args.order.unset('deletedLines');
         args.order.save();
 
+        OB.logUserAction('Create order ' + nextDocumentno.documentNo + ' from quotation ' + quotationNo);
+
         args.order.get('lines').each(function (line) {
           var productAttributes = line.get('product').get('hasAttributes');
           if (OB.UTIL.isNullOrUndefined(productAttributes) === false && productAttributes) {
@@ -4384,13 +4397,15 @@
       }
       this.set('id', null);
       this.save();
+      OB.logUserAction('Reactivate Quotation: ' + this.get('documentNo'));
       this.calculateReceipt();
     },
     rejectQuotation: function (rejectReasonId, scope, callback) {
       if (!this.get('id')) {
         OB.error("The Id of the order is not defined (current value: " + this.get('id') + "'");
       }
-      var process = new OB.DS.Process('org.openbravo.retail.posterminal.QuotationsReject');
+      var process = new OB.DS.Process('org.openbravo.retail.posterminal.QuotationsReject'),
+          quotationNo = this.get('documentNo');
       OB.UTIL.showLoading(true);
       process.exec({
         messageId: OB.UTIL.get_UUID(),
@@ -4402,6 +4417,7 @@
       }, function (data) {
         OB.UTIL.showLoading(false);
         OB.UTIL.showSuccess(OB.I18N.getLabel('OBPOS_SuccessRejectQuotation'));
+        OB.logUserAction('Reject Quotation: ' + quotationNo);
         if (callback) {
           callback.call(scope, data !== null);
         }
@@ -4612,6 +4628,7 @@
               order.save();
               order.trigger('saveCurrent');
             }
+            OB.logUserAction('Added Payment: ' + payment.get('name') + ' = ' + OB.I18N.formatCurrency(payment.get('amount')) + ' ' + payment.get('isocode'));
             OB.UTIL.HookManager.executeHooks('OBPOS_postAddPayment', {
               paymentAdded: payment,
               payments: payments,
@@ -5829,9 +5846,11 @@
             }
             return;
           }
+          OB.logUserAction('Delete Ticket: ' + args.receipt.get('documentNo'));
           removeOrder(args.receipt, callback);
         });
       } else {
+        OB.logUserAction('Close Ticket: ' + this.get('documentNo'));
         removeOrder(this, callback);
       }
 
@@ -6428,6 +6447,14 @@
       this.unshift(this.current);
       this.loadCurrent(true);
 
+      var documentType = 'Receipt';
+      if (model.get('isQuotation')) {
+        documentType = 'Quotation';
+      } else if (model.get('isLayaway')) {
+        documentType = 'Layaway';
+      }
+      OB.logUserAction('Open ' + documentType + ': ' + model.get('documentNo'));
+
       if (!model.get('isQuotation')) {
         // OB.Dal.save is done here because we want to force to save with the original id, only this time.
         OB.Dal.save(model, function () {
@@ -6499,6 +6526,7 @@
       this.current.set('quotationnoPrefix', OB.MobileApp.model.get('terminal').quotationDocNoPrefix);
       this.current.set('quotationnoSuffix', nextQuotationno.quotationnoSuffix);
       this.current.set('documentNo', nextQuotationno.documentNo);
+      OB.logUserAction('Create New Quotation: ' + nextQuotationno.documentNo);
 
       this.unshift(this.current);
       this.loadCurrent();
@@ -6845,6 +6873,7 @@
       OB.UTIL.HookManager.executeHooks('OBPOS_NewReceipt', {
         newOrder: order
       });
+      OB.logUserAction('Create new ticket: ' + nextDocumentno.documentNo);
       return order;
     }
   });
@@ -7029,6 +7058,7 @@
         callback: callback
       }, function (args) {
         var executeFinalCallback = function () {
+            OB.logUserAction('Added Multi-Order Payment: ' + payment.get('name') + ' = ' + OB.I18N.formatCurrency(payment.get('amount')) + ' ' + payment.get('isocode'));
             OB.UTIL.HookManager.executeHooks('OBPOS_postAddPayment', {
               paymentAdded: payment,
               payments: payments,
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
@@ -210,6 +210,7 @@
   addPayment: function (payment, callback) {
     var modelToIncludePayment;
 
+    OB.logUserAction('Clicked to add (partial or total) payment: ' + payment.get('name') + ' = ' + OB.I18N.formatCurrency(payment.get('amount')) + ' ' + payment.get('isocode'));
     if (this.get('leftColumnViewManager').isOrder()) {
       modelToIncludePayment = this.get('order');
     } else {
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboard-toolbars.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboard-toolbars.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboard-toolbars.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboard-toolbars.js
@@ -250,7 +250,8 @@
           holdActive: true,
           permission: sidebutton.permission,
           stateless: sidebutton.stateless,
-          action: sidebutton.action
+          action: sidebutton.action,
+          scope: this
         }
       }
     };
@@ -261,7 +262,7 @@
         OB.UTIL.HookManager.executeHooks('OBPOS_PrePaymentSelected', {
           paymentSelected: payment,
           receipt: btncomponent.btn.definition.scope.receipt,
-          btnDefintion: btncomponent.btn.definition
+          btnDefinition: btncomponent.btn.definition
         }, function (args) {
           if (args && args.cancellation && args.cancellation === true) {
             callback(false);
@@ -385,6 +386,7 @@
                   holdActive: true,
                   permission: payment.payment.searchKey,
                   stateless: false,
+                  scope: me,
                   action: function (keyboard, txt) {
                     me.payWithProviderGroup(keyboard, txt, providerGroups[payment.providerGroup.id]);
                   }
@@ -426,6 +428,7 @@
                     popup: 'modalPaymentsSelect',
                     args: {
                       idCategory: payment.paymentMethod.paymentMethodCategory,
+                      receipt: me.receipt,
                       amount: amount,
                       options: options
                     }
@@ -544,6 +547,7 @@
               }
 
               if (amount > 0 && exactpayment && OB.MobileApp.model.hasPermission(exactpayment.payment.searchKey)) {
+                OB.logUserAction('Exact Payment: ' + exactpayment.payment._identifier + ' = ' + OB.I18N.formatCurrency(amount) + ' ' + exactpayment.isocode);
                 me.pay(amount, exactpayment.payment.searchKey, exactpayment.payment._identifier, exactpayment.paymentMethod, exactpayment.rate, exactpayment.mulrate, exactpayment.isocode);
               }
             }
@@ -711,6 +715,7 @@
   },
   tap: function () {
     if (!this.$.btn.hasClass(this.classButtonDisabled)) {
+      OB.logUserAction('More Payments button clicked');
       this.doShowAllButtons();
     }
   },
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/modals/modalpayments.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/modals/modalpayments.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/modals/modalpayments.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/modals/modalpayments.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2015-2017 Openbravo S.L.U.
+ * Copyright (C) 2015-2018 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.
@@ -84,16 +84,24 @@
                 if (!item.disabled) {
                   var dialog = this.owner.owner.owner;
                   dialog.doHideThisPopup();
-                  dialog.bubble('onStatusChanged', {
-                    payment: this.payment,
-                    status: this.payment.payment.searchKey,
-                    amount: dialog.args.amount,
-                    options: dialog.args.options
-                  });
-                  dialog.bubble('onPaymentChanged', {
-                    payment: this.payment,
-                    status: this.payment.payment.searchKey,
-                    amount: dialog.args.amount
+                  OB.UTIL.HookManager.executeHooks('OBPOS_PrePaymentSelected', {
+                    paymentSelected: this.payment,
+                    receipt: dialog.args.receipt
+                  }, function (args) {
+                    if (args && args.cancellation && args.cancellation === true) {
+                      return;
+                    }
+                    dialog.bubble('onStatusChanged', {
+                      payment: args.paymentSelected,
+                      status: args.paymentSelected.payment.searchKey,
+                      amount: dialog.args.amount,
+                      options: dialog.args.options
+                    });
+                    dialog.bubble('onPaymentChanged', {
+                      payment: args.paymentSelected,
+                      status: args.paymentSelected.payment.searchKey,
+                      amount: dialog.args.amount
+                    });
                   });
                 }
               },
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/payment.js
@@ -46,7 +46,8 @@
       this.doShowPopup({
         popup: 'modalPaymentsSelect',
         args: {
-          idCategory: inEvent.value.status.substring(inEvent.value.status.lastIndexOf('.') + 1)
+          idCategory: inEvent.value.status.substring(inEvent.value.status.lastIndexOf('.') + 1),
+          receipt: this.receipt
         }
       });
     } else {
@@ -1299,11 +1300,14 @@
           if (this.drawerOpened) {
             if (this.owner.receipt.get('orderType') === 3 && !this.owner.receipt.get('cancelLayaway')) {
               //Void Layaway
+              OB.logUserAction('Void Layaway: ' + me.owner.receipt.get('documentNo'));
               this.owner.receipt.trigger('voidLayaway');
             } else if (this.owner.receipt.get('orderType') === 3) {
               //Cancel Layaway
+              OB.logUserAction('Cancel Layaway: ' + me.owner.receipt.get('documentNo'));
               this.owner.receipt.trigger('cancelLayaway');
             } else {
+              OB.logUserAction('Complete ticket payment: ' + me.owner.receipt.get('documentNo'));
               this.setDisabled(true);
               me.owner.model.get('order').trigger('paymentDone', false);
               OB.UTIL.setScanningFocus(false);
@@ -1322,11 +1326,14 @@
         } else {
           if (this.owner.receipt.get('orderType') === 3 && !this.owner.receipt.get('cancelLayaway')) {
             //Void Layaway
+            OB.logUserAction('Void Layaway: ' + me.owner.receipt.get('documentNo'));
             this.owner.receipt.trigger('voidLayaway');
           } else if (this.owner.receipt.get('orderType') === 3) {
             //Cancel Layaway
+            OB.logUserAction('Cancel Layaway: ' + me.owner.receipt.get('documentNo'));
             this.owner.receipt.trigger('cancelLayaway');
           } else {
+            OB.logUserAction('Complete ticket payment: ' + me.owner.receipt.get('documentNo'));
             this.setDisabled(true);
             me.owner.receipt.trigger('paymentDone', this.allowOpenDrawer);
             OB.UTIL.setScanningFocus(false);
@@ -1335,6 +1342,7 @@
       } else {
         if (this.drawerpreference && this.allowOpenDrawer) {
           if (this.drawerOpened) {
+            OB.logUserAction('Complete Multi Orders payment');
             this.owner.model.get('multiOrders').trigger('paymentDone', false);
             OB.UTIL.setScanningFocus(false);
             this.owner.model.get('multiOrders').set('openDrawer', false);
@@ -1350,6 +1358,7 @@
             enyo.$.scrim.hide();
           }
         } else {
+          OB.logUserAction('Complete Multi Orders payment');
           this.owner.model.get('multiOrders').trigger('paymentDone', this.allowOpenDrawer);
           OB.UTIL.setScanningFocus(false);
           this.owner.model.get('multiOrders').set('openDrawer', false);
@@ -1759,6 +1768,7 @@
     }
     this.setDisabled(true);
     enyo.$.scrim.show();
+    OB.logUserAction('Layaway ticket: ' + receipt.get('documentNo'));
     receipt.trigger('paymentDone', me.allowOpenDrawer);
   }
 });
\ No newline at end of file
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/pointofsale.js
@@ -1001,6 +1001,7 @@
     this.$.multiColumn.$.rightPanel.$.keyboard.execStatelessCommand('cashexact');
   },
   changeCurrentOrder: function (inSender, inEvent) {
+    OB.logUserAction('Switch to Ticket: ' + inEvent.newCurrentOrder.get('documentNo'));
     this.model.get('orderList').load(inEvent.newCurrentOrder);
     return true;
   },
@@ -1014,6 +1015,7 @@
         //      } else {
         //        me.model.get('multiOrders').removePayment(inEvent.payment);
         //      }
+        OB.logUserAction('Remove Payment: ' + inEvent.payment.get('name') + ' = ' + OB.I18N.formatCurrency(inEvent.payment.get('amount')) + ' ' + inEvent.payment.get('isocode'));
         if (me.model.get('leftColumnViewManager').isOrder()) {
           me.model.get('order').removePayment(inEvent.payment, inEvent.removeCallback);
           me.model.get('order').trigger('displayTotal');
@@ -1323,6 +1325,11 @@
       me.cancelRemoveMultiOrders(inSender, originator);
       return true;
     }
+    if (inEvent.order) {
+      OB.logUserAction('Remove Order: ' + inEvent.order.get('documentNo'));
+    } else {
+      OB.logUserAction('Close Multi Orders List');
+    }
     // If there are more than 1 order, do as usual
     if (me.model.get('multiOrders').get('multiOrdersList').length > 1 && inEvent.order) {
       me.model.get('multiOrders').get('multiOrdersList').remove(inEvent.order);
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/scan.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/scan.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/scan.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/scan.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -127,6 +127,7 @@
                 selectedLines: OB.MobileApp.model.receipt.get('undo').lines
               }, function (args) {
                 if (!args.cancellation && me.undoclick) {
+                  OB.logUserAction('Click on "Undo" button');
                   me.undoclick();
                 } else {
                   me.setDisabled(false);
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-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -217,6 +217,7 @@
                 customerAddr: OB.UTIL.clone(me.model.get('customerAddr'))
               });
               };
+          OB.logUserAction('Create Customer Address: ' + args.customerAddr.get('customerName') + ' - ' + args.customerAddr.get('name'));
           me.model.get('customerAddr').saveCustomerAddr(callback, enableButtonsCallback);
         });
       } else {
@@ -324,6 +325,7 @@
                       receipt.deleteLinesFromOrder(orderlines, function () {
                         args.customerAddr.saveCustomerAddr(callback, enableButtonsCallback);
                       });
+                      OB.logUserAction('Update Customer Address: ' + args.customerAddr.get('customerName') + ' - ' + args.customerAddr.get('name'));
                     });
                   }
                 }, {
@@ -343,6 +345,7 @@
                     enableButtonsCallback();
                     return true;
                   }
+                  OB.logUserAction('Update Customer Address: ' + args.customerAddr.get('customerName') + ' - ' + args.customerAddr.get('name'));
                   args.customerAddr.saveCustomerAddr(callback, enableButtonsCallback);
                 });
               }
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
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012-2017 Openbravo S.L.U.
+ * Copyright (C) 2012-2018 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.
@@ -489,6 +489,7 @@
           return true;
         }
         customerEdited = args.customer;
+        OB.logUserAction((args.isNew ? 'Create ' : 'Edit ') + 'Customer: ' + customerEdited.get('name'));
         args.customer.saveCustomer(function (result) {
           me.waterfall('onDisableButton', {
             disabled: false
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/ticketdiscount.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/ticketdiscount.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/ticketdiscount.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/ticketdiscount.js
@@ -351,6 +351,7 @@
       }
 
       _.each(me.checkedLines, function (line) {
+        OB.logUserAction('Apply promotion "' + promotionToAplly.rule.get('name') + '" to product "' + line.get('product').get('_identifier') + '" (' + line.get('qty') + ')');
         orderLinesCollection.add(line);
       });
 
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/toolbar-left.js
@@ -388,6 +388,7 @@
             receipt.prepareToSend(function () {
               receipt.trigger('closed', {
                 callback: function () {
+                  OB.logUserAction('Close Quotation: ' + receipt.get('documentNo') + ', Amount: ' + me.getLabel());
                   //In case the processed document is a quotation, we remove its id so it can be reactivated
                   if (receipt.get('isQuotation')) {
                     if (!(receipt.get('oldId') && receipt.get('oldId').length > 0)) {
@@ -419,6 +420,7 @@
       }
       return;
     }
+    OB.logUserAction('Total Amount (' + me.getLabel() + ') for ticket: ' + receipt.get('documentNo'));
     if (this.model.get('order').get('isEditable') === false && !this.model.get('order').get('isLayaway') && !this.model.get('order').get('isPaid')) {
       return true;
     }
@@ -682,6 +684,10 @@
     });
 
     this.menuEntries.push({
+      kind: 'OB.UI.MenuBackOfficeSessionLog'
+    });
+
+    this.menuEntries.push({
       kind: 'OB.UI.MenuSelectPrinter'
     });
 
