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
@@ -707,7 +707,7 @@
     },
 
     setUnit: function (line, qty, text, doNotSave) {
-      var permission;
+      var permission, me = this;
 
       if (OB.DEC.isNumber(qty) && qty !== 0) {
         var oldqty = line.get('qty');
@@ -724,7 +724,6 @@
           this.addProduct(line.get('product'));
           return true;
         } else {
-          var me = this;
           // sets the new quantity
           line.set('qty', qty);
           line.calculateGross();
@@ -745,7 +744,18 @@
           this.save();
         }
       } else {
-        this.deleteLine(line);
+        if (line.get('deleteApproved')) {
+          // The approval to delete the line has already been granted
+          line.unset('deleteApproved');
+          this.deleteLine(line);
+        } else {
+          // We don't have the approval to delete the line yet; request it
+          OB.UTIL.Approval.requestApproval(OB.MobileApp.view.$.containerWindow.$.pointOfSale.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
+            if (approved) {
+              me.deleteLine(line);
+            }
+          });
+        }
       }
     },
 
@@ -1288,9 +1298,14 @@
         text: OB.I18N.getLabel('OBPOS_AddLine', [newline.get('qty'), newline.get('product').get('_identifier')]),
         line: newline,
         undo: function () {
-          me.get('lines').remove(newline);
-          me.calculateGross();
-          me.set('undo', null);
+          OB.UTIL.Approval.requestApproval(
+          this.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
+            if (approved) {
+              me.get('lines').remove(newline);
+              me.calculateGross();
+              me.set('undo', null);
+            }
+          });
         }
       });
       this.adjustPayment();
diff --git a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
--- a/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
+++ b/web/org.openbravo.retail.posterminal/js/pointofsale/view/keyboardorder.js
@@ -1,6 +1,6 @@
 /*
  ************************************************************************************
- * Copyright (C) 2012 Openbravo S.L.U.
+ * Copyright (C) 2012-2015 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.
@@ -173,6 +173,7 @@
           if (value === 0) { // If final quantity will be 0 then request approval
             OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
               if (approved) {
+                keyboard.line.set('deleteApproved', true);
                 actionAddProduct(keyboard, toadd);
               }
             });
@@ -271,11 +272,23 @@
     this.addCommand('+', {
       stateless: true,
       action: function (keyboard, txt) {
-        var qty = 1;
+        var qty = 1, value;
         if ((!_.isNull(txt) || !_.isUndefined(txt)) && !_.isNaN(OB.I18N.parseNumber(txt))) {
           qty = OB.I18N.parseNumber(txt);
         }
-        actionAddProduct(keyboard, qty);
+        if (!_.isUndefined(keyboard.line)) {
+          value = (keyboard.receipt.get('orderType') === 1 ? keyboard.line.get('qty') - qty : keyboard.line.get('qty') + qty);
+        }
+        if (value === 0) { // If final quantity will be 0 then request approval
+          OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
+            if (approved) {
+              keyboard.line.set('deleteApproved', true);
+              actionAddProduct(keyboard, qty);
+            }
+          });
+        } else {
+          actionAddProduct(keyboard, qty);
+        }
       }
     });
     this.addCommand('-', {
@@ -287,11 +300,12 @@
           qty = OB.I18N.parseNumber(txt);
         }
         if (!_.isUndefined(keyboard.line)) {
-          value = keyboard.line.get('qty') - qty;
+          value = (keyboard.receipt.get('orderType') === 1 ? keyboard.line.get('qty') + qty : keyboard.line.get('qty') - qty);
         }
         if (value === 0) { // If final quantity will be 0 then request approval
           OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
             if (approved) {
+              keyboard.line.set('deleteApproved', true);
               actionAddProduct(keyboard, -qty);
             }
           });
@@ -306,6 +320,7 @@
       action: function (keyboard) {
         OB.UTIL.Approval.requestApproval(me.model, 'OBPOS_approval.deleteLine', function (approved, supervisor, approvalType) {
           if (approved) {
+            keyboard.line.set('deleteApproved', true);
             actionDeleteLine(keyboard);
           }
         });
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
@@ -89,6 +89,9 @@
               if (this.undoclick) {
                 this.undoclick();
               }
+            },
+            init: function (model) {
+              this.model = model;
             }
           }]
         }]
