diff --git a/src/org/openbravo/module/remittance/process/REM_RemittanceProcess.java b/src/org/openbravo/module/remittance/process/REM_RemittanceProcess.java
--- a/src/org/openbravo/module/remittance/process/REM_RemittanceProcess.java
+++ b/src/org/openbravo/module/remittance/process/REM_RemittanceProcess.java
@@ -76,6 +76,8 @@
 
   private OBError error = new OBError();
 
+  private long line = 0l;
+
   public void execute(ProcessBundle bundle) throws Exception {
     dao = new AdvPaymentMngtDao();
     OBError msg = new OBError();
@@ -177,7 +179,7 @@
         }
 
         if (strAction.equals(GENERATE_PAYMENT)) {
-          createPayments(remittance);
+          createPayments(remittance, bundle);
         } else if (strAction.equals(GENERATE_GROUPED_PAYMENT)) {
           createGroupedPayments(remittance, false, false);
         } else if (strAction.equals(GENERATED_GROUPED_PAYMENT_DUEDATE)) {
@@ -547,11 +549,11 @@
             payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo,
                 currentbp, pm, remittance.getFinancialAccount(), currentPaymentTotal.toString(),
                 expectedDate, line.getOrganization(), "", psdList, hm, false, false,
-                currentCurrency, txnConvRate, txnConvAmount);
+                currentCurrency, txnConvRate, txnConvAmount, false);
           } else {
             payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo,
                 currentbp, pm, remittance.getFinancialAccount(), currentPaymentTotal.toString(),
-                expectedDate, line.getOrganization(), "", psdList, hm, false, false);
+                expectedDate, line.getOrganization(), "", psdList, hm, false, false, false);
           }
           OBDal.getInstance().save(payment);
           OBDal.getInstance().flush();
@@ -616,9 +618,12 @@
     }
   }
 
-  private void createPayments(Remittance remittance) throws Exception {
+  private void createPayments(Remittance remittance, ProcessBundle bundle) throws Exception {
     FIN_PaymentMethod pm = remittance.getRemittanceType().getPaymentMethod();
     Currency faCurrency = remittance.getFinancialAccount().getCurrency();
+    final ProcessBundle pb = new ProcessBundle("6255BE488882480599C81284B70CD9B3", bundle
+        .getContext().toVars()).init(bundle.getConnection());
+    int i = 0;
 
     for (String lineId : getRemittanceLines(remittance.getId())) {
       RemittanceLine line = OBDal.getInstance().get(RemittanceLine.class, lineId);
@@ -633,16 +638,16 @@
         }
         payment.setStatus(STATUS_SENT);
         // Associate to remittance payment method
-        payment.setProcessed(false);
-        OBDal.getInstance().save(payment);
-        OBDal.getInstance().flush();
         if (!STATUS_RECEIVED.equals(line.getOrigstatus())) {
+          payment.setProcessed(false);
+          OBDal.getInstance().save(payment);
+          OBDal.getInstance().flush(); // FIXME needed?
           payment.setPaymentMethod(remittance.getRemittanceType().getPaymentMethod());
           payment.setAccount(remittance.getFinancialAccount());
+          payment.setProcessed(true);
+          OBDal.getInstance().flush(); // FIXME needed?
         }
-        payment.setProcessed(true);
-        OBDal.getInstance().save(payment);
-        OBDal.getInstance().flush();
+
         Instruction instruction = addRemittanceBankInstruction(remittance, payment);
         instruction.setPayment(payment);
         OBDal.getInstance().save(instruction);
@@ -650,6 +655,7 @@
       }
       Instruction instruction = addRemittanceBankInstruction(remittance,
           line.getPaymentScheduleDetail(), line.getAmount());
+
       if (!remittance.isSinglePayment()) {
         boolean isReceipt = line.getPaymentScheduleDetail().getInvoicePaymentSchedule() != null ? line
             .getPaymentScheduleDetail().getInvoicePaymentSchedule().getInvoice()
@@ -717,37 +723,39 @@
           if (!line.getAmount().equals(new BigDecimal(0))) {
             txnConvRate = txnConvAmount.divide(line.getAmount(), 6, BigDecimal.ROUND_HALF_UP);
           }
+
           payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo, bp,
               pm, remittance.getFinancialAccount(), line.getAmount().toString(), expectedDate,
               line.getOrganization(), "", psdList, hm, false, false, currency, txnConvRate,
-              txnConvAmount);
+              txnConvAmount, false);
         } else {
           payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo, bp,
               pm, remittance.getFinancialAccount(), line.getAmount().toString(), expectedDate,
-              line.getOrganization(), "", psdList, hm, false, false);
+              line.getOrganization(), "", psdList, hm, false, false, false);
         }
         OBDal.getInstance().save(payment);
-        OBDal.getInstance().flush();
         instruction.setPayment(payment);
         OBDal.getInstance().save(instruction);
 
-        ConnectionProvider conn = new DalConnectionProvider();
-        OBError error = FIN_AddPayment.processPayment(new VariablesSecureApp(OBContext
-            .getOBContext().getUser().getId(), OBContext.getOBContext().getCurrentClient().getId(),
-            OBContext.getOBContext().getCurrentOrganization().getId(), OBContext.getOBContext()
-                .getRole().getId()), conn, isReceipt ? (!pm.isAutomaticDeposit() ? "P" : "D")
-            : (!pm.isAutomaticWithdrawn() ? "P" : "D"), payment);
+        OBError error = FIN_AddPayment.processPayment(pb,
+            isReceipt ? (!pm.isAutomaticDeposit() ? "P" : "D") : (!pm.isAutomaticWithdrawn() ? "P"
+                : "D"), payment, null, null, false);
         if ("Error".equals(error.getType())) {
           throw new OBException(error.getMessage());
         }
 
         payment.setStatus(STATUS_SENT);
-        OBDal.getInstance().save(payment);
         line.setPayment(payment);
-        OBDal.getInstance().save(payment);
-        OBDal.getInstance().flush();
+
+        i++;
+        if (i % 100 == 0) {
+          OBDal.getInstance().flush();
+        }
       }
+
     }
+    // Flush last lines
+    OBDal.getInstance().flush();
     if (remittance.isSinglePayment()) {
       createSinglePayment(remittance);
     }
@@ -908,12 +916,12 @@
       payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo, null,
           remittance.getRemittanceType().getPaymentMethod(), remittance.getFinancialAccount(),
           amount.toString(), remittance.getDueDate(), remittance.getOrganization(), "", psdList,
-          hm, false, false, currency, txnConvRate, txnConvAmount);
+          hm, false, false, currency, txnConvRate, txnConvAmount, false);
     } else {
       payment = FIN_AddPayment.savePayment(null, isReceipt, docType, strPaymentDocumentNo, null,
           remittance.getRemittanceType().getPaymentMethod(), remittance.getFinancialAccount(),
           amount.toString(), remittance.getDueDate(), remittance.getOrganization(), "", psdList,
-          hm, false, false);
+          hm, false, false, false);
     }
     OBDal.getInstance().save(payment);
     ConnectionProvider conn = new DalConnectionProvider();
@@ -974,7 +982,6 @@
       bankInstruction.setPayment(payment);
     }
     OBDal.getInstance().save(bankInstruction);
-    OBDal.getInstance().flush();
     return bankInstruction;
   }
 
@@ -1099,16 +1106,8 @@
   }
 
   private long getNextInstructionLineNo(Remittance remittance) {
-    OBCriteria<Instruction> obc = OBDal.getInstance().createCriteria(Instruction.class);
-    obc.add(Restrictions.eq(Instruction.PROPERTY_REMITTANCE, remittance));
-    obc.addOrderBy(Instruction.PROPERTY_LINENO, false);
-    obc.setMaxResults(1);
-    List<Instruction> instructions = obc.list();
-    if (instructions.isEmpty()) {
-      return 10l;
-    } else {
-      return instructions.get(0).getLineNo() + 10l;
-    }
+    line = line + 10l;
+    return line;
   }
 
   @SuppressWarnings("unchecked")
