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
@@ -1050,7 +1050,7 @@
             if (p.get('rate') && p.get('rate') !== '1') {
               p.set('origAmount', OB.DEC.add(payment.get('origAmount'), OB.DEC.mul(p.get('origAmount'), p.get('rate'))));
             }
-            OB.UTIL.adjustPayment(total, this);
+            this.adjustPayment();
             return;
           }
         }
@@ -1060,7 +1060,7 @@
       }
       payment.set('date', new Date());
       payments.add(payment);
-      OB.UTIL.adjustPayment(total, this);
+      this.adjustPayment();
     },
 
     overpaymentExists: function () {
@@ -1468,6 +1468,78 @@
       openDrawer: false,
       additionalInfo: null
     },
+    adjustPayment: function () {
+        var i, max, p;
+        var payments = this.get('payments');
+        var total = this.getTotal();
+
+        var nocash = OB.DEC.Zero;
+        var cash = OB.DEC.Zero;
+        var origCash = OB.DEC.Zero;
+        var auxCash = OB.DEC.Zero;
+        var prevCash = OB.DEC.Zero;
+        var paidCash = OB.DEC.Zero;
+        var pcash;
+
+        for (i = 0, max = payments.length; i < max; i++) {
+          p = payments.at(i);
+          if (p.get('rate') && p.get('rate') !== '1') {
+            p.set('origAmount', OB.DEC.mul(p.get('amount'), p.get('rate')));
+          } else {
+            p.set('origAmount', p.get('amount'));
+          }
+          p.set('paid', p.get('origAmount'));
+          if (p.get('kind') === OB.POS.modelterminal.get('paymentcash')) {
+            // The default cash method
+            cash = OB.DEC.add(cash, p.get('origAmount'));
+            pcash = p;
+            paidCash = OB.DEC.add(paidCash, p.get('origAmount'));
+          } else if (OB.POS.modelterminal.hasPayment(p.get('kind')) && OB.POS.modelterminal.hasPayment(p.get('kind')).paymentMethod.iscash) {
+            // Another cash method
+            origCash = OB.DEC.add(origCash, p.get('origAmount'));
+            pcash = p;
+            paidCash = OB.DEC.add(paidCash, p.get('origAmount'));
+          } else {
+            nocash = OB.DEC.add(nocash, p.get('origAmount'));
+          }
+        }
+
+        // Calculation of the change....
+        //FIXME
+        if (pcash) {
+          if (pcash.get('kind') !== OB.POS.modelterminal.get('paymentcash')) {
+            auxCash = origCash;
+            prevCash = cash;
+          } else {
+            auxCash = cash;
+            prevCash = origCash;
+          }
+          if (OB.DEC.compare(nocash - total) > 0) {
+            pcash.set('paid', OB.DEC.Zero);
+            this.set('payment', nocash);
+            this.set('change', OB.DEC.add(cash, origCash));
+          } else if (OB.DEC.compare(OB.DEC.sub(OB.DEC.add(OB.DEC.add(nocash, cash), origCash), total)) > 0) {
+            pcash.set('paid', OB.DEC.sub(total, OB.DEC.add(nocash, OB.DEC.sub(paidCash, pcash.get('origAmount')))));
+            this.set('payment', total);
+            //The change value will be computed through a rounded total value, to ensure that the total plus change
+            //add up to the paid amount without any kind of precission loss
+            this.set('change', OB.DEC.sub(OB.DEC.add(OB.DEC.add(nocash, cash), origCash), OB.Utilities.Number.roundJSNumber(total, 2)));
+          } else {
+            pcash.set('paid', auxCash);
+            this.set('payment', OB.DEC.add(OB.DEC.add(nocash, cash), origCash));
+            this.set('change', OB.DEC.Zero);
+          }
+        } else {
+          if (payments.length > 0) {
+            if (this.get('payment') === 0 || nocash > 0) {
+              this.set('payment', nocash);
+            }
+          } else {
+            this.set('payment', OB.DEC.Zero);
+          }
+          this.set('change', OB.DEC.Zero);
+        }
+      },
     addPayment: function (payment) {
       var payments, total;
       var i, max, p;
@@ -1489,7 +1561,7 @@
             if (p.get('rate') && p.get('rate') !== '1') {
               p.set('origAmount', OB.DEC.add(payment.get('origAmount'), OB.DEC.mul(p.get('origAmount'), p.get('rate'))));
             }
-            OB.UTIL.adjustPayment(total, this);
+            this.adjustPayment();
             return;
           }
         }
@@ -1499,7 +1571,7 @@
       }
       payment.set('date', new Date());
       payments.add(payment);
-      OB.UTIL.adjustPayment(total, this);
+      this.adjustPayment();
     },
     removePayment: function (payment) {
       var payments = this.get('payments');
@@ -1507,7 +1579,7 @@
       if (payment.get('openDrawer')) {
         this.set('openDrawer', false);
       }
-      OB.UTIL.adjustPayment(this.get('total'), this);
+      this.adjustPayment();
     },
     getTotal: function () {
       return this.get('total');
