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
@@ -1506,6 +1506,14 @@
           options: options,
           newLine: newLine
         }, function (args) {
+          var callbackAddProduct = function () {
+              if (callback) {
+                callback(true, args.orderline);
+              }
+              };
+          if (args.orderline) {
+            args.orderline.set('hasMandatoryServices', false);
+          }
           if (args.newLine && me.get('lines').contains(line) && args.productToAdd.get('productType') !== 'S') {
             var synchId = OB.UTIL.SynchronizationHelper.busyUntilFinishes('HasServices');
             // Display related services after calculate gross, if it is new line and if the line has not been deleted.
@@ -1524,18 +1532,19 @@
                   var splitline = !OB.UTIL.isNullOrUndefined(args.orderline) && !OB.UTIL.isNullOrUndefined(args.orderline.get('splitline')) && args.orderline.get('splitline');
                   if (!splitline) {
                     args.receipt.trigger('showProductList', args.orderline, 'mandatory');
+                    args.orderline.set('hasMandatoryServices', true);
+                    callbackAddProduct();
                   }
+                } else {
+                  callbackAddProduct();
                 }
+              } else {
+                callbackAddProduct();
               }
               OB.UTIL.SynchronizationHelper.finished(synchId, 'HasServices');
-              if (callback) {
-                callback(true, args.orderline);
-              }
             }, args.orderline);
           } else {
-            if (callback) {
-              callback(true, args.orderline);
-            }
+            callbackAddProduct();
           }
         });
       } // End addProductToOrder
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
@@ -407,13 +407,18 @@
     });
   },
   addProductToOrder: function (inSender, inEvent) {
-    var targetOrder;
+    var targetOrder, me = this;
     if (inEvent && inEvent.targetOrder) {
       targetOrder = inEvent.targetOrder;
     } else {
       targetOrder = this.model.get('order');
     }
-    if (targetOrder.pendingAddProduct && targetOrder.pendingAddProduct === true) {
+    if (targetOrder.addProcess && targetOrder.addProcess.pending === true) {
+      targetOrder.addProcess.hasProduct = true;
+      targetOrder.addProcess.products.push({
+        inSender: inSender,
+        inEvent: inEvent
+      });
       return false;
     }
     if (targetOrder.get('isEditable') === false) {
@@ -513,9 +518,19 @@
         }
         return true;
       }
-      args.receipt.pendingAddProduct = true;
+      args.receipt.addProcess = {};
+      args.receipt.addProcess.pending = true;
+      args.receipt.addProcess.hasProduct = false;
+      args.receipt.addProcess.products = [];
       args.receipt.addProduct(args.productToAdd, args.qtyToAdd, args.options, args.attrs, function (success, orderline) {
-        args.receipt.pendingAddProduct = false;
+        args.receipt.addProcess.pending = false;
+        if (success && orderline) {
+          if (orderline.get('hasMandatoryServices') === false && args.receipt.addProcess.hasProduct === true) {
+            args.receipt.addProcess.products.forEach(function (product) {
+              me.addProductToOrder(product.inSender, product.inEvent);
+            });
+          }
+        }
         args.context.model.get('orderList').saveCurrent();
         if (inEvent.callback) {
           inEvent.callback.call(inEvent.context, success, orderline);
