diff --git a/client/src/org/compiere/apps/form/VInOutGen.java b/client/src/org/compiere/apps/form/VInOutGen.java
index 16801bc547..14ab686f6c 100644
--- a/client/src/org/compiere/apps/form/VInOutGen.java
+++ b/client/src/org/compiere/apps/form/VInOutGen.java
@@ -78,7 +78,6 @@ public class VInOutGen extends CPanel
 	private FormFrame 		m_frame;
 
 	private boolean			m_selectionActive = true;
-	private String          m_whereClause;
 	private Object 			m_M_Warehouse_ID = null;
 	private Object 			m_C_BPartner_ID = null;
 	/**	Logger			*/
@@ -102,6 +101,9 @@ public class VInOutGen extends CPanel
 	private JScrollPane scrollPane = new JScrollPane();
 	private MiniTable miniTable = new MiniTable();
 
+	/** User selection */
+	private ArrayList<Integer> selection = null;
+	
 	/**
 	 *	Static Init.
 	 *  <pre>
@@ -286,8 +288,9 @@ public class VInOutGen extends CPanel
 			return;
 		}
 		//
-		m_whereClause = saveSelection();
-		if (m_whereClause.length() > 0 
+		saveSelection();
+		if (selection != null
+			&& selection.size() > 0
 			&& m_selectionActive	//	on selection tab
 			&& m_M_Warehouse_ID != null)
 			generateShipments ();
@@ -343,13 +346,14 @@ public class VInOutGen extends CPanel
 	 *	Save Selection & return selecion Query or ""
 	 *  @return where clause like C_Order_ID IN (...)
 	 */
-	private String saveSelection()
+	private void saveSelection()
 	{
 		log.info("");
 		//  ID selection may be pending
 		miniTable.editingStopped(new ChangeEvent(this));
 		//  Array of Integers
 		ArrayList<Integer> results = new ArrayList<Integer>();
+		selection = null;
 
 		//	Get selected entries
 		int rows = miniTable.getRowCount();
@@ -362,32 +366,10 @@ public class VInOutGen extends CPanel
 		}
 
 		if (results.size() == 0)
-			return "";
+			return;
 		log.config("Selected #" + results.size());
-
-		//	Query String
-		String keyColumn = "C_Order_ID";
-		StringBuffer sb = new StringBuffer(keyColumn);
-		if (results.size() > 1)
-			sb.append(" IN (");
-		else
-			sb.append("=");
-		//	Add elements
-		for (int i = 0; i < results.size(); i++)
-		{
-			if (i > 0)
-				sb.append(",");
-			if (keyColumn.endsWith("_ID"))
-				sb.append(results.get(i).toString());
-			else
-				sb.append("'").append(results.get(i).toString());
-		}
-
-		if (results.size() > 1)
-			sb.append(")");
-		//
-		log.config(sb.toString());
-		return sb.toString();
+		selection = results;
+		
 	}	//	saveSelection
 
 	
@@ -397,34 +379,14 @@ public class VInOutGen extends CPanel
 	private void generateShipments ()
 	{
 		log.info("M_Warehouse_ID=" + m_M_Warehouse_ID);
-	//	String trxName = Trx.createTrxName("IOG");	
-	//	Trx trx = Trx.get(trxName, true);	trx needs to be committed too
-		String trxName = null;
-		Trx trx = null;
+		String trxName = Trx.createTrxName("IOG");	
+		Trx trx = Trx.get(trxName, true);	//trx needs to be committed too
+		//String trxName = null;
+		//Trx trx = null;
 		
-		//	Reset Selection
-		String sql = "UPDATE C_Order SET IsSelected = 'N' "
-			+ "WHERE IsSelected='Y'"
-			+ " AND AD_Client_ID=" + Env.getAD_Client_ID(Env.getCtx());
-		int no = DB.executeUpdate(sql, trxName);
-		log.config("Reset=" + no);
-
-		//	Set Selection
-		sql = "UPDATE C_Order SET IsSelected='Y' WHERE " + m_whereClause;
-		no = DB.executeUpdate(sql, trxName);
-		log.fine(sql);
-		if (no == 0)
-		{
-			String msg = "No Shipments";     //  not translated!
-			log.config(msg);
-			info.setText(msg);
-			return;
-		}
-		log.info("Set Selection #" + no);
-
 		m_selectionActive = false;  //  prevents from being called twice
 		statusBar.setStatusLine(Msg.getMsg(Env.getCtx(), "InOutGenerateGen"));
-		statusBar.setStatusDB(String.valueOf(no));
+		statusBar.setStatusDB(String.valueOf(selection.size()));
 
 		//	Prepare Process
 		int AD_Process_ID = 199;	  // M_InOutCreate - org.compiere.process.InOutGenerate
@@ -434,6 +396,51 @@ public class VInOutGen extends CPanel
 			info.setText(Msg.getMsg(Env.getCtx(), "ProcessNoInstance"));
 			return;
 		}
+		System.out.println("AD_PInstance_ID: " + instance.getAD_PInstance_ID());
+		
+		//insert selection
+		StringBuffer insert = new StringBuffer();
+		insert.append("INSERT INTO T_SELECTION(AD_PINSTANCE_ID, T_SELECTION_ID) ");
+		int counter = 0;
+		for(Integer selectedId : selection)
+		{
+			counter++;
+			if (counter > 1)
+				insert.append(" UNION ");
+			insert.append("SELECT ");
+			insert.append(instance.getAD_PInstance_ID());
+			insert.append(", ");
+			insert.append(selectedId);
+			insert.append(" FROM DUAL ");
+			
+			if (counter == 1000) 
+			{
+				if ( DB.executeUpdate(insert.toString(), trxName) < 0 )
+				{
+					String msg = "No Shipments";     //  not translated!
+					log.config(msg);
+					info.setText(msg);
+					trx.rollback();
+					return;
+				}
+				insert = new StringBuffer();
+				insert.append("INSERT INTO T_SELECTION(AD_PINSTANCE_ID, T_SELECTION_ID) ");
+				counter = 0;
+			}
+		}
+		if (counter > 0)
+		{
+			if ( DB.executeUpdate(insert.toString(), trxName) < 0 )
+			{
+				String msg = "No Shipments";     //  not translated!
+				log.config(msg);
+				info.setText(msg);
+				trx.rollback();
+				return;
+			}
+		}
+		
+		//call process
 		ProcessInfo pi = new ProcessInfo ("VInOutGen", AD_Process_ID);
 		pi.setAD_PInstance_ID (instance.getAD_PInstance_ID());
 
@@ -485,9 +492,10 @@ public class VInOutGen extends CPanel
 		info.setText(iText.toString());
 
 		//	Reset Selection
+		/*
 		String sql = "UPDATE C_Order SET IsSelected='N' WHERE " + m_whereClause;
 		int no = DB.executeUpdate(sql, null);
-		log.config("Reset=" + no);
+		log.config("Reset=" + no);*/
 
 		//	Get results
 		int[] ids = pi.getIDs();