diff --git a/serverRoot/src/main/ejb/org/compiere/session/ServerBean.java b/serverRoot/src/main/ejb/org/compiere/session/ServerBean.java
index f8006f7cb7..6388e3bc80 100644
--- a/serverRoot/src/main/ejb/org/compiere/session/ServerBean.java
+++ b/serverRoot/src/main/ejb/org/compiere/session/ServerBean.java
@@ -27,6 +27,7 @@ import java.util.logging.*;
 import javax.ejb.*;
 import javax.sql.*;
 
+import org.adempiere.util.ProcessUtil;
 import org.compiere.*;
 import org.compiere.acct.*;
 import org.compiere.model.*;
@@ -250,51 +251,13 @@ public class ServerBean implements SessionBean
 	 */
 	public ProcessInfo process (Properties ctx, ProcessInfo pi)
 	{
-		String className = pi.getClassName();
-		log.info(className + " - " + pi);
 		m_processCount++;
-		//	Get Class
-		Class clazz = null;
-		try
-		{
-			clazz = Class.forName (className);
-		}
-		catch (ClassNotFoundException ex)
-		{
-			log.log(Level.WARNING, className, ex);
-			pi.setSummary ("ClassNotFound", true);
-			return pi;
-		}
-		//	Get Process
-		SvrProcess process = null;
-		try
-		{
-			process = (SvrProcess)clazz.newInstance ();
-		}
-		catch (Exception ex)
-		{
-			log.log(Level.WARNING, "Instance for " + className, ex);
-			pi.setSummary ("InstanceError", true);
-			return pi;
-		}
+		
 		//	Start Process
 		String trxName = pi.getTransactionName();
 		if (trxName == null) trxName = Trx.createTrxName("ServerPrc"); 
 		Trx trx = Trx.get(trxName, true);
-		try
-		{
-			boolean ok = process.startProcess (ctx, pi, trx);
-			pi = process.getProcessInfo();
-			trx.commit(true);
-			trx.close();
-		}
-		catch (Exception ex1)
-		{
-			trx.rollback();
-			trx.close();
-			pi.setSummary ("ProcessError", true);
-			return pi;
-		}
+		ProcessUtil.startJavaProcess(pi, trx);
 		return pi;
 	}	//	process
 
@@ -312,13 +275,7 @@ public class ServerBean implements SessionBean
 	{
 		log.info ("[" + m_no + "] " + AD_Workflow_ID);
 		m_workflowCount++;
-		MWorkflow wf = MWorkflow.get (ctx, AD_Workflow_ID);
-		MWFProcess wfProcess = null;
-		if (pi.isBatch())
-			wfProcess = wf.start(pi);		//	may return null
-		else
-			wfProcess = wf.startWait(pi);	//	may return null
-		log.fine(pi.toString());
+		ProcessUtil.startWorkFlow(ctx, pi, AD_Workflow_ID);
 		return pi;
 	}	//	workflow
 
@@ -622,33 +579,10 @@ public class ServerBean implements SessionBean
 	{
 		validateSecurityToken(token);
 		
-		String sql = "{call " + procedureName + "(?)}";
 		Trx trx = null;
 		if (trxName != null)
 			trx = Trx.get(trxName, true);
-		try 
-		{
-			CallableStatement cstmt = DB.prepareCall(sql, ResultSet.CONCUR_UPDATABLE, trxName);	
-			cstmt.setInt(1, processInfo.getAD_PInstance_ID());
-			cstmt.executeUpdate();
-			cstmt.close();
-			if (trx != null && trx.isActive())
-			{
-				trx.commit(true);
-				trx.close();
-			}
-		}
-		catch (Exception e)
-		{
-			log.log(Level.SEVERE, sql, e);
-			if (trx != null && trx.isActive())
-			{
-				trx.rollback();
-				trx.close();
-			}
-			processInfo.setSummary (Msg.getMsg(Env.getCtx(), "ProcessRunError") + " " + e.getLocalizedMessage());
-			processInfo.setError (true);
-		}
+		ProcessUtil.startDatabaseProcedure(processInfo, procedureName, trx);
 		return processInfo;
 	}