diff --git a/client/src/org/compiere/grid/tree/VTreePanel.java b/client/src/org/compiere/grid/tree/VTreePanel.java
index 849bbe153e..4fdb34b44a 100644
--- a/client/src/org/compiere/grid/tree/VTreePanel.java
+++ b/client/src/org/compiere/grid/tree/VTreePanel.java
@@ -24,6 +24,7 @@ import java.awt.event.*;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 import java.util.*;
+import java.util.List;
 import java.util.logging.*;
 import javax.swing.*;
 import javax.swing.plaf.SplitPaneUI;
@@ -66,6 +67,7 @@ public final class VTreePanel extends CPanel
 	public VTreePanel(int WindowNo, boolean hasBar, boolean editable)
 	{
 		super();
+		toolbar = new ArrayList<JToolBar>();
 		log.config("Bar=" + hasBar + ", Editable=" + editable);
 		m_WindowNo = WindowNo;
 		m_hasBar = hasBar;
@@ -76,7 +78,8 @@ public final class VTreePanel extends CPanel
 		if (!hasBar)
 		{
 			bar.setPreferredSize(new Dimension(0,0));
-			centerSplitPane.setDividerLocation(0);
+			//centerSplitPane.setDividerLocation(0);
+			centerSplitPane.setDividerLocation(1000);
 			centerSplitPane.setDividerSize(0);
 			popMenuTree.remove(mBarAdd);
 		}
@@ -123,16 +126,50 @@ public final class VTreePanel extends CPanel
 		//  Shortcut Bar
 		if (m_hasBar)
 		{
-			toolbar.removeAll();	//	remove all existing buttons
-			Enumeration en = m_root.preorderEnumeration();
-			while (en.hasMoreElements())
+			for (JToolBar jt : toolbar)
+				jt.removeAll();
+			toolbarMap = new HashMap<Integer, JToolBar>();
+			Enumeration enTop =m_root.children();
+			JToolBar jt = null;			
+			while (enTop.hasMoreElements())
 			{
-				MTreeNode nd = (MTreeNode)en.nextElement();
-				if (nd.isOnBar())
-					addToBar(nd);
+				MTreeNode ndTop = (MTreeNode)enTop.nextElement();
+				Enumeration en = ndTop.preorderEnumeration();
+				boolean labelDrawn=false;
+				while (en.hasMoreElements())
+				{
+					MTreeNode nd = (MTreeNode)en.nextElement();
+					if (nd.isOnBar()) {
+						if (!labelDrawn) {
+							jt = new JToolBar(JToolBar.VERTICAL);
+							addToBar(ndTop, jt, true);
+							labelDrawn=true;
+							toolbarMap.put(ndTop.getNode_ID(), jt);
+						}
+						addToBar(nd, jt, false);
+					}
+				}
+				if (jt!=null)
+					toolbar.add(jt);
+				jt=null;
+			}
+			//jbInit();
+			for (JToolBar jt2 : toolbar) {
+				jt2.setOpaque(false);
+				//jt2.setLayout(new GridBagLayout());
+				jt2.setFloatable(false);
+				jt2.setRollover(true);
+				jt2.setBorder(BorderFactory.createEmptyBorder());
+				CPanel barPart = new CPanel();
+				barPart.setLayout(new BorderLayout());
+				barPart.add(jt2, BorderLayout.NORTH);
+				barPart.setBorder(new ShadowBorder());
+				bar.add(barPart);
+			}
+			if (toolbarMap.size()<=3){
+				bar.setLayout(new GridLayout(0, 1));
 			}
 		}
-
 		return true;
 	}   //  initTree
 
@@ -152,7 +189,11 @@ public final class VTreePanel extends CPanel
 	private CMenuItem mFrom = new CMenuItem();
 	private CMenuItem mTo = new CMenuItem();
 	private CPanel bar = new CPanel();
-	private JToolBar toolbar = new JToolBar(JToolBar.VERTICAL);
+	private java.util.List<JToolBar> toolbar;
+	private HashMap<Integer, JToolBar> toolbarMap;
+	private int toolBarCols=3;
+	//private int toolBarRows=2;
+	//private JToolBar toolbar = new JToolBar(JToolBar.VERTICAL);
 	private CMenuItem mBarAdd = new CMenuItem();
 	private CMenuItem mBarRemove = new CMenuItem();
 	private BorderLayout southLayout = new BorderLayout();
@@ -231,13 +272,19 @@ public final class VTreePanel extends CPanel
 		this.add(southPanel, BorderLayout.SOUTH);
 		//
 		centerSplitPane.setOpaque(false);
-		toolbar.setOpaque(false);
-		centerSplitPane.add(treePane, JSplitPane.RIGHT);
-		centerSplitPane.add(bar, JSplitPane.LEFT);
+		centerSplitPane.add(treePane, JSplitPane.LEFT); //fcsku 3.7.2007 switch menu/favorites
+		centerSplitPane.add(bar, JSplitPane.RIGHT);
 		centerSplitPane.setBorder(BorderFactory.createEmptyBorder());
 		removeSplitPaneBorder();
 
 		this.add(centerSplitPane, BorderLayout.CENTER);
+		
+		GridLayout barLayout = new GridLayout(0, toolBarCols);
+		bar.setMinimumSize(new Dimension (50,50));
+		bar.setBorder(new ShadowBorder());
+		bar.setLayout(barLayout);
+
+		
 		//
 		mFrom.setText(Msg.getMsg(Env.getCtx(), "ItemMove"));
 		mFrom.setActionCommand("From");
@@ -246,17 +293,7 @@ public final class VTreePanel extends CPanel
 		mTo.setText(Msg.getMsg(Env.getCtx(), "ItemInsert"));
 		mTo.setActionCommand("To");
 		mTo.addActionListener(this);
-		//
-		bar.setMinimumSize(new Dimension (50,50));
-		bar.setBorder(new ShadowBorder());
-		bar.setLayout(new FlowLayout());
-		((FlowLayout)bar.getLayout()).setAlignment(FlowLayout.LEFT);
-		bar.add(toolbar);
-		toolbar.setLayout(new GridBagLayout());
-		toolbar.setFloatable(false);
-		toolbar.setRollover(true);
-		toolbar.setBorder(BorderFactory.createEmptyBorder());
-
+		
 		mBarAdd.setText(Msg.getMsg(Env.getCtx(), "BarAdd"));
 		mBarAdd.setActionCommand("BarAdd");
 		mBarAdd.addActionListener(this);
@@ -858,43 +895,91 @@ public final class VTreePanel extends CPanel
 	{
 		MTreeNode nd = (MTreeNode)tree.getSelectionPath().getLastPathComponent();
 		if (barDBupdate(true, nd.getNode_ID()))
-			addToBar(nd);
+			addToBar(nd,getParentToolBar(nd), false);
+		else if (CLogger.retrieveException().getMessage().indexOf("ORA-00001")!=-1)
+			ADialog.error(0, this, "", "Item is already on Bar");
 	}   //  barAdd
+	
+	/**
+	 * Returns the top level parent JToolBar for the given MTreenode. If the parent is not on 
+	 * the CPanel yet a new one is created and added.
+	 * @param nd
+	 * @return top level parent JToolBar for the given MTreenode
+	 */
+	private JToolBar getParentToolBar(MTreeNode nd){
+		int topParentId = getTopParentId(nd);
+		JToolBar parent = toolbarMap.get(topParentId);
+		if(parent==null){
+			Enumeration enTop =m_root.children();		
+			while (enTop.hasMoreElements()) {
+				MTreeNode ndTop = (MTreeNode)enTop.nextElement();
+				if(ndTop.getNode_ID()==topParentId){
+					log.fine("add new category: " + ndTop);
+					parent = new JToolBar(JToolBar.VERTICAL);
+					addToBar(ndTop, parent, true);
+					toolbarMap.put(ndTop.getNode_ID(), parent);
+					toolbar.add(parent);
+					parent.setOpaque(false);
+					parent.setFloatable(false);
+					parent.setRollover(true);
+					parent.setBorder(BorderFactory.createEmptyBorder());
+					CPanel barPart = new CPanel();
+					barPart.setLayout(new BorderLayout());
+					barPart.add(parent, BorderLayout.NORTH);
+					barPart.setBorder(new ShadowBorder());
+					bar.add(barPart);
+					return parent;
+				}
+			}
+		} else {
+			log.fine("parent found: " + parent);
+		}
+		return parent;
+	}
+
+	/**
+	 * Returns the id of the top level parent of the given MTreenode
+	 * @param nd
+	 * @return
+	 */
+	private int getTopParentId(MTreeNode nd) {
+		MTreeNode parent = (MTreeNode) nd.getParent();
+		if(parent!=null && parent.getNode_ID()!=0){
+			return getTopParentId(parent);
+		}
+		return nd.getNode_ID();
+	}
 
 	/**
 	 *  Add TreeNode to Bar
 	 *  @param nd node
 	 */
-	private void addToBar(MTreeNode nd)
+	private void addToBar(MTreeNode nd, JToolBar currentToolBar, boolean isLabel)
 	{
 		//	Only first word of Label
 		String label = nd.toString().trim();
-		int space = label.indexOf(' ');
+	//	int space = label.indexOf(' ');
 	//	if (space != -1)
 	//		label = label.substring(0, space);
 
-		CButton button = new CButton(label);
-		button.setOpaque(false);
-		button.setHorizontalAlignment(JButton.LEFT);
-		button.setToolTipText(nd.getDescription());
-		button.setActionCommand(String.valueOf(nd.getNode_ID()));
-		//
-		button.setMargin(new Insets(0, 0, 0, 0));
-		button.setIcon(nd.getIcon());
-		//button.setBorderPainted(false);
-		button.setRequestFocusEnabled(false);
-		//
-		button.addActionListener(this);
-		button.addMouseListener(mouseListener);
-		//
-		toolbar.add(button,
-			new GridBagConstraints(0, GridBagConstraints.RELATIVE,
-					1, 1, 1.0, 0.0, GridBagConstraints.NORTHWEST, 
-					GridBagConstraints.HORIZONTAL, new Insets(1,0,1,0), 4,2));
+		if (!isLabel) {
+			CButton button = new CButton(label);
+			button.setOpaque(false);
+			button.setHorizontalAlignment(JButton.LEFT);
+			button.setMargin(new Insets(0, 0, 0, 0));
+			button.setIcon(nd.getIcon());
+			button.setRequestFocusEnabled(false);
+			button.setToolTipText(nd.getDescription());
+			button.setActionCommand(String.valueOf(nd.getNode_ID()));
+			button.addActionListener(this);
+			button.addMouseListener(mouseListener);
+			currentToolBar.add(button);
+	    } else {
+	    	currentToolBar.add(new JLabel("<html><u><b>" +label+"</b></u></html>"));
+	    }
 		bar.validate();
-		
-		if (centerSplitPane.getDividerLocation() == -1)
-			centerSplitPane.setDividerLocation(button.getPreferredSize().width);
+		//if (centerSplitPane.getDividerLocation() == -1)
+		//	centerSplitPane.setDividerLocation(button.getPreferredSize().width);
 		bar.repaint();
 	}   //  addToBar
 
@@ -903,7 +988,23 @@ public final class VTreePanel extends CPanel
 	 */
 	private void barRemove()
 	{
-		toolbar.remove(m_buttonSelected);
+		//the button in on a JToolBar which is on a CPanel
+		JToolBar parentBar = (JToolBar) m_buttonSelected.getParent();
+		Container parentPanel = null;
+		if(parentBar!=null){
+			parentPanel = parentBar.getParent();
+		}
+		for (JToolBar jt : toolbar) {
+			jt.remove(m_buttonSelected);
+		}
+
+		if(parentPanel != null && parentBar.getComponentCount()==1){
+			//only label left
+			bar.remove(parentPanel);
+			//remove from toolBarMap..
+			toolbarMap.values().remove(parentBar);
+			
+		}
 		bar.validate();
 		bar.repaint();
 		barDBupdate(false, Integer.parseInt(m_buttonSelected.getActionCommand()));
@@ -934,7 +1035,7 @@ public final class VTreePanel extends CPanel
 			sql.append("DELETE AD_TreeBar WHERE AD_Tree_ID=").append(m_AD_Tree_ID)
 				.append(" AND AD_User_ID=").append(AD_User_ID)
 				.append(" AND Node_ID=").append(Node_ID);
-		int no = DB.executeUpdate(sql.toString(), true, null);
+		int no = DB.executeUpdate(sql.toString(), false, null);
 		return no == 1;
 	}	//	barDBupdate
 
@@ -1021,3 +1122,5 @@ class VTreePanel_keyAdapter extends java.awt.event.KeyAdapter
 			m_adaptee.keyPressed(e);
 	}
 }   //  VTreePanel_keyAdapter
+
+