diff -r 633df9ec65bf src/org/openbravo/warehouse/pickinglist/SelectOrdersHandler.java
--- a/src/org/openbravo/warehouse/pickinglist/SelectOrdersHandler.java	Mon Jul 07 17:27:28 2014 +0200
+++ b/src/org/openbravo/warehouse/pickinglist/SelectOrdersHandler.java	Mon Jul 07 17:30:12 2014 +0200
@@ -27,6 +27,8 @@
 
 import org.codehaus.jettison.json.JSONArray;
 import org.codehaus.jettison.json.JSONObject;
+import org.hibernate.ScrollMode;
+import org.hibernate.ScrollableResults;
 import org.hibernate.criterion.Restrictions;
 import org.openbravo.base.exception.OBException;
 import org.openbravo.base.provider.OBProvider;
@@ -125,7 +127,15 @@
     if (order.isObwplIsinpickinglist()) {
       throw new OBException(OBMessageUtils.messageBD("OBWPL_IsInPL") + order.getDocumentNo());
     }
-    for (OrderLine line : order.getOrderLineList()) {
+
+    OBCriteria<OrderLine> qLines = OBDal.getInstance().createCriteria(OrderLine.class);
+    qLines.add(Restrictions.eq(OrderLine.PROPERTY_SALESORDER, order));
+    qLines.addOrderBy(OrderLine.PROPERTY_LINENO, true);
+    ScrollableResults scrollLines = qLines.scroll(ScrollMode.FORWARD_ONLY);
+
+    while (scrollLines.next()) {
+      final OrderLine line = (OrderLine) scrollLines.get()[0];
+
       BigDecimal pendingQty = line.getOrderedQuantity().subtract(line.getDeliveredQuantity());
       if (line.getProduct() == null || !line.getProduct().isStocked()
           || !"I".equals(line.getProduct().getProductType())
@@ -240,6 +250,9 @@
       res.getMaterialMgmtReservationStockList().removeAll(rsToRemove);
       OBDal.getInstance().save(res);
       OBDal.getInstance().flush();
+
+      // clear session after each line iteration because the number of objects read in memory is big
+      OBDal.getInstance().getSession().clear();
     }
     order.setObwplIsinpickinglist(true);
     OBDal.getInstance().save(order);
