diff --git a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentMonitorProcess.java b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentMonitorProcess.java
--- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentMonitorProcess.java
+++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/process/FIN_PaymentMonitorProcess.java
@@ -96,7 +96,6 @@
       for (Invoice invoice : obc.list()) {
         invoiceIds.add(invoice.getId());
       }
-
       for (String invoiceId : invoiceIds) {
         Invoice invoice = OBDal.getInstance().get(Invoice.class, invoiceId);
         updateInvoice(invoice);
@@ -135,6 +134,8 @@
         oldFlowAmounts.put("paidAmt", BigDecimal.ZERO);
         oldFlowAmounts.put("outstandingAmt", BigDecimal.ZERO);
         oldFlowAmounts.put("overdueAmt", BigDecimal.ZERO);
+        oldFlowAmounts.put("daystilldue", BigDecimal.ZERO);
+        oldFlowAmounts.put("lastpaymentdate", BigDecimal.ZERO);
       }
 
       HashMap<String, BigDecimal> amounts = calculateAmounts(invoice);
@@ -143,7 +144,8 @@
           oldFlowAmounts.get("outstandingAmt")));
       invoice.setPaymentComplete(invoice.getOutstandingAmount().compareTo(BigDecimal.ZERO) == 0);
       invoice.setDueAmount(amounts.get("overdueAmt").add(oldFlowAmounts.get("overdueAmt")));
-      invoice.setDaysTillDue(getDaysTillDue(invoice));
+      invoice.setDaysTillDue(getDaysTillDue(invoice)
+          + oldFlowAmounts.get("daystilldue").longValue());
       if (invoice.getOutstandingAmount().compareTo(BigDecimal.ZERO) == 0) {
         Date finalSettlementDate = getFinalSettlementDate(invoice);
         // If date is null invoice amount = 0 then nothing to set
@@ -151,6 +153,11 @@
           invoice.setFinalSettlementDate(finalSettlementDate);
           invoice.setDaysSalesOutstanding(FIN_Utility.getDaysBetween(invoice.getInvoiceDate(),
               finalSettlementDate));
+        } else {
+          invoice
+              .setFinalSettlementDate(new Date(oldFlowAmounts.get("lastpaymentdate").longValue()));
+          invoice.setDaysSalesOutstanding(FIN_Utility.getDaysBetween(invoice.getInvoiceDate(),
+              new Date(oldFlowAmounts.get("lastpaymentdate").longValue())));
         }
       }
       BigDecimal grandTotalAmount = invoice.getGrandTotalAmount();
@@ -198,12 +205,25 @@
     BigDecimal paidAmt = BigDecimal.ZERO;
     BigDecimal outstandingAmt = BigDecimal.ZERO;
     BigDecimal overdueAmt = BigDecimal.ZERO;
+    DebtPayment payment = null;
+    Date lastPaymentDate = null;
     for (DebtPayment debtPayment : debtPayments) {
       // Calculate paid amount.
       BigDecimal paid = calculatePaidAmount(debtPayment, currencyTo, conversionDate, BigDecimal.ONE);
       paidAmt = paidAmt.add(paid);
       // Calculate outstanding amount.
       outstandingAmt = outstandingAmt.add(debtPayment.getAmount().subtract(paid));
+      if (outstandingAmt.signum() == 0) {
+        if (lastPaymentDate == null
+            || lastPaymentDate.compareTo(debtPayment.getSettlementCancelled().getTransactionDate()) < 0) {
+          lastPaymentDate = debtPayment.getSettlementCancelled().getTransactionDate();
+        }
+      }
+      if (payment == null) {
+        payment = debtPayment;
+      } else if (payment.getDueDate().after(debtPayment.getDueDate())) {
+        payment = debtPayment;
+      }
       // Calculate overdue amount.
       overdueAmt = overdueAmt.add(calculateOverdueAmount(debtPayment, currencyTo, conversionDate,
           BigDecimal.ONE));
@@ -212,6 +232,11 @@
     amounts.put("paidAmt", paidAmt);
     amounts.put("outstandingAmt", outstandingAmt);
     amounts.put("overdueAmt", overdueAmt);
+    amounts.put("daystilldue", new BigDecimal(BigDecimal.ZERO.compareTo(overdueAmt) == 0 ? 0l
+        : (FIN_Utility.getDaysToDue(payment.getDueDate()))));
+    if (lastPaymentDate != null) {
+      amounts.put("lastpaymentdate", new BigDecimal(lastPaymentDate.getTime()));
+    }
     return amounts;
   }
 
@@ -330,6 +355,7 @@
       Date conversionDate, BigDecimal multiplier) {
     BigDecimal paidAmount = BigDecimal.ZERO;
     String finPaymentStatus = getMigratedPaymentStatus(payment);
+    Date lastpaymentdate = null;
     if ("PAID".equals(finPaymentStatus)) {
       return getConvertedAmt(payment.getAmount().multiply(multiplier), payment.getCurrency()
           .getId(), strCurrencyTo, conversionDate, payment.getClient().getId(), payment
