diff --git a/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java b/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
--- a/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
+++ b/modules/org.openbravo.client.application/src/org/openbravo/client/application/businesslogic/CloneOrderActionHandler.java
@@ -57,73 +57,7 @@
     JSONObject json = null;
     try {
       String orderId = (String) parameters.get("recordId");
-      User currentUser = OBContext.getOBContext().getUser();
-      Order objOrder = OBDal.getInstance().get(Order.class, orderId);
-      Order objCloneOrder = (Order) DalUtil.copy(objOrder, false);
-      BigDecimal bLineNetAmt = getLineNetAmt(orderId);
-
-      objCloneOrder.setDocumentAction("CO");
-      objCloneOrder.setDocumentStatus("DR");
-      objCloneOrder.setPosted("N");
-      objCloneOrder.setProcessed(false);
-      objCloneOrder.setDelivered(false);
-      objCloneOrder.setSalesTransaction(true);
-      objCloneOrder.setDocumentNo(null);
-      objCloneOrder.setSalesTransaction(objOrder.isSalesTransaction());
-      objCloneOrder.setCreationDate(new Date());
-      objCloneOrder.setUpdated(new Date());
-      objCloneOrder.setCreatedBy(currentUser);
-      objCloneOrder.setUpdatedBy(currentUser);
-      objCloneOrder.setReservationStatus(null);
-      // Setting order date and scheduled delivery date of header and the order lines to current
-      // date to avoid issues with tax rates. Refer issue
-      // https://issues.openbravo.com/view.php?id=23671
-      Date date = new Date();
-      Calendar cal = Calendar.getInstance();
-      cal.setTime(date);
-      cal.set(Calendar.HOUR_OF_DAY, 0);
-      cal.set(Calendar.MINUTE, 0);
-      cal.set(Calendar.SECOND, 0);
-      cal.set(Calendar.MILLISECOND, 0);
-      objCloneOrder.setOrderDate(cal.getTime());
-      objCloneOrder.setScheduledDeliveryDate(cal.getTime());
-
-      // save the cloned order object
-      OBDal.getInstance().save(objCloneOrder);
-
-      objCloneOrder.setSummedLineAmount(objCloneOrder.getSummedLineAmount().subtract(bLineNetAmt));
-      objCloneOrder.setGrandTotalAmount(objCloneOrder.getGrandTotalAmount().subtract(bLineNetAmt));
-
-      // get the lines associated with the order and clone them to the new
-      // order line.
-      for (OrderLine ordLine : objOrder.getOrderLineList()) {
-        String strPriceVersionId = getPriceListVersion(objOrder.getPriceList().getId(), objOrder
-            .getClient().getId());
-        BigDecimal bdPriceList = getPriceList(ordLine.getProduct().getId(), strPriceVersionId);
-        OrderLine objCloneOrdLine = (OrderLine) DalUtil.copy(ordLine, false);
-        objCloneOrdLine.setReservedQuantity(new BigDecimal("0"));
-        objCloneOrdLine.setDeliveredQuantity(new BigDecimal("0"));
-        objCloneOrdLine.setInvoicedQuantity(new BigDecimal("0"));
-        if (!"".equals(bdPriceList) || bdPriceList != null
-            || !bdPriceList.equals(BigDecimal.ZERO.setScale(bdPriceList.scale()))) {
-          objCloneOrdLine.setListPrice(bdPriceList);
-        }
-        objCloneOrdLine.setCreationDate(new Date());
-        objCloneOrdLine.setUpdated(new Date());
-        objCloneOrdLine.setCreatedBy(currentUser);
-        objCloneOrdLine.setUpdatedBy(currentUser);
-        objCloneOrdLine.setOrderDate(new Date());
-        objCloneOrdLine.setScheduledDeliveryDate(new Date());
-        objCloneOrder.getOrderLineList().add(objCloneOrdLine);
-        objCloneOrdLine.setSalesOrder(objCloneOrder);
-        objCloneOrdLine.setReservationStatus(null);
-      }
-
-      OBDal.getInstance().save(objCloneOrder);
-
-      OBDal.getInstance().flush();
-      OBDal.getInstance().refresh(objCloneOrder);
-      json = jsonConverter.toJsonObject(objCloneOrder, DataResolvingMode.FULL);
+      json = jsonConverter.toJsonObject(cloneOrder(orderId), DataResolvingMode.FULL);
       OBDal.getInstance().commitAndClose();
       return json;
     } catch (Exception e) {
@@ -131,6 +65,78 @@
     }
   }
 
+  public Order cloneOrder(String orderId) {
+    User currentUser = OBContext.getOBContext().getUser();
+    Order objOrder = OBDal.getInstance().get(Order.class, orderId);
+    Order objCloneOrder = (Order) DalUtil.copy(objOrder, false);
+    BigDecimal bLineNetAmt = getLineNetAmt(orderId);
+
+    objCloneOrder.setDocumentAction("CO");
+    objCloneOrder.setDocumentStatus("DR");
+    objCloneOrder.setPosted("N");
+    objCloneOrder.setProcessed(false);
+    objCloneOrder.setDelivered(false);
+    objCloneOrder.setSalesTransaction(true);
+    objCloneOrder.setDocumentNo(null);
+    objCloneOrder.setSalesTransaction(objOrder.isSalesTransaction());
+    objCloneOrder.setCreationDate(new Date());
+    objCloneOrder.setUpdated(new Date());
+    objCloneOrder.setCreatedBy(currentUser);
+    objCloneOrder.setUpdatedBy(currentUser);
+    objCloneOrder.setReservationStatus(null);
+    // Setting order date and scheduled delivery date of header and the order lines to current
+    // date to avoid issues with tax rates. Refer issue
+    // https://issues.openbravo.com/view.php?id=23671
+    Date date = new Date();
+    Calendar cal = Calendar.getInstance();
+    cal.setTime(date);
+    cal.set(Calendar.HOUR_OF_DAY, 0);
+    cal.set(Calendar.MINUTE, 0);
+    cal.set(Calendar.SECOND, 0);
+    cal.set(Calendar.MILLISECOND, 0);
+    objCloneOrder.setOrderDate(cal.getTime());
+    objCloneOrder.setScheduledDeliveryDate(cal.getTime());
+
+    // save the cloned order object
+    OBDal.getInstance().save(objCloneOrder);
+
+    objCloneOrder.setSummedLineAmount(objCloneOrder.getSummedLineAmount().subtract(bLineNetAmt));
+    objCloneOrder.setGrandTotalAmount(objCloneOrder.getGrandTotalAmount().subtract(bLineNetAmt));
+
+    // get the lines associated with the order and clone them to the new
+    // order line.
+    for (OrderLine ordLine : objOrder.getOrderLineList()) {
+      String strPriceVersionId = getPriceListVersion(objOrder.getPriceList().getId(), objOrder
+          .getClient().getId());
+      BigDecimal bdPriceList = getPriceList(ordLine.getProduct().getId(), strPriceVersionId);
+      OrderLine objCloneOrdLine = (OrderLine) DalUtil.copy(ordLine, false);
+      objCloneOrdLine.setReservedQuantity(new BigDecimal("0"));
+      objCloneOrdLine.setDeliveredQuantity(new BigDecimal("0"));
+      objCloneOrdLine.setInvoicedQuantity(new BigDecimal("0"));
+      if (!"".equals(bdPriceList) || bdPriceList != null
+          || !bdPriceList.equals(BigDecimal.ZERO.setScale(bdPriceList.scale()))) {
+        objCloneOrdLine.setListPrice(bdPriceList);
+      }
+      objCloneOrdLine.setCreationDate(new Date());
+      objCloneOrdLine.setUpdated(new Date());
+      objCloneOrdLine.setCreatedBy(currentUser);
+      objCloneOrdLine.setUpdatedBy(currentUser);
+      objCloneOrdLine.setOrderDate(new Date());
+      objCloneOrdLine.setScheduledDeliveryDate(new Date());
+      objCloneOrder.getOrderLineList().add(objCloneOrdLine);
+      objCloneOrdLine.setSalesOrder(objCloneOrder);
+      objCloneOrdLine.setReservationStatus(null);
+    }
+
+    OBDal.getInstance().save(objCloneOrder);
+
+    OBDal.getInstance().flush();
+    OBDal.getInstance().refresh(objCloneOrder);
+
+    return objCloneOrder;
+
+  }
+
   private String getPriceListVersion(String priceList, String clientId) {
     try {
       String whereClause = " as plv left outer join plv.priceList pl where plv.active='Y' and plv.active='Y' and "
