diff --git a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
--- a/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
+++ b/modules/org.openbravo.advpaymentmngt/src/org/openbravo/advpaymentmngt/utility/FIN_Utility.java
@@ -992,19 +992,37 @@
     return invoiceDocNo;
   }
 
+  static long runtime = 0;
+
+  private static final Map<String, Boolean> isPaymentConfirmedCache = new HashMap<String, Boolean>();
+
   /**
    * Returns if given payment status and related payment schedule detail belong to a confirmed
    * payment
    * 
    */
   public static boolean isPaymentConfirmed(String status, FIN_PaymentScheduleDetail psd) {
+    String cacheKey = status;
+    Boolean b = isPaymentConfirmedCache.get(cacheKey);
+    if (b != null) {
+      return b;
+    }
+
+    long s1 = System.currentTimeMillis();
     List<Object> parameters = new ArrayList<Object>();
     parameters.add(status);
     parameters.add((psd != null) ? psd.getId() : "");
     String result = (String) CallStoredProcedure.getInstance().call("APRM_ISPAYMENTCONFIRMED",
         parameters, null);
 
-    return "Y".equals(result);
+    long s2 = System.currentTimeMillis();
+    runtime += (s2 - s1);
+    log4j.error("isPaymentConfirmed: total up to now: " + runtime);
+
+    b = "Y".equals(result);
+    isPaymentConfirmedCache.put(cacheKey, b);
+    log4j.error("size of hashmap: " + isPaymentConfirmedCache.size());
+    return b;
   }
 
   /**
