Bug 330119 - render toolbar contributions using the ContributionManagers
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
index 64e66e3..119fbd0 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/DirectContributionItem.java
@@ -2,6 +2,7 @@
 
 import javax.inject.Inject;
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
+import org.eclipse.e4.core.contexts.IContextFunction;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.core.di.annotations.CanExecute;
 import org.eclipse.e4.core.di.annotations.Execute;
@@ -15,12 +16,16 @@
 import org.eclipse.e4.ui.model.application.ui.MUILabel;
 import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
 import org.eclipse.e4.ui.model.application.ui.menu.MItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
 import org.eclipse.e4.ui.workbench.IResourceUtilities;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
 import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuCreator;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.resource.DeviceResourceException;
@@ -28,6 +33,11 @@
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.LocalResourceManager;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Menu;
@@ -124,9 +134,14 @@
 		if (widget != null) {
 			return;
 		}
+		boolean isDropdown = false;
+		if (model instanceof MToolItem) {
+			MMenu menu = ((MToolItem) model).getMenu();
+			isDropdown = menu != null;
+		}
 		int style = SWT.PUSH;
-		if (model.getType() == ItemType.PUSH)
-			style = SWT.PUSH;
+		if (isDropdown)
+			style = SWT.DROP_DOWN;
 		else if (model.getType() == ItemType.CHECK)
 			style = SWT.CHECK;
 		else if (model.getType() == ItemType.RADIO)
@@ -205,7 +220,6 @@
 		}
 		final String tooltip = model.getLocalizedTooltip();
 		item.setToolTipText(tooltip);
-
 		item.setSelection(model.isSelected());
 		item.setEnabled(model.isEnabled());
 	}
@@ -303,6 +317,9 @@
 
 	private void handleWidgetSelection(Event event) {
 		if (widget != null && !widget.isDisposed()) {
+			if (dropdownEvent(event)) {
+				return;
+			}
 			if (model.getType() == ItemType.CHECK
 					|| model.getType() == ItemType.RADIO) {
 				boolean selection = false;
@@ -319,6 +336,69 @@
 		}
 	}
 
+	private boolean dropdownEvent(Event event) {
+		if (event.detail == SWT.ARROW && model instanceof MToolItem) {
+			ToolItem ti = (ToolItem) event.widget;
+			MMenu mmenu = ((MToolItem) model).getMenu();
+			if (mmenu == null) {
+				return false;
+			}
+			Menu menu = getMenu(mmenu, ti);
+			if (menu == null) {
+				return true;
+			}
+			Rectangle itemBounds = ti.getBounds();
+			Point displayAt = ti.getParent().toDisplay(itemBounds.x,
+					itemBounds.y + itemBounds.height);
+			menu.setLocation(displayAt);
+			menu.setVisible(true);
+
+			Display display = menu.getDisplay();
+			while (menu.isVisible()) {
+				if (!display.readAndDispatch()) {
+					display.sleep();
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+	protected Menu getMenu(final MMenu mmenu, ToolItem toolItem) {
+		Object obj = mmenu.getWidget();
+		if (obj instanceof Menu && !((Menu) obj).isDisposed()) {
+			return (Menu) obj;
+		}
+		// this is a temporary passthrough of the IMenuCreator
+		if (mmenu instanceof MRenderedMenu) {
+			obj = ((MRenderedMenu) mmenu).getContributionManager();
+			if (obj instanceof IContextFunction) {
+				final IEclipseContext lclContext = getContext(mmenu);
+				obj = ((IContextFunction) obj).compute(lclContext);
+				((MRenderedMenu) mmenu).setContributionManager(obj);
+			}
+			if (obj instanceof IMenuCreator) {
+				final IMenuCreator creator = (IMenuCreator) obj;
+				final Menu menu = creator.getMenu(toolItem.getParent()
+						.getShell());
+				if (menu != null) {
+					toolItem.addDisposeListener(new DisposeListener() {
+						public void widgetDisposed(DisposeEvent e) {
+							if (menu != null && !menu.isDisposed()) {
+								creator.dispose();
+								((MRenderedMenu) mmenu).setWidget(null);
+							}
+						}
+					});
+					// mmenu.setWidget(menu);
+					menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+					return menu;
+				}
+			}
+		}
+		return null;
+	}
+
 	private void executeItem() {
 		final IEclipseContext lclContext = getContext(model);
 		if (!checkContribution(lclContext)) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
index 9380b9a..df0e560 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/HandledContributionItem.java
@@ -2,11 +2,13 @@
 
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import javax.inject.Inject;
 import org.eclipse.core.commands.ParameterizedCommand;
 import org.eclipse.core.commands.common.NotDefinedException;
 import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.commands.EHandlerService;
+import org.eclipse.e4.core.contexts.IContextFunction;
 import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.ui.bindings.EBindingService;
 import org.eclipse.e4.ui.internal.workbench.Activator;
@@ -19,12 +21,16 @@
 import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
 import org.eclipse.e4.ui.model.application.ui.menu.MHandledItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MRenderedMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
 import org.eclipse.e4.ui.workbench.IResourceUtilities;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
 import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.IContributionManager;
+import org.eclipse.jface.action.IMenuCreator;
 import org.eclipse.jface.action.IMenuListener;
 import org.eclipse.jface.action.IMenuManager;
 import org.eclipse.jface.bindings.TriggerSequence;
@@ -33,6 +39,11 @@
 import org.eclipse.jface.resource.JFaceResources;
 import org.eclipse.jface.resource.LocalResourceManager;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
+import org.eclipse.swt.graphics.Point;
+import org.eclipse.swt.graphics.Rectangle;
+import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Listener;
 import org.eclipse.swt.widgets.Menu;
@@ -162,9 +173,14 @@
 		if (widget != null) {
 			return;
 		}
+		boolean isDropdown = false;
+		if (model instanceof MToolItem) {
+			MMenu menu = ((MToolItem) model).getMenu();
+			isDropdown = menu != null;
+		}
 		int style = SWT.PUSH;
-		if (model.getType() == ItemType.PUSH)
-			style = SWT.PUSH;
+		if (isDropdown)
+			style = SWT.DROP_DOWN;
 		else if (model.getType() == ItemType.CHECK)
 			style = SWT.CHECK;
 		else if (model.getType() == ItemType.RADIO)
@@ -261,12 +277,58 @@
 		} else {
 			item.setText(""); //$NON-NLS-1$
 		}
-		final String tooltip = model.getLocalizedTooltip();
+		final String tooltip = getToolTipText(model);
 		item.setToolTipText(tooltip);
 		item.setSelection(model.isSelected());
 		item.setEnabled(model.isEnabled());
 	}
 
+	private String getToolTipText(MItem item) {
+		String text = item.getLocalizedTooltip();
+		if (item instanceof MHandledItem) {
+			MHandledItem handledItem = (MHandledItem) item;
+			IEclipseContext context = getContext(item);
+			EBindingService bs = (EBindingService) context
+					.get(EBindingService.class.getName());
+			ParameterizedCommand cmd = handledItem.getWbCommand();
+			if (cmd == null) {
+				cmd = generateParameterizedCommand(handledItem, context);
+			}
+			TriggerSequence sequence = bs.getBestSequenceFor(handledItem
+					.getWbCommand());
+			if (sequence != null) {
+				if (text == null) {
+					try {
+						text = cmd.getName();
+					} catch (NotDefinedException e) {
+						return null;
+					}
+				}
+				text = text + " (" + sequence.format() + ')'; //$NON-NLS-1$
+			}
+			return text;
+		}
+		return text;
+	}
+
+	private ParameterizedCommand generateParameterizedCommand(
+			final MHandledItem item, final IEclipseContext lclContext) {
+		ECommandService cmdService = (ECommandService) lclContext
+				.get(ECommandService.class.getName());
+		Map<String, Object> parameters = null;
+		List<MParameter> modelParms = item.getParameters();
+		if (modelParms != null && !modelParms.isEmpty()) {
+			parameters = new HashMap<String, Object>();
+			for (MParameter mParm : modelParms) {
+				parameters.put(mParm.getName(), mParm.getValue());
+			}
+		}
+		ParameterizedCommand cmd = cmdService.createCommand(item.getCommand()
+				.getElementId(), parameters);
+		item.setWbCommand(cmd);
+		return cmd;
+	}
+
 	private void updateIcons() {
 		if (widget instanceof MenuItem) {
 			MenuItem item = (MenuItem) widget;
@@ -360,6 +422,9 @@
 
 	private void handleWidgetSelection(Event event) {
 		if (widget != null && !widget.isDisposed()) {
+			if (dropdownEvent(event)) {
+				return;
+			}
 			if (model.getType() == ItemType.CHECK
 					|| model.getType() == ItemType.RADIO) {
 				boolean selection = false;
@@ -376,6 +441,73 @@
 		}
 	}
 
+	/**
+	 * @param event
+	 * @return
+	 */
+	private boolean dropdownEvent(Event event) {
+		if (event.detail == SWT.ARROW && model instanceof MToolItem) {
+			ToolItem ti = (ToolItem) event.widget;
+			MMenu mmenu = ((MToolItem) model).getMenu();
+			if (mmenu == null) {
+				return false;
+			}
+			Menu menu = getMenu(mmenu, ti);
+			if (menu == null) {
+				return true;
+			}
+			Rectangle itemBounds = ti.getBounds();
+			Point displayAt = ti.getParent().toDisplay(itemBounds.x,
+					itemBounds.y + itemBounds.height);
+			menu.setLocation(displayAt);
+			menu.setVisible(true);
+
+			Display display = menu.getDisplay();
+			while (menu.isVisible()) {
+				if (!display.readAndDispatch()) {
+					display.sleep();
+				}
+			}
+			return true;
+		}
+		return false;
+	}
+
+	protected Menu getMenu(final MMenu mmenu, ToolItem toolItem) {
+		Object obj = mmenu.getWidget();
+		if (obj instanceof Menu && !((Menu) obj).isDisposed()) {
+			return (Menu) obj;
+		}
+		// this is a temporary passthrough of the IMenuCreator
+		if (mmenu instanceof MRenderedMenu) {
+			obj = ((MRenderedMenu) mmenu).getContributionManager();
+			if (obj instanceof IContextFunction) {
+				final IEclipseContext lclContext = getContext(mmenu);
+				obj = ((IContextFunction) obj).compute(lclContext);
+				((MRenderedMenu) mmenu).setContributionManager(obj);
+			}
+			if (obj instanceof IMenuCreator) {
+				final IMenuCreator creator = (IMenuCreator) obj;
+				final Menu menu = creator.getMenu(toolItem.getParent()
+						.getShell());
+				if (menu != null) {
+					toolItem.addDisposeListener(new DisposeListener() {
+						public void widgetDisposed(DisposeEvent e) {
+							if (menu != null && !menu.isDisposed()) {
+								creator.dispose();
+								((MRenderedMenu) mmenu).setWidget(null);
+							}
+						}
+					});
+					// mmenu.setWidget(menu);
+					menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+					return menu;
+				}
+			}
+		}
+		return null;
+	}
+
 	private void executeItem() {
 		ParameterizedCommand cmd = model.getWbCommand();
 		if (cmd == null) {
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java
new file mode 100644
index 0000000..8f5f9a2
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarContributionRecord.java
@@ -0,0 +1,202 @@
+/*******************************************************************************
+ * Copyright (c) 2011 IBM Corporation and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ ******************************************************************************/
+
+package org.eclipse.e4.ui.workbench.renderers.swt;
+
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.Iterator;
+import org.eclipse.e4.core.contexts.IEclipseContext;
+import org.eclipse.e4.ui.internal.workbench.ContributionsAnalyzer;
+import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
+import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.jface.action.ToolBarManager;
+
+public class ToolBarContributionRecord {
+	MToolBar toolbarModel;
+	MToolBarContribution toolbarContribution;
+	ArrayList<MToolBarElement> generatedElements = new ArrayList<MToolBarElement>();
+	HashSet<MToolBarElement> sharedElements = new HashSet<MToolBarElement>();
+	ToolBarManagerRenderer renderer;
+	boolean isVisible = true;
+
+	public ToolBarContributionRecord(MToolBar model,
+			MToolBarContribution contribution, ToolBarManagerRenderer renderer) {
+		this.toolbarModel = model;
+		this.toolbarContribution = contribution;
+		this.renderer = renderer;
+	}
+
+	public ToolBarManager getManagerForModel() {
+		return renderer.getManager(toolbarModel);
+	}
+
+	/**
+	 * @param context
+	 */
+	public void updateVisibility(IEclipseContext context) {
+		ExpressionContext exprContext = new ExpressionContext(context);
+		updateIsVisible(exprContext);
+		HashSet<ToolBarContributionRecord> recentlyUpdated = new HashSet<ToolBarContributionRecord>();
+		recentlyUpdated.add(this);
+		for (MToolBarElement item : generatedElements) {
+			boolean currentVisibility = computeVisibility(recentlyUpdated,
+					item, exprContext);
+			item.setVisible(currentVisibility);
+		}
+		for (MToolBarElement item : sharedElements) {
+			boolean currentVisibility = computeVisibility(recentlyUpdated,
+					item, exprContext);
+			item.setVisible(currentVisibility);
+		}
+		getManagerForModel().markDirty();
+	}
+
+	public void updateIsVisible(ExpressionContext exprContext) {
+		isVisible = ContributionsAnalyzer.isVisible(toolbarContribution,
+				exprContext);
+	}
+
+	public boolean computeVisibility(
+			HashSet<ToolBarContributionRecord> recentlyUpdated,
+			MToolBarElement item, ExpressionContext exprContext) {
+		boolean currentVisibility = isVisible;
+		if (item instanceof MToolBarSeparator) {
+			ArrayList<ToolBarContributionRecord> list = renderer.getList(item);
+			if (list != null) {
+				Iterator<ToolBarContributionRecord> cr = list.iterator();
+				while (!currentVisibility && cr.hasNext()) {
+					ToolBarContributionRecord rec = cr.next();
+					if (!recentlyUpdated.contains(rec)) {
+						rec.updateIsVisible(exprContext);
+						recentlyUpdated.add(rec);
+					}
+					currentVisibility |= rec.isVisible;
+				}
+			}
+		}
+		if (currentVisibility
+				&& item.getVisibleWhen() instanceof MCoreExpression) {
+			boolean val = ContributionsAnalyzer.isVisible(
+					(MCoreExpression) item.getVisibleWhen(), exprContext);
+			currentVisibility = val;
+		}
+		return currentVisibility;
+	}
+
+	public boolean anyVisibleWhen() {
+		if (toolbarContribution.getVisibleWhen() != null) {
+			return true;
+		}
+		for (MToolBarElement child : toolbarContribution.getChildren()) {
+			if (child.getVisibleWhen() != null) {
+				return true;
+			}
+		}
+		return false;
+	}
+
+	public boolean mergeIntoModel() {
+		int idx = getIndex(toolbarModel,
+				toolbarContribution.getPositionInParent());
+		if (idx == -1) {
+			return false;
+		}
+
+		for (MToolBarElement item : toolbarContribution.getChildren()) {
+			MToolBarElement copy = (MToolBarElement) EcoreUtil
+					.copy((EObject) item);
+			if (copy instanceof MToolBarSeparator) {
+				MToolBarSeparator shared = findExistingSeparator(copy
+						.getElementId());
+				if (shared == null) {
+					shared = (MToolBarSeparator) copy;
+					renderer.linkElementToContributionRecord(copy, this);
+					toolbarModel.getChildren().add(idx++, copy);
+				} else {
+					copy = shared;
+				}
+				sharedElements.add(shared);
+			} else {
+				generatedElements.add(copy);
+				renderer.linkElementToContributionRecord(copy, this);
+				toolbarModel.getChildren().add(idx++, copy);
+			}
+			if (copy instanceof MToolBarSeparator) {
+				ArrayList<ToolBarContributionRecord> array = renderer
+						.getList(copy);
+				array.add(this);
+			}
+		}
+		return true;
+	}
+
+	MToolBarSeparator findExistingSeparator(String id) {
+		if (id == null) {
+			return null;
+		}
+		for (MToolBarElement item : toolbarModel.getChildren()) {
+			if (item instanceof MToolBarSeparator
+					&& id.equals(item.getElementId())) {
+				return (MToolBarSeparator) item;
+			}
+		}
+		return null;
+	}
+
+	public void dispose() {
+		for (MToolBarElement copy : generatedElements) {
+			toolbarModel.getChildren().remove(copy);
+		}
+		for (MToolBarElement shared : sharedElements) {
+			ArrayList<ToolBarContributionRecord> array = renderer
+					.getList(shared);
+			array.remove(this);
+			if (array.isEmpty()) {
+				toolbarModel.getChildren().remove(shared);
+			}
+		}
+	}
+
+	private static int getIndex(MElementContainer<?> model,
+			String positionInParent) {
+		String id = null;
+		String modifier = null;
+		if (positionInParent != null && positionInParent.length() > 0) {
+			String[] array = positionInParent.split("="); //$NON-NLS-1$
+			modifier = array[0];
+			id = array[1];
+		}
+		if (id == null) {
+			return model.getChildren().size();
+		}
+
+		int idx = 0;
+		int size = model.getChildren().size();
+		while (idx < size) {
+			if (id.equals(model.getChildren().get(idx).getElementId())) {
+				if ("after".equals(modifier)) { //$NON-NLS-1$
+					idx++;
+				}
+				return idx;
+			}
+			idx++;
+		}
+		return id.equals("additions") ? model.getChildren().size() : -1; //$NON-NLS-1$
+	}
+}
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
index be7e7f1..f23a271 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolBarManagerRenderer.java
@@ -11,8 +11,8 @@
 package org.eclipse.e4.ui.workbench.renderers.swt;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
 import javax.annotation.PostConstruct;
@@ -41,13 +41,12 @@
 import org.eclipse.e4.ui.workbench.IPresentationEngine;
 import org.eclipse.e4.ui.workbench.UIEvents;
 import org.eclipse.e4.ui.workbench.modeling.EModelService;
-import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.jface.action.AbstractGroupMarker;
 import org.eclipse.jface.action.ContributionItem;
 import org.eclipse.jface.action.GroupMarker;
 import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.MenuManager;
 import org.eclipse.jface.action.Separator;
 import org.eclipse.jface.action.ToolBarManager;
 import org.eclipse.jface.layout.RowLayoutFactory;
@@ -78,18 +77,24 @@
  */
 public class ToolBarManagerRenderer extends SWTPartRenderer {
 
+	private static final String TOOL_BAR_MANAGER_RENDERER_VIEW_MENU = "ToolBarManagerRenderer.viewMenu"; //$NON-NLS-1$
+	private static final String TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE = "ToolBarManagerRenderer.dragHandle"; //$NON-NLS-1$
 	private Map<MToolBar, ToolBarManager> modelToManager = new HashMap<MToolBar, ToolBarManager>();
 	private Map<ToolBarManager, MToolBar> managerToModel = new HashMap<ToolBarManager, MToolBar>();
 
 	private Map<MToolBarElement, IContributionItem> modelToContribution = new HashMap<MToolBarElement, IContributionItem>();
+	private Map<IContributionItem, MToolBarElement> contributionToModel = new HashMap<IContributionItem, MToolBarElement>();
 
-	private ArrayList<ContributionRecord> contributionRecords = new ArrayList<ContributionRecord>();
+	private Map<MToolBarElement, ToolBarContributionRecord> modelContributionToRecord = new HashMap<MToolBarElement, ToolBarContributionRecord>();
+
+	private Map<MToolBarElement, ArrayList<ToolBarContributionRecord>> sharedElementToRecord = new HashMap<MToolBarElement, ArrayList<ToolBarContributionRecord>>();
 
 	// @Inject
 	// private Logger logger;
 
 	@Inject
-	IPresentationEngine renderer;
+	private IPresentationEngine renderer;
+
 	@Inject
 	private MApplication application;
 	@Inject
@@ -218,8 +223,10 @@
 		eventBroker
 				.subscribe(UIEvents.buildTopic(UIEvents.Item.TOPIC,
 						UIEvents.Item.ENABLED), enabledUpdater);
-		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC,
-				UIEvents.UIElement.TOBERENDERED), toBeRenderedUpdater);
+		eventBroker.subscribe(UIEvents.buildTopic(UIEvents.UIElement.TOPIC),
+				toBeRenderedUpdater);
+
+		context.set(ToolBarManagerRenderer.class, this);
 
 	}
 
@@ -243,15 +250,65 @@
 		if (!(element instanceof MToolBar) || !(parent instanceof Composite))
 			return null;
 
-		// HACK!! This should be done using a separate renderer
-		Composite intermediate = new Composite((Composite) parent, SWT.NONE);
-		createToolbar(element, intermediate);
-		processContribution((MToolBar) element);
-
+		final MToolBar toolbarModel = (MToolBar) element;
+		Composite intermediate = createIntermediate(toolbarModel,
+				(Composite) parent);
+		createToolbar(toolbarModel, intermediate);
+		setupMenuButton(toolbarModel, intermediate);
+		processContribution(toolbarModel);
 		return intermediate;
 	}
 
 	/**
+	 * @param toolbarModel
+	 * @param intermediate
+	 */
+	private void setupMenuButton(MToolBar toolbarModel, Composite intermediate) {
+		if (needsViewMenu(toolbarModel)) {
+			MPart part = (MPart) ((EObject) toolbarModel).eContainer();
+			MMenu viewMenu = getViewMenu(part);
+
+			// View menu (if any)
+			if (viewMenu != null) {
+				addMenuButton(part, intermediate, viewMenu);
+			}
+		}
+	}
+
+	/**
+	 * @param toolbarModel
+	 * @param parent
+	 * @return an intermediate composite or simply the parent.
+	 */
+	private Composite createIntermediate(MToolBar toolbarModel, Composite parent) {
+		Composite intermediate = new Composite((Composite) parent, SWT.NONE);
+		intermediate.setData(AbstractPartRenderer.OWNING_ME, toolbarModel);
+		int orientation = getOrientation(toolbarModel);
+		RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
+				.spacing(0).type(orientation).create();
+		layout.marginLeft = 3;
+		layout.center = true;
+		intermediate.setLayout(layout);
+		if (needsDragHandle(toolbarModel)) {
+			ToolBar separatorToolBar = new ToolBar(intermediate, orientation
+					| SWT.WRAP | SWT.FLAT | SWT.RIGHT);
+			separatorToolBar.setData(TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE);
+			new ToolItem(separatorToolBar, SWT.SEPARATOR);
+		}
+		return intermediate;
+	}
+
+	private boolean needsDragHandle(MToolBar toolbarModel) {
+		return toolbarModel != null
+				&& ((EObject) toolbarModel).eContainer() instanceof MTrimBar;
+	}
+
+	private boolean needsViewMenu(MToolBar toolbarModel) {
+		return toolbarModel != null
+				&& ((EObject) toolbarModel).eContainer() instanceof MPart;
+	}
+
+	/**
 	 * @param element
 	 */
 	private void processContribution(MToolBar toolbarModel) {
@@ -268,13 +325,6 @@
 	 */
 	private void generateContributions(MToolBar toolbarModel,
 			ArrayList<MToolBarContribution> toContribute) {
-		HashSet<String> existingSeparatorNames = new HashSet<String>();
-		for (MToolBarElement child : toolbarModel.getChildren()) {
-			String elementId = child.getElementId();
-			if (child instanceof MToolBarSeparator && elementId != null) {
-				existingSeparatorNames.add(elementId);
-			}
-		}
 
 		ToolBarManager manager = getManager(toolbarModel);
 		boolean done = toContribute.size() == 0;
@@ -285,8 +335,7 @@
 			toContribute.clear();
 
 			for (final MToolBarContribution contribution : curList) {
-				if (!processAddition(toolbarModel, manager, contribution,
-						existingSeparatorNames)) {
+				if (!processAddition(toolbarModel, manager, contribution)) {
 					toContribute.add(contribution);
 				}
 			}
@@ -297,44 +346,6 @@
 		}
 	}
 
-	static class ContributionRecord {
-		public ContributionRecord(MToolBar toolbarModel,
-				MToolBarContribution contribution, ToolBarManager manager) {
-			this.toolbarModel = toolbarModel;
-			this.contribution = contribution;
-			this.manager = manager;
-		}
-
-		MToolBar toolbarModel;
-		MToolBarContribution contribution;
-		ToolBarManager manager;
-		ArrayList<MToolBarElement> generatedElements = new ArrayList<MToolBarElement>();
-
-		public void generate() {
-			for (MToolBarElement element : contribution.getChildren()) {
-				MToolBarElement copy = (MToolBarElement) EcoreUtil
-						.copy((EObject) element);
-				generatedElements.add(copy);
-			}
-		}
-
-		public void updateVisibility(IEclipseContext context) {
-			ExpressionContext exprContext = new ExpressionContext(context);
-			boolean isVisible = ContributionsAnalyzer.isVisible(contribution,
-					exprContext);
-			for (MToolBarElement item : generatedElements) {
-				item.setVisible(isVisible);
-			}
-			manager.markDirty();
-		}
-
-		public void dispose() {
-			for (MToolBarElement copy : generatedElements) {
-				toolbarModel.getChildren().remove(copy);
-			}
-		}
-	}
-
 	/**
 	 * @param toolbarModel
 	 * @param manager
@@ -343,36 +354,20 @@
 	 * @return <code>true</code> if the contribution was successfuly processed
 	 */
 	private boolean processAddition(MToolBar toolbarModel,
-			final ToolBarManager manager, MToolBarContribution contribution,
-			HashSet<String> existingSeparatorNames) {
-		int idx = getIndex(toolbarModel, contribution.getPositionInParent());
-		if (idx == -1) {
+			final ToolBarManager manager, MToolBarContribution contribution) {
+		final ToolBarContributionRecord record = new ToolBarContributionRecord(
+				toolbarModel, contribution, this);
+		if (!record.mergeIntoModel()) {
 			return false;
 		}
-		final ContributionRecord record = new ContributionRecord(toolbarModel,
-				contribution, manager);
-		contributionRecords.add(record);
-		record.generate();
-		for (MToolBarElement copy : record.generatedElements) {
-			if (copy instanceof MToolBarSeparator
-					&& existingSeparatorNames.contains(copy.getElementId())) {
-				// skip this, it's already there
-				continue;
-			}
-			toolbarModel.getChildren().add(idx++, copy);
-			if (copy instanceof MToolBarSeparator
-					&& copy.getElementId() != null) {
-				existingSeparatorNames.add(copy.getElementId());
-			}
-		}
-		if (contribution.getVisibleWhen() != null) {
+		if (record.anyVisibleWhen()) {
 			final IEclipseContext parentContext = modelService
 					.getContainingContext(toolbarModel);
 			parentContext.runAndTrack(new RunAndTrack() {
 				@Override
 				public boolean changed(IEclipseContext context) {
 					record.updateVisibility(parentContext.getActiveLeaf());
-					manager.update(false);
+					manager.update(true);
 					return true;
 				}
 			});
@@ -381,54 +376,16 @@
 		return true;
 	}
 
-	private static int getIndex(MElementContainer<?> menuModel,
-			String positionInParent) {
-		String id = null;
-		String modifier = null;
-		if (positionInParent != null && positionInParent.length() > 0) {
-			String[] array = positionInParent.split("="); //$NON-NLS-1$
-			modifier = array[0];
-			id = array[1];
-		}
-		if (id == null) {
-			return menuModel.getChildren().size();
-		}
-
-		int idx = 0;
-		int size = menuModel.getChildren().size();
-		while (idx < size) {
-			if (id.equals(menuModel.getChildren().get(idx).getElementId())) {
-				if ("after".equals(modifier)) { //$NON-NLS-1$
-					idx++;
-				}
-				return idx;
-			}
-			idx++;
-		}
-		return id.equals("additions") ? menuModel.getChildren().size() : -1; //$NON-NLS-1$
-	}
-
-	private ToolBar createToolbar(final MUIElement element,
-			Composite intermediate) {
+	private ToolBar createToolbar(final MUIElement element, Composite parent) {
 		int orientation = getOrientation(element);
-		RowLayout layout = RowLayoutFactory.fillDefaults().wrap(false)
-				.spacing(0).type(orientation).create();
-		layout.marginLeft = 3;
-		layout.center = true;
-		intermediate.setLayout(layout);
-		// new Label(intermediate, (orientation == SWT.HORIZONTAL ? SWT.VERTICAL
-		// : SWT.HORIZONTAL) | SWT.SEPARATOR);
 
-		ToolBar separatorToolBar = new ToolBar(intermediate, orientation
-				| SWT.WRAP | SWT.FLAT | SWT.RIGHT);
-		new ToolItem(separatorToolBar, SWT.SEPARATOR);
 		ToolBarManager manager = getManager((MToolBar) element);
 		if (manager == null) {
 			manager = new ToolBarManager(orientation | SWT.WRAP | SWT.FLAT
 					| SWT.RIGHT);
 			linkModelToManager((MToolBar) element, manager);
 		}
-		ToolBar bar = manager.createControl(intermediate);
+		ToolBar bar = manager.createControl(parent);
 		bar.setData(manager);
 		bar.getShell().layout(new Control[] { bar }, SWT.DEFER);
 		bar.addDisposeListener(new DisposeListener() {
@@ -443,22 +400,34 @@
 	 * @param element
 	 */
 	protected void cleanUp(MToolBar toolbarModel) {
-		for (ContributionRecord record : contributionRecords
-				.toArray(new ContributionRecord[contributionRecords.size()])) {
+		Collection<ToolBarContributionRecord> vals = modelContributionToRecord
+				.values();
+		for (ToolBarContributionRecord record : vals
+				.toArray(new ToolBarContributionRecord[vals.size()])) {
 			if (record.toolbarModel == toolbarModel) {
 				record.dispose();
-				contributionRecords.remove(record);
 				for (MToolBarElement copy : record.generatedElements) {
-					IContributionItem ici = modelToContribution.remove(copy);
-					if (ici != null) {
-						record.manager.remove(ici);
-					}
+					cleanUpCopy(record, copy);
+				}
+				for (MToolBarElement copy : record.sharedElements) {
+					cleanUpCopy(record, copy);
 				}
 				record.generatedElements.clear();
+				record.sharedElements.clear();
 			}
 		}
 	}
 
+	public void cleanUpCopy(ToolBarContributionRecord record,
+			MToolBarElement copy) {
+		modelContributionToRecord.remove(copy);
+		IContributionItem ici = getContribution(copy);
+		clearModelToContribution(copy, ici);
+		if (ici != null) {
+			record.getManagerForModel().remove(ici);
+		}
+	}
+
 	int getOrientation(final MUIElement element) {
 		MUIElement theParent = element.getParent();
 		if (theParent instanceof MTrimBar) {
@@ -503,14 +472,7 @@
 		parentManager.update(false);
 
 		ToolBar tb = getToolbarFrom(container.getWidget());
-		if (tb != null && ((EObject) container).eContainer() instanceof MPart) {
-			MPart part = (MPart) ((EObject) container).eContainer();
-			MMenu viewMenu = getViewMenu(part);
-
-			// View menu (if any)
-			if (viewMenu != null) {
-				addMenuButton(part, tb, viewMenu);
-			}
+		if (tb != null) {
 			tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
 		}
 	}
@@ -527,19 +489,19 @@
 			Composite intermediate = (Composite) widget;
 			if (!intermediate.isDisposed()) {
 				Control[] children = intermediate.getChildren();
-				int length = children.length;
-				if (length > 0 && children[length - 1] instanceof ToolBar) {
-					return (ToolBar) children[length - 1];
+				for (Control control : children) {
+					if (control.getData() instanceof ToolBarManager) {
+						return (ToolBar) control;
+					}
 				}
 			}
 		}
 		return null;
 	}
 
-	/**
-	 * @param tb
-	 */
-	private void addMenuButton(MPart part, ToolBar tb, MMenu menu) {
+	private void addMenuButton(MPart part, Composite intermediate, MMenu menu) {
+		ToolBar tb = new ToolBar(intermediate, SWT.FLAT | SWT.RIGHT);
+		tb.setData(TOOL_BAR_MANAGER_RENDERER_VIEW_MENU);
 		ToolItem ti = new ToolItem(tb, SWT.PUSH);
 		ti.setImage(getViewMenuImage());
 		ti.setHotImage(null);
@@ -564,10 +526,30 @@
 	protected void showMenu(ToolItem item) {
 		// Create the UI for the menu
 		final MMenu menuModel = (MMenu) item.getData("theMenu"); //$NON-NLS-1$
-		MPart part = (MPart) item.getData("thePart"); //$NON-NLS-1$
-		Control ctrl = (Control) part.getWidget();
-		Menu menu = (Menu) renderer.createGui(menuModel, ctrl.getShell(),
-				part.getContext());
+		Menu menu = null;
+		Object obj = menuModel.getWidget();
+		if (obj instanceof Menu) {
+			menu = (Menu) obj;
+		}
+		if (menu == null || menu.isDisposed()) {
+			MPart part = (MPart) item.getData("thePart"); //$NON-NLS-1$
+			Control ctrl = (Control) part.getWidget();
+			final Menu tmpMenu = (Menu) renderer.createGui(menuModel,
+					ctrl.getShell(), part.getContext());
+			menu = tmpMenu;
+			if (tmpMenu != null) {
+				ctrl.addDisposeListener(new DisposeListener() {
+					public void widgetDisposed(DisposeEvent e) {
+						if (!tmpMenu.isDisposed()) {
+							tmpMenu.dispose();
+						}
+					}
+				});
+			}
+		}
+		if (menu == null) {
+			return;
+		}
 
 		// ...and Show it...
 		Rectangle ib = item.getBounds();
@@ -580,7 +562,12 @@
 			if (!display.readAndDispatch())
 				display.sleep();
 		}
-		menu.dispose();
+		if (menu.getData() instanceof MenuManager) {
+			MenuManager manager = (MenuManager) menu.getData();
+			manager.dispose();
+		} else {
+			menu.dispose();
+		}
 	}
 
 	private Image getViewMenuImage() {
@@ -625,7 +612,7 @@
 		return viewMenuImage;
 	}
 
-	private MMenu getViewMenu(MPart part) {
+	MMenu getViewMenu(MPart part) {
 		if (part.getMenus() == null) {
 			return null;
 		}
@@ -653,36 +640,46 @@
 	@Override
 	public void postProcess(MUIElement element) {
 		super.postProcess(element);
-		// disposeToolbarIfNecessary(element);
+		disposeToolbarIfNecessary((MToolBar) element);
 		ToolBar tb = getToolbarFrom(element.getWidget());
 		if (tb != null && !tb.isDisposed()) {
-			tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
 			tb.setVisible(true);
+			tb.getShell().layout(new Control[] { tb }, SWT.DEFER);
 		}
 	}
 
-	public Object getUIContainer(MUIElement childElement) {
-		if (childElement.getWidget() instanceof ToolBar) {
-			return childElement.getWidget();
+	/**
+	 * @param element
+	 */
+	private void disposeToolbarIfNecessary(MToolBar element) {
+		ToolBar tb = getToolbarFrom(element.getWidget());
+		Composite parent = null;
+		if (tb != null) {
+			parent = tb.getParent();
 		}
-
-		Object obj = super.getUIContainer(childElement);
-		if (obj instanceof ToolBar) {
-			return obj;
+		boolean cleanUp = tb == null || tb.isDisposed();
+		if (!cleanUp) {
+			cleanUp = tb.getItemCount() == 0 || hasOnlySeparators(tb);
 		}
-
-		if (obj instanceof Composite) {
-			Composite intermediate = (Composite) obj;
-			if (intermediate == null || intermediate.isDisposed()) {
-				return null;
+		if (cleanUp) {
+			if (tb != null && !tb.isDisposed()) {
+				tb.dispose();
 			}
-			ToolBar toolbar = getToolbarFrom(intermediate);
-			if (toolbar == null) {
-				toolbar = createToolbar(childElement.getParent(), intermediate);
+			if (parent != null) {
+				for (Control child : parent.getChildren()) {
+					if (TOOL_BAR_MANAGER_RENDERER_DRAG_HANDLE.equals(child
+							.getData())) {
+						child.dispose();
+					} else if (TOOL_BAR_MANAGER_RENDERER_VIEW_MENU.equals(child
+							.getData()) && !needsViewMenu(element)) {
+						child.dispose();
+					}
+				}
+				if (parent.getChildren().length == 0) {
+					parent.dispose();
+				}
 			}
-			return toolbar;
 		}
-		return null;
 	}
 
 	@Override
@@ -721,6 +718,27 @@
 		}
 	}
 
+	public Object getUIContainer(MUIElement childElement) {
+		Composite intermediate = (Composite) super.getUIContainer(childElement);
+		if (intermediate == null || intermediate.isDisposed()) {
+			return null;
+		}
+		ToolBar toolbar = findToolbar(intermediate);
+		if (toolbar == null) {
+			toolbar = createToolbar(childElement.getParent(), intermediate);
+		}
+		return toolbar;
+	}
+
+	private ToolBar findToolbar(Composite intermediate) {
+		for (Control child : intermediate.getChildren()) {
+			if (child.getData() instanceof ToolBarManager) {
+				return (ToolBar) child;
+			}
+		}
+		return null;
+	}
+
 	/**
 	 * @param parentManager
 	 * @param childME
@@ -757,7 +775,8 @@
 				marker = new GroupMarker(itemModel.getElementId());
 			}
 		}
-		parentManager.add(marker);
+		addToManager(parentManager, itemModel, marker);
+		linkModelToContribution(itemModel, marker);
 	}
 
 	/**
@@ -770,8 +789,9 @@
 		ToolControlContribution ci = ContextInjectionFactory.make(
 				ToolControlContribution.class, lclContext);
 		ci.setModel(itemModel);
-		parentManager.add(ci);
-		modelToContribution.put(itemModel, ci);
+		ci.setVisible(itemModel.isVisible());
+		addToManager(parentManager, itemModel, ci);
+		linkModelToContribution(itemModel, ci);
 	}
 
 	/**
@@ -784,8 +804,9 @@
 		DirectContributionItem ci = ContextInjectionFactory.make(
 				DirectContributionItem.class, lclContext);
 		ci.setModel(itemModel);
-		parentManager.add(ci);
-		modelToContribution.put(itemModel, ci);
+		ci.setVisible(itemModel.isVisible());
+		addToManager(parentManager, itemModel, ci);
+		linkModelToContribution(itemModel, ci);
 	}
 
 	/**
@@ -794,12 +815,39 @@
 	 */
 	private void processHandledItem(ToolBarManager parentManager,
 			MHandledToolItem itemModel) {
+		IContributionItem ici = getContribution(itemModel);
+		if (ici != null) {
+			return;
+		}
 		final IEclipseContext lclContext = getContext(itemModel);
 		HandledContributionItem ci = ContextInjectionFactory.make(
 				HandledContributionItem.class, lclContext);
 		ci.setModel(itemModel);
-		parentManager.add(ci);
-		modelToContribution.put(itemModel, ci);
+		ci.setVisible(itemModel.isVisible());
+		addToManager(parentManager, itemModel, ci);
+		linkModelToContribution(itemModel, ci);
+	}
+
+	/**
+	 * @param parentManager
+	 * @param itemModel
+	 * @param ci
+	 */
+	private void addToManager(ToolBarManager parentManager,
+			MToolBarElement model, IContributionItem ci) {
+		MElementContainer<MUIElement> parent = model.getParent();
+		// technically this shouldn't happen
+		if (parent == null) {
+			parentManager.add(ci);
+		} else {
+			int index = parent.getChildren().indexOf(model);
+			// shouldn't be -1, but better safe than sorry
+			if (index > parentManager.getSize() || index == -1) {
+				parentManager.add(ci);
+			} else {
+				parentManager.insert(index, ci);
+			}
+		}
 	}
 
 	public ToolBarManager getManager(MToolBar model) {
@@ -823,4 +871,41 @@
 	public IContributionItem getContribution(MToolBarElement element) {
 		return modelToContribution.get(element);
 	}
+
+	public MToolBarElement getToolElement(IContributionItem item) {
+		return contributionToModel.get(item);
+	}
+
+	public void linkModelToContribution(MToolBarElement model,
+			IContributionItem item) {
+		modelToContribution.put(model, item);
+		contributionToModel.put(item, model);
+	}
+
+	public void clearModelToContribution(MToolBarElement model,
+			IContributionItem item) {
+		modelToContribution.remove(model);
+		contributionToModel.remove(item);
+	}
+
+	public ArrayList<ToolBarContributionRecord> getList(MToolBarElement item) {
+		ArrayList<ToolBarContributionRecord> tmp = sharedElementToRecord
+				.get(item);
+		if (tmp == null) {
+			tmp = new ArrayList<ToolBarContributionRecord>();
+			sharedElementToRecord.put(item, tmp);
+		}
+		return tmp;
+	}
+
+	public void linkElementToContributionRecord(MToolBarElement element,
+			ToolBarContributionRecord record) {
+		modelContributionToRecord.put(element, record);
+	}
+
+	public ToolBarContributionRecord getContributionRecord(
+			MToolBarElement element) {
+		return modelContributionToRecord.get(element);
+	}
+
 }
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
index 094661e..2eb48ff 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/TrimBarRenderer.java
@@ -26,6 +26,7 @@
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
 import org.eclipse.e4.ui.model.application.ui.menu.MTrimContribution;
+import org.eclipse.e4.ui.workbench.IPresentationEngine;
 import org.eclipse.e4.ui.workbench.modeling.ExpressionContext;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.events.DisposeEvent;
@@ -120,6 +121,7 @@
 		default:
 			return null;
 		}
+		processContents(trimModel);
 		result.addDisposeListener(new DisposeListener() {
 			public void widgetDisposed(DisposeEvent e) {
 				cleanUp(trimModel);
@@ -128,6 +130,19 @@
 		return result;
 	}
 
+	/**
+	 * @param trimModel
+	 */
+	private void processContents(MTrimBar trimModel) {
+		IEclipseContext ctx = getContext(trimModel);
+		ExpressionContext eContext = new ExpressionContext(ctx);
+		ArrayList<MTrimContribution> toContribute = new ArrayList<MTrimContribution>();
+		ContributionsAnalyzer.gatherTrimContributions(trimModel,
+				application.getTrimContributions(), trimModel.getElementId(),
+				toContribute, eContext);
+		addTrimContributions(trimModel, toContribute, ctx, eContext);
+	}
+
 	@Override
 	public void hideChild(MElementContainer<MUIElement> parentElement,
 			MUIElement child) {
@@ -145,19 +160,25 @@
 	 * (org.eclipse.e4.ui.model.application.MPart)
 	 */
 	@Override
-	public void processContents(MElementContainer<MUIElement> me) {
-		if (!(((MUIElement) me) instanceof MTrimBar))
+	public void processContents(MElementContainer<MUIElement> container) {
+		if (!(((MUIElement) container) instanceof MTrimBar))
 			return;
-		super.processContents(me);
-		IEclipseContext ctx = getContext(me);
-		ExpressionContext eContext = new ExpressionContext(ctx);
-		MElementContainer<?> trimObj = me;
-		MTrimBar trimModel = (MTrimBar) trimObj;
-		ArrayList<MTrimContribution> toContribute = new ArrayList<MTrimContribution>();
-		ContributionsAnalyzer.gatherTrimContributions(trimModel,
-				application.getTrimContributions(), trimModel.getElementId(),
-				toContribute, eContext);
-		addTrimContributions(trimModel, toContribute, ctx, eContext);
+
+		// Process any contents of the newly created ME
+		List<MUIElement> parts = container.getChildren();
+		if (parts != null) {
+			// loading a legacy app will add children to the window while it is
+			// being rendered.
+			// this is *not* the correct place for this
+			// hope that the ADD event will pick up the new part.
+			IPresentationEngine renderer = (IPresentationEngine) context
+					.get(IPresentationEngine.class.getName());
+			MUIElement[] plist = parts.toArray(new MUIElement[parts.size()]);
+			for (int i = 0; i < plist.length; i++) {
+				MUIElement childME = plist[i];
+				renderer.createGui(childME);
+			}
+		}
 	}
 
 	private void addTrimContributions(final MTrimBar trimModel,
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
index e59a869..88a8d1e 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/WorkbenchRendererFactory.java
@@ -20,15 +20,14 @@
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolControl;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
 import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
 
 public class WorkbenchRendererFactory implements IRendererFactory {
 
 	private AreaRenderer areaRenderer;
 	private MenuManagerRenderer menuRenderer;
-	private ToolBarRenderer toolbarRenderer;
-	private ToolItemRenderer toolItemRenderer;
+	private ToolBarManagerRenderer toolbarRenderer;
+	// private ToolItemRenderer toolItemRenderer;
 	private SeparatorRenderer separatorRenderer;
 	private ContributedPartRenderer contributedPartRenderer;
 	private ElementReferenceRenderer elementRefRenderer;
@@ -70,16 +69,10 @@
 			return renderedToolbarRenderer;
 		} else if (uiElement instanceof MToolBar) {
 			if (toolbarRenderer == null) {
-				toolbarRenderer = new ToolBarRenderer();
+				toolbarRenderer = new ToolBarManagerRenderer();
 				initRenderer(toolbarRenderer);
 			}
 			return toolbarRenderer;
-		} else if (uiElement instanceof MToolItem) {
-			if (toolItemRenderer == null) {
-				toolItemRenderer = new ToolItemRenderer();
-				initRenderer(toolItemRenderer);
-			}
-			return toolItemRenderer;
 		} else if (uiElement instanceof MMenuSeparator
 				|| uiElement instanceof MToolBarSeparator) {
 			if (separatorRenderer == null) {
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
index 18505de..97e2116 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/WorkbenchWindow.java
@@ -917,6 +917,7 @@
 			} else if (item instanceof AbstractGroupMarker) {
 				MToolBarSeparator separator = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 				separator.setToBeRendered(item.isVisible());
+				separator.setVisible(item.isVisible());
 				separator.setElementId(item.getId());
 				container.getChildren().add(separator);
 			} else if (item instanceof ActionContributionItem) {
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
index deb81ec..8e6694b 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p1/plugin.xml
@@ -67,6 +67,22 @@
                style="push">
          </command>
       </menuContribution>
+      <menuContribution
+            allPopups="false"
+            locationURI="toolbar:org.eclipse.ui.workbench.file?after=additions">
+         <command
+               commandId="org.eclipse.e4.ui.menu.tests.commandOne"
+               style="push">
+         </command>
+      </menuContribution>
+      <menuContribution
+            allPopups="false"
+            locationURI="toolbar:org.eclipse.ui.workbench.file?after=print.ext">
+         <command
+               commandId="org.eclipse.e4.ui.menu.tests.commandTwo"
+               style="push">
+         </command>
+      </menuContribution>
    </extension>
 
 </plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
index e7a03e9..8fda429 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p3/plugin.xml
@@ -131,4 +131,19 @@
 
 		</actionSet>
 	</extension>
+ <extension
+       point="org.eclipse.ui.actionSets">
+    <actionSet
+          id="org.eclipse.e4.ui.menu.tests.p3.toolSet"
+          label="ToolActionSet"
+          visible="true">
+       <action
+             class="org.eclipse.e4.ui.menu.tests.p3.TestActionDelegate"
+             id="org.eclipse.e4.ui.menu.tests.p3.toolAction1"
+             label="ToolActionOne"
+             style="push"
+             toolbarPath="org.eclipse.ui.workbench.file/save.group">
+       </action>
+    </actionSet>
+ </extension>
 </plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java b/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java
new file mode 100644
index 0000000..1a22771
--- /dev/null
+++ b/tests/org.eclipse.e4.ui.menu.tests.p3/src/org/eclipse/e4/ui/menu/tests/p3/TestActionDelegate.java
@@ -0,0 +1,12 @@
+package org.eclipse.e4.ui.menu.tests.p3;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.swt.widgets.Event;
+import org.eclipse.ui.actions.ActionDelegate;
+
+
+public class TestActionDelegate extends ActionDelegate {
+	@Override
+	public void runWithEvent(IAction action, Event event) {
+		System.out.println("runWithEvent");
+	}
+}
diff --git a/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml b/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
index 0f1c35b..9729a59 100644
--- a/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
+++ b/tests/org.eclipse.e4.ui.menu.tests.p4/plugin.xml
@@ -93,6 +93,32 @@
             </visibleWhen>
          </command>
       </menuContribution>
+      <menuContribution
+            allPopups="false"
+            locationURI="toolbar:org.eclipse.ui.workbench.file?after=print.ext">
+         <command
+               commandId="org.eclipse.e4.ui.menu.tests.commandOne"
+               id="p4.invisible.commandOne"
+               label="Invisible Command One"
+               style="push">
+            <visibleWhen
+                  checkEnabled="false">
+               <with
+                     variable="selection">
+                  <count
+                        value="1">
+                  </count>
+                  <iterate
+                        ifEmpty="false"
+                        operator="and">
+                     <equals
+                           value="show.p4.invisible.commandOne">
+                     </equals>
+                  </iterate>
+               </with>
+            </visibleWhen>
+         </command>
+      </menuContribution>
    </extension>
 
 </plugin>
diff --git a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
index 129b1f4..bdad8a9 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
+++ b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.core.prefs
@@ -1,5 +1,15 @@
-#Wed Jan 26 10:07:53 EST 2011
+#Tue Mar 01 09:23:04 EST 2011
 eclipse.preferences.version=1
+org.eclipse.jdt.core.codeComplete.argumentPrefixes=
+org.eclipse.jdt.core.codeComplete.argumentSuffixes=
+org.eclipse.jdt.core.codeComplete.fieldPrefixes=
+org.eclipse.jdt.core.codeComplete.fieldSuffixes=
+org.eclipse.jdt.core.codeComplete.localPrefixes=
+org.eclipse.jdt.core.codeComplete.localSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFieldSuffixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldPrefixes=
+org.eclipse.jdt.core.codeComplete.staticFinalFieldSuffixes=
 org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
 org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
 org.eclipse.jdt.core.compiler.compliance=1.6
diff --git a/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs
new file mode 100644
index 0000000..3a8980c
--- /dev/null
+++ b/tests/org.eclipse.e4.ui.menu.tests/.settings/org.eclipse.jdt.ui.prefs
@@ -0,0 +1,112 @@
+#Tue Mar 01 09:23:04 EST 2011
+cleanup.add_default_serial_version_id=true
+cleanup.add_generated_serial_version_id=false
+cleanup.add_missing_annotations=true
+cleanup.add_missing_deprecated_annotations=true
+cleanup.add_missing_methods=false
+cleanup.add_missing_nls_tags=false
+cleanup.add_missing_override_annotations=true
+cleanup.add_missing_override_annotations_interface_methods=true
+cleanup.add_serial_version_id=false
+cleanup.always_use_blocks=true
+cleanup.always_use_parentheses_in_expressions=false
+cleanup.always_use_this_for_non_static_field_access=false
+cleanup.always_use_this_for_non_static_method_access=false
+cleanup.convert_to_enhanced_for_loop=false
+cleanup.correct_indentation=false
+cleanup.format_source_code=false
+cleanup.format_source_code_changes_only=false
+cleanup.make_local_variable_final=true
+cleanup.make_parameters_final=false
+cleanup.make_private_fields_final=true
+cleanup.make_type_abstract_if_missing_method=false
+cleanup.make_variable_declarations_final=false
+cleanup.never_use_blocks=false
+cleanup.never_use_parentheses_in_expressions=true
+cleanup.organize_imports=false
+cleanup.qualify_static_field_accesses_with_declaring_class=false
+cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+cleanup.qualify_static_member_accesses_with_declaring_class=true
+cleanup.qualify_static_method_accesses_with_declaring_class=false
+cleanup.remove_private_constructors=true
+cleanup.remove_trailing_whitespaces=false
+cleanup.remove_trailing_whitespaces_all=true
+cleanup.remove_trailing_whitespaces_ignore_empty=false
+cleanup.remove_unnecessary_casts=true
+cleanup.remove_unnecessary_nls_tags=true
+cleanup.remove_unused_imports=true
+cleanup.remove_unused_local_variables=false
+cleanup.remove_unused_private_fields=true
+cleanup.remove_unused_private_members=false
+cleanup.remove_unused_private_methods=true
+cleanup.remove_unused_private_types=true
+cleanup.sort_members=false
+cleanup.sort_members_all=false
+cleanup.use_blocks=false
+cleanup.use_blocks_only_for_return_and_throw=false
+cleanup.use_parentheses_in_expressions=false
+cleanup.use_this_for_non_static_field_access=false
+cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+cleanup.use_this_for_non_static_method_access=false
+cleanup.use_this_for_non_static_method_access_only_if_necessary=true
+cleanup_profile=org.eclipse.jdt.ui.default.eclipse_clean_up_profile
+cleanup_settings_version=2
+eclipse.preferences.version=1
+editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
+org.eclipse.jdt.ui.exception.name=e
+org.eclipse.jdt.ui.gettersetter.use.is=true
+org.eclipse.jdt.ui.keywordthis=false
+org.eclipse.jdt.ui.overrideannotation=true
+sp_cleanup.add_default_serial_version_id=true
+sp_cleanup.add_generated_serial_version_id=false
+sp_cleanup.add_missing_annotations=true
+sp_cleanup.add_missing_deprecated_annotations=true
+sp_cleanup.add_missing_methods=false
+sp_cleanup.add_missing_nls_tags=false
+sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=true
+sp_cleanup.add_serial_version_id=false
+sp_cleanup.always_use_blocks=true
+sp_cleanup.always_use_parentheses_in_expressions=false
+sp_cleanup.always_use_this_for_non_static_field_access=false
+sp_cleanup.always_use_this_for_non_static_method_access=false
+sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.correct_indentation=false
+sp_cleanup.format_source_code=true
+sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.make_local_variable_final=false
+sp_cleanup.make_parameters_final=false
+sp_cleanup.make_private_fields_final=true
+sp_cleanup.make_type_abstract_if_missing_method=false
+sp_cleanup.make_variable_declarations_final=true
+sp_cleanup.never_use_blocks=false
+sp_cleanup.never_use_parentheses_in_expressions=true
+sp_cleanup.on_save_use_additional_actions=true
+sp_cleanup.organize_imports=true
+sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_through_subtypes_with_declaring_class=true
+sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
+sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
+sp_cleanup.remove_private_constructors=true
+sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_trailing_whitespaces_all=true
+sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
+sp_cleanup.remove_unnecessary_casts=true
+sp_cleanup.remove_unnecessary_nls_tags=false
+sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_local_variables=false
+sp_cleanup.remove_unused_private_fields=true
+sp_cleanup.remove_unused_private_members=false
+sp_cleanup.remove_unused_private_methods=true
+sp_cleanup.remove_unused_private_types=true
+sp_cleanup.sort_members=true
+sp_cleanup.sort_members_all=true
+sp_cleanup.use_blocks=false
+sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_parentheses_in_expressions=false
+sp_cleanup.use_this_for_non_static_field_access=false
+sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
+sp_cleanup.use_this_for_non_static_method_access=false
+sp_cleanup.use_this_for_non_static_method_access_only_if_necessary=true
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
index 000f4de..5e447ca 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/Activator.java
@@ -8,12 +8,21 @@
  */
 public class Activator extends AbstractUIPlugin {
 
+	// The shared instance
+	private static Activator plugin;
+
 	// The plug-in ID
 	public static final String PLUGIN_ID = "org.eclipse.e4.ui.menu.tests"; //$NON-NLS-1$
 
-	// The shared instance
-	private static Activator plugin;
-	
+	/**
+	 * Returns the shared instance
+	 * 
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
 	/**
 	 * The constructor
 	 */
@@ -22,7 +31,10 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 * 
+	 * @see
+	 * org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext
+	 * )
 	 */
 	public void start(BundleContext context) throws Exception {
 		super.start(context);
@@ -31,20 +43,14 @@
 
 	/*
 	 * (non-Javadoc)
-	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 * 
+	 * @see
+	 * org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext
+	 * )
 	 */
 	public void stop(BundleContext context) throws Exception {
 		plugin = null;
 		super.stop(context);
 	}
 
-	/**
-	 * Returns the shared instance
-	 *
-	 * @return the shared instance
-	 */
-	public static Activator getDefault() {
-		return plugin;
-	}
-
 }
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
index 19c24f0..2bb2e84 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/CmdService.java
@@ -22,26 +22,26 @@
 class CmdService implements ICommandService {
 
 	private Category category;
-	
+
 	@Inject
 	private CommandManager manager;
-	
+
 	@Override
 	public void addExecutionListener(IExecutionListener listener) {
 		// TODO Auto-generated method stub
-		
+
 	}
-	
+
 	@Override
 	public void defineUncategorizedCategory(String name, String description) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public ParameterizedCommand deserialize(
-			String serializedParameterizedCommand)
-			throws NotDefinedException, SerializationException {
+			String serializedParameterizedCommand) throws NotDefinedException,
+			SerializationException {
 		// TODO Auto-generated method stub
 		return null;
 	}
@@ -49,7 +49,7 @@
 	@Override
 	public void dispose() {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
@@ -97,15 +97,13 @@
 	}
 
 	@Override
-	public String getHelpContextId(Command command)
-			throws NotDefinedException {
+	public String getHelpContextId(Command command) throws NotDefinedException {
 		// TODO Auto-generated method stub
 		return null;
 	}
 
 	@Override
-	public String getHelpContextId(String commandId)
-			throws NotDefinedException {
+	public String getHelpContextId(String commandId) throws NotDefinedException {
 		// TODO Auto-generated method stub
 		return null;
 	}
@@ -124,19 +122,19 @@
 	@Override
 	public void readRegistry() {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void refreshElements(String commandId, Map filter) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void registerElement(IElementReference elementReference) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
@@ -150,19 +148,19 @@
 	@Override
 	public void removeExecutionListener(IExecutionListener listener) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void setHelpContextId(IHandler handler, String helpContextId) {
 		// TODO Auto-generated method stub
-		
+
 	}
 
 	@Override
 	public void unregisterElement(IElementReference elementReference) {
 		// TODO Auto-generated method stub
-		
+
 	}
-	
+
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
index 6c371aa..22b529d 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MMenuItemTest.java
@@ -1,74 +1,49 @@
 package org.eclipse.e4.ui.menu.tests;
 
-import java.net.MalformedURLException;
-import java.net.URL;
 import java.util.List;
 
 import junit.framework.TestCase;
 
-import org.eclipse.core.commands.contexts.Context;
 import org.eclipse.e4.core.commands.CommandServiceAddon;
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.core.services.events.IEventBroker;
 import org.eclipse.e4.ui.bindings.BindingServiceAddon;
 import org.eclipse.e4.ui.internal.workbench.E4Workbench;
-import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
 import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
 import org.eclipse.e4.ui.internal.workbench.swt.E4Application;
 import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
 import org.eclipse.e4.ui.model.application.MApplication;
-import org.eclipse.e4.ui.model.application.commands.MBindingContext;
 import org.eclipse.e4.ui.model.application.commands.MCommand;
 import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
 import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.MCoreExpression;
 import org.eclipse.e4.ui.model.application.ui.MElementContainer;
 import org.eclipse.e4.ui.model.application.ui.MUIElement;
-import org.eclipse.e4.ui.model.application.ui.MUILabel;
 import org.eclipse.e4.ui.model.application.ui.basic.MWindow;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.impl.UiFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
-import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
-import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
-import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
-import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenuItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
-import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
 import org.eclipse.e4.ui.services.ContextServiceAddon;
 import org.eclipse.e4.ui.services.EContextService;
-import org.eclipse.e4.ui.workbench.IResourceUtilities;
 import org.eclipse.e4.ui.workbench.renderers.swt.ContributionRecord;
 import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
 import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
-import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.equinox.log.Logger;
 import org.eclipse.jface.action.IContributionItem;
 import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.widgets.Display;
 import org.eclipse.swt.widgets.Event;
 import org.eclipse.swt.widgets.Menu;
 import org.eclipse.swt.widgets.MenuItem;
 import org.eclipse.swt.widgets.Shell;
 import org.eclipse.swt.widgets.Widget;
-import org.eclipse.ui.commands.ICommandImageService;
-import org.eclipse.ui.internal.commands.CommandImageManager;
-import org.eclipse.ui.internal.commands.CommandImageService;
 import org.eclipse.ui.internal.menus.MenuPersistence;
-import org.osgi.framework.ServiceReference;
 
 public class MMenuItemTest extends TestCase {
 
@@ -146,76 +121,6 @@
 		return (MenuManagerRenderer) renderer;
 	}
 
-	private void printContributions(MApplication application) {
-		for (MMenuContribution mc : application.getMenuContributions()) {
-			System.out.print("\n\nMC: " + mc.getParentId() + "?"
-					+ mc.getPositionInParent());
-			printMenuOut(1, mc);
-		}
-
-		for (MToolBarContribution tbc : application.getToolBarContributions()) {
-			System.out.print("\n\nTC: " + tbc.getParentId() + "?"
-					+ tbc.getPositionInParent());
-			printToolOut(1, tbc);
-		}
-	}
-
-	private void printIcon(int level, MUILabel item) {
-		printTabs(level + 2);
-		System.out.print("icon: " + item.getIconURI());
-	}
-
-	private void printMenuOut(int level,
-			MElementContainer<MMenuElement> container) {
-		for (MMenuElement child : container.getChildren()) {
-			printTabs(level);
-			System.out.print(child.getClass().getSimpleName() + ": "
-					+ child.getElementId());
-			if (child instanceof MMenu) {
-				printMenuOut(level + 1, (MElementContainer<MMenuElement>) child);
-			} else if (child instanceof MHandledMenuItem) {
-				System.out.print(": cmd "
-						+ ((MHandledMenuItem) child).getCommand()
-								.getElementId());
-				printIcon(level, (MUILabel) child);
-			} else if (child instanceof MDirectMenuItem) {
-				System.out.print(": cmd "
-						+ ((MDirectMenuItem) child).getContributionURI());
-				printIcon(level, (MUILabel) child);
-			} else if (child instanceof MMenuSeparator) {
-				System.out.print(": label "
-						+ ((MMenuSeparator) child).getLabel());
-			}
-		}
-	}
-
-	private void printTabs(int level) {
-		System.out.print("\n");
-		for (int i = 0; i < level; i++) {
-			System.out.print("   ");
-		}
-	}
-
-	private void printToolOut(int level, MToolBarContribution tbc) {
-		for (MToolBarElement child : tbc.getChildren()) {
-			printTabs(level);
-			System.out.print(child.getClass().getSimpleName() + ": "
-					+ child.getElementId());
-			if (child instanceof MDirectToolItem) {
-				System.out.print(": cmd "
-						+ ((MDirectToolItem) child).getContributionURI());
-				printIcon(level, (MUILabel) child);
-			} else if (child instanceof MHandledToolItem) {
-				System.out.print(": cmd "
-						+ ((MHandledToolItem) child).getCommand()
-								.getElementId());
-				printIcon(level, (MUILabel) child);
-			} else if (child instanceof MToolBarSeparator) {
-				System.out.print(": separator ");
-			}
-		}
-	}
-
 	@Override
 	protected void setUp() throws Exception {
 		appContext = E4Application.createDefaultContext();
@@ -408,7 +313,7 @@
 		MenuPersistence mp = new MenuPersistence(application, appContext,
 				"org.eclipse.e4.ui.menu.tests.p3");
 		mp.reRead();
-		printContributions(application);
+		// printContributions(application);
 
 		// render the main menu bar
 		Shell shell = new Shell();
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
index 4b57d82..14221f1 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/MToolItemTest.java
@@ -11,18 +11,30 @@
 import org.eclipse.e4.ui.internal.workbench.swt.PartRenderingEngine;
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.ui.model.application.ui.MUIElement;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
+import org.eclipse.e4.ui.model.application.ui.basic.MTrimElement;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.ItemType;
-import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
 import org.eclipse.e4.ui.services.ContextServiceAddon;
-import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
+import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.workbench.renderers.swt.DirectContributionItem;
+import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer;
+import org.eclipse.jface.action.IContributionItem;
+import org.eclipse.jface.action.ToolBarManager;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
+import org.eclipse.swt.widgets.Control;
 import org.eclipse.swt.widgets.Event;
+import org.eclipse.swt.widgets.Shell;
+import org.eclipse.swt.widgets.ToolBar;
 import org.eclipse.swt.widgets.ToolItem;
 import org.eclipse.ui.internal.menus.MenuPersistence;
 
@@ -30,6 +42,15 @@
 	protected IEclipseContext appContext;
 	protected E4Workbench wb;
 
+	private ToolBar getToolBar(Composite intermediate) {
+		for (Control child : intermediate.getChildren()) {
+			if (child.getData() instanceof ToolBarManager) {
+				return (ToolBar) child;
+			}
+		}
+		return null;
+	}
+
 	@Override
 	protected void setUp() throws Exception {
 		appContext = E4Application.createDefaultContext();
@@ -48,24 +69,286 @@
 		appContext.dispose();
 	}
 
-	public void testActionSetGeneration() throws Exception {
+	public void test01Children() throws Exception {
+		MToolBar toolbarModel = MenuFactoryImpl.eINSTANCE.createToolBar();
+		toolbarModel.setElementId("p2.tb1");
+
+		MToolBar toolbarModel2 = MenuFactoryImpl.eINSTANCE.createToolBar();
+		toolbarModel2.setElementId("p2.tb2");
+
+		MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE
+				.createToolBarSeparator();
+		sep.setElementId("additions");
+		toolbarModel.getChildren().add(sep);
+		assertEquals(1, toolbarModel.getChildren().size());
+		assertEquals(0, toolbarModel2.getChildren().size());
+
+		toolbarModel2.getChildren().addAll(toolbarModel.getChildren());
+		assertEquals(0, toolbarModel.getChildren().size());
+		assertEquals(1, toolbarModel2.getChildren().size());
+	}
+
+	public void testActionSetAddedToFile() throws Exception {
 		MApplication application = TestUtil.setupRenderer(appContext);
-//		MenuManagerRenderer renderer = appContext
-//				.get(MenuManagerRenderer.class);
-		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(0);
+		// MenuManagerRenderer renderer = appContext
+		// .get(MenuManagerRenderer.class);
+		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+				0);
 		MTrimBar coolbar = window.getTrimBars().get(0);
 		assertNotNull(coolbar);
-		
 
 		// setup structure for actionSet test
 		TestUtil.setupActionBuilderStructure(coolbar);
 
+		MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+		assertEquals(5, coolbar.getChildren().size());
+
+		// read in the relevant extensions.
+		MenuPersistence mp = new MenuPersistence(application, appContext,
+				"org.eclipse.e4.ui.menu.tests.p3");
+		mp.reRead();
+
+		ToolBarManagerRenderer renderer = appContext
+				.get(ToolBarManagerRenderer.class);
+		Shell shell = new Shell();
+		Composite parent = new Composite(shell, SWT.NONE);
+		Composite intermediate = (Composite) renderer
+				.createWidget(file, parent);
+
+		ToolBar toolbar = getToolBar(intermediate);
+		assertNotNull(toolbar);
+		Object obj = file;
+		renderer.processContents((MElementContainer<MUIElement>) obj);
+
+		ToolBarManager tbm = renderer.getManager(file);
+		assertNotNull(tbm);
+
+		IContributionItem[] tbItems = tbm.getItems();
+		assertEquals(12, tbItems.length);
+
+		IContributionItem actionSetAction = tbItems[2];
+		assertEquals("org.eclipse.e4.ui.menu.tests.p3.toolAction1",
+				actionSetAction.getId());
+		assertFalse(actionSetAction.isVisible());
+
+		IEclipseContext windowContext = window.getContext();
+		EContextService ecs = windowContext.get(EContextService.class);
+		ecs.activateContext("org.eclipse.e4.ui.menu.tests.p3.toolSet");
+		assertTrue(actionSetAction.isVisible());
+
+		ecs.deactivateContext("org.eclipse.e4.ui.menu.tests.p3.toolSet");
+		assertFalse(actionSetAction.isVisible());
+	}
+
+	public void testActionSetAddedToMyToolbar() throws Exception {
+		MApplication application = TestUtil.setupRenderer(appContext);
+		// MenuManagerRenderer renderer = appContext
+		// .get(MenuManagerRenderer.class);
+		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+				0);
+		MTrimBar coolbar = window.getTrimBars().get(0);
+		assertNotNull(coolbar);
+
+		// setup structure for actionSet test
+		TestUtil.setupActionBuilderStructure(coolbar);
+
+		int idx = 0;
+		for (MTrimElement child : coolbar.getChildren()) {
+			if (child.getElementId().equals("additions")) {
+				break;
+			}
+			idx++;
+		}
+
+		MToolBar toolbarModel = MenuFactoryImpl.eINSTANCE.createToolBar();
+		toolbarModel.setElementId("p2.tb1");
+		coolbar.getChildren().add(idx, toolbarModel);
+
 		// read in the relevant extensions.
 		MenuPersistence mp = new MenuPersistence(application, appContext,
 				"org.eclipse.e4.ui.menu.tests.p2");
 		mp.reRead();
-		
-		assertEquals(7, application.getToolBarContributions().size());
+
+		TestUtil.printContributions(application);
+
+		ToolBarManagerRenderer renderer = appContext
+				.get(ToolBarManagerRenderer.class);
+		Shell shell = new Shell();
+		Composite parent = new Composite(shell, SWT.NONE);
+		Composite intermediate = (Composite) renderer.createWidget(
+				toolbarModel, parent);
+
+		ToolBar toolbar = getToolBar(intermediate);
+		assertNotNull(toolbar);
+		Object obj = toolbarModel;
+		renderer.processContents((MElementContainer<MUIElement>) obj);
+
+		ToolBarManager tbm = renderer.getManager(toolbarModel);
+		assertNotNull(tbm);
+
+		IContributionItem[] tbItems = tbm.getItems();
+		assertEquals(7, tbItems.length);
+
+		assertEquals("group2", tbItems[0].getId());
+		assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb5", tbItems[1].getId());
+		assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb4", tbItems[2].getId());
+		assertEquals("group1", tbItems[3].getId());
+		assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb3", tbItems[4].getId());
+		assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb2", tbItems[5].getId());
+		assertEquals("org.eclipse.e4.ui.menu.tests.p2.tb1", tbItems[6].getId());
+	}
+
+	public void testFileItemContributionVisibility() throws Exception {
+		MApplication application = TestUtil.setupRenderer(appContext);
+		// MenuManagerRenderer renderer = appContext
+		// .get(MenuManagerRenderer.class);
+		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+				0);
+		MTrimBar coolbar = window.getTrimBars().get(0);
+		assertNotNull(coolbar);
+
+		// setup structure for actionSet test
+		TestUtil.setupActionBuilderStructure(coolbar);
+
+		MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+		assertEquals(5, coolbar.getChildren().size());
+
+		// read in the relevant extensions.
+		MenuPersistence mp = new MenuPersistence(application, appContext,
+				"org.eclipse.e4.ui.menu.tests.p4");
+		mp.reRead();
+
+		ToolBarManagerRenderer renderer = appContext
+				.get(ToolBarManagerRenderer.class);
+		Shell shell = new Shell();
+		Composite parent = new Composite(shell, SWT.NONE);
+		Composite intermediate = (Composite) renderer
+				.createWidget(file, parent);
+
+		ToolBar toolbar = getToolBar(intermediate);
+		assertNotNull(toolbar);
+		Object obj = file;
+		renderer.processContents((MElementContainer<MUIElement>) obj);
+
+		ToolBarManager tbm = renderer.getManager(file);
+		assertNotNull(tbm);
+
+		IContributionItem[] tbItems = tbm.getItems();
+		assertEquals(12, tbItems.length);
+		IContributionItem p4InvOne = tbItems[8];
+		assertEquals("p4.invisible.commandOne", p4InvOne.getId());
+		assertFalse(p4InvOne.isVisible());
+
+		IEclipseContext context = window.getContext();
+
+		context.set("selection", new StructuredSelection(
+				"show.p4.invisible.commandOne"));
+
+		assertTrue(p4InvOne.isVisible());
+
+		context.set("selection", new StructuredSelection(
+				new Object[] { "show.p4.invisible.commandOne",
+						"show.p4.invisible.commandOne" }));
+		assertFalse(p4InvOne.isVisible());
+
+		context.set("selection", new StructuredSelection(
+				"show.p4.invisible.commandOne"));
+		assertTrue(p4InvOne.isVisible());
+
+		context.set("selection", new StructuredSelection(
+				"hide.p4.invisible.commandOne"));
+		assertFalse(p4InvOne.isVisible());
+		context.set("selection", new StructuredSelection(
+				"show.p4.invisible.commandOne"));
+		assertTrue(p4InvOne.isVisible());
+
+		context.remove("selection");
+		assertFalse(p4InvOne.isVisible());
+	}
+
+	public void testFileItemGeneration() throws Exception {
+		MApplication application = TestUtil.setupRenderer(appContext);
+		// MenuManagerRenderer renderer = appContext
+		// .get(MenuManagerRenderer.class);
+		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+				0);
+		MTrimBar coolbar = window.getTrimBars().get(0);
+		assertNotNull(coolbar);
+
+		// setup structure for actionSet test
+		TestUtil.setupActionBuilderStructure(coolbar);
+
+		MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+		assertEquals(5, coolbar.getChildren().size());
+
+		// read in the relevant extensions.
+		MenuPersistence mp = new MenuPersistence(application, appContext,
+				"org.eclipse.e4.ui.menu.tests.p1");
+		mp.reRead();
+
+		ToolBarManagerRenderer renderer = appContext
+				.get(ToolBarManagerRenderer.class);
+		Shell shell = new Shell();
+		Composite parent = new Composite(shell, SWT.NONE);
+		Composite intermediate = (Composite) renderer
+				.createWidget(file, parent);
+
+		ToolBar toolbar = getToolBar(intermediate);
+		assertNotNull(toolbar);
+		Object obj = file;
+		renderer.processContents((MElementContainer<MUIElement>) obj);
+
+		ToolBarManager tbm = renderer.getManager(file);
+		assertNotNull(tbm);
+
+		assertEquals(13, tbm.getItems().length);
+		IContributionItem saveAll = tbm.find("saveAll");
+		assertNotNull(saveAll);
+		assertTrue(saveAll instanceof DirectContributionItem);
+
+		IContributionItem cmdTwo = tbm.getItems()[8];
+		assertEquals("org.eclipse.e4.ui.menu.tests.commandTwo", cmdTwo.getId());
+
+		IContributionItem cmdOne = tbm.getItems()[12];
+		assertEquals("org.eclipse.e4.ui.menu.tests.commandOne", cmdOne.getId());
+	}
+
+	public void testFileToolbarRendered() throws Exception {
+		MApplication application = TestUtil.setupRenderer(appContext);
+		// MenuManagerRenderer renderer = appContext
+		// .get(MenuManagerRenderer.class);
+		MTrimmedWindow window = (MTrimmedWindow) application.getChildren().get(
+				0);
+		MTrimBar coolbar = window.getTrimBars().get(0);
+		assertNotNull(coolbar);
+
+		// setup structure for actionSet test
+		TestUtil.setupActionBuilderStructure(coolbar);
+
+		MToolBar file = (MToolBar) coolbar.getChildren().get(1);
+		assertEquals(5, coolbar.getChildren().size());
+
+		// read in the relevant extensions.
+
+		ToolBarManagerRenderer renderer = appContext
+				.get(ToolBarManagerRenderer.class);
+		Shell shell = new Shell();
+		Composite parent = new Composite(shell, SWT.NONE);
+		Composite intermediate = (Composite) renderer
+				.createWidget(file, parent);
+
+		ToolBar toolbar = getToolBar(intermediate);
+		assertNotNull(toolbar);
+		Object obj = file;
+		renderer.processContents((MElementContainer<MUIElement>) obj);
+
+		ToolBarManager tbm = renderer.getManager(file);
+		assertNotNull(tbm);
+
+		assertEquals(11, tbm.getItems().length);
+		IContributionItem saveAll = tbm.find("saveAll");
+		assertNotNull(saveAll);
+		assertTrue(saveAll instanceof DirectContributionItem);
 	}
 
 	public void testMToolItem_RadioItems() {
diff --git a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
index d520070..f01ba49 100644
--- a/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
+++ b/tests/org.eclipse.e4.ui.menu.tests/src/org/eclipse/e4/ui/menu/tests/TestUtil.java
@@ -9,24 +9,35 @@
 import org.eclipse.e4.ui.internal.workbench.UIEventPublisher;
 import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.MApplicationElement;
 import org.eclipse.e4.ui.model.application.commands.MBindingContext;
 import org.eclipse.e4.ui.model.application.commands.impl.CommandsFactoryImpl;
 import org.eclipse.e4.ui.model.application.impl.ApplicationFactoryImpl;
+import org.eclipse.e4.ui.model.application.ui.MElementContainer;
 import org.eclipse.e4.ui.model.application.ui.MUIElement;
+import org.eclipse.e4.ui.model.application.ui.MUILabel;
 import org.eclipse.e4.ui.model.application.ui.SideValue;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimBar;
 import org.eclipse.e4.ui.model.application.ui.basic.MTrimmedWindow;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicFactoryImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.MDirectMenuItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MDirectToolItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledMenuItem;
+import org.eclipse.e4.ui.model.application.ui.menu.MHandledToolItem;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MMenuElement;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenuSeparator;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBar;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarContribution;
+import org.eclipse.e4.ui.model.application.ui.menu.MToolBarElement;
 import org.eclipse.e4.ui.model.application.ui.menu.MToolBarSeparator;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
 import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.workbench.IPresentationEngine;
 import org.eclipse.e4.ui.workbench.IResourceUtilities;
 import org.eclipse.e4.ui.workbench.renderers.swt.MenuManagerRenderer;
+import org.eclipse.e4.ui.workbench.renderers.swt.ToolBarManagerRenderer;
 import org.eclipse.e4.ui.workbench.swt.factories.IRendererFactory;
 import org.eclipse.e4.ui.workbench.swt.util.ISWTResourceUtilities;
 import org.eclipse.emf.common.notify.Notifier;
@@ -43,38 +54,107 @@
 class TestUtil {
 	public static final String ORG_ECLIPSE_UI_CONTEXTS_ACTION_SET = "org.eclipse.ui.contexts.actionSet";
 
+	public static void printContributions(MApplication application) {
+		for (MMenuContribution mc : application.getMenuContributions()) {
+			System.out.print("\n\nMC: " + mc.getParentId() + "?"
+					+ mc.getPositionInParent());
+			printMenuOut(1, mc);
+		}
+
+		for (MToolBarContribution tbc : application.getToolBarContributions()) {
+			System.out.print("\n\nTC: " + tbc.getParentId() + "?"
+					+ tbc.getPositionInParent());
+			printToolOut(1, tbc);
+		}
+	}
+
+	public static void printIcon(int level, MUILabel item) {
+		printTabs(level + 2);
+		System.out.print("icon: " + item.getIconURI());
+	}
+
+	public static void printMenuOut(int level,
+			MElementContainer<MMenuElement> container) {
+		for (MMenuElement child : container.getChildren()) {
+			printTabs(level);
+			System.out.print(child.getClass().getSimpleName() + ": "
+					+ child.getElementId());
+			if (child instanceof MMenu) {
+				printMenuOut(level + 1, (MElementContainer<MMenuElement>) child);
+			} else if (child instanceof MHandledMenuItem) {
+				System.out.print(": cmd "
+						+ ((MHandledMenuItem) child).getCommand()
+								.getElementId());
+				printIcon(level, child);
+			} else if (child instanceof MDirectMenuItem) {
+				System.out.print(": cmd "
+						+ ((MDirectMenuItem) child).getContributionURI());
+				printIcon(level, child);
+			} else if (child instanceof MMenuSeparator) {
+				System.out.print(": label "
+						+ ((MMenuSeparator) child).getLabel());
+			}
+		}
+	}
+
+	public static void printTabs(int level) {
+		System.out.print("\n");
+		for (int i = 0; i < level; i++) {
+			System.out.print("   ");
+		}
+	}
+
+	public static void printToolOut(int level, MToolBarContribution tbc) {
+		for (MToolBarElement child : tbc.getChildren()) {
+			printTabs(level);
+			System.out.print(child.getClass().getSimpleName() + ": "
+					+ child.getElementId());
+			if (child instanceof MDirectToolItem) {
+				System.out.print(": cmd "
+						+ ((MDirectToolItem) child).getContributionURI());
+				printIcon(level, (MUILabel) child);
+			} else if (child instanceof MHandledToolItem) {
+				System.out.print(": cmd "
+						+ ((MHandledToolItem) child).getCommand()
+								.getElementId());
+				printIcon(level, (MUILabel) child);
+			} else if (child instanceof MToolBarSeparator) {
+				System.out.print(": separator ");
+			}
+		}
+	}
+
 	public static void setupActionBuilderStructure(MMenu menuBar) {
 		MMenu file = MenuFactoryImpl.eINSTANCE.createMenu();
 		file.setElementId("file");
 		file.setLabel("&File");
 		menuBar.getChildren().add(file);
-		
+
 		MDirectMenuItem item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("refresh");
 		item.setLabel("Re&fresh");
 		file.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("exit");
 		item.setLabel("&Exit");
 		file.getChildren().add(item);
-		
+
 		MMenu edit = MenuFactoryImpl.eINSTANCE.createMenu();
 		edit.setElementId("edit");
 		edit.setLabel("&Edit");
 		menuBar.getChildren().add(edit);
-		
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("cut");
 		item.setLabel("Cu&t");
 		edit.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("copy");
 		item.setLabel("&Copy");
 		edit.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("paste");
 		item.setLabel("&Paste");
@@ -84,42 +164,43 @@
 		sep.setElementId("copy.ext");
 		sep.setVisible(false);
 		edit.getChildren().add(sep);
-		
+
 		sep = MenuFactoryImpl.eINSTANCE.createMenuSeparator();
 		sep.setElementId("additions");
 		sep.setVisible(false);
 		menuBar.getChildren().add(sep);
-		
+
 		MMenu window = MenuFactoryImpl.eINSTANCE.createMenu();
 		window.setElementId("window");
 		window.setLabel("&Window");
 		menuBar.getChildren().add(window);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("newWindow");
 		item.setLabel("&New Window");
 		window.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectMenuItem();
 		item.setElementId("preferences");
 		item.setLabel("&Preferences");
 		window.getChildren().add(item);
 	}
-	
+
 	public static void setupActionBuilderStructure(MTrimBar coolbar) {
 		MToolBar groupFile = MenuFactoryImpl.eINSTANCE.createToolBar();
 		groupFile.setElementId("group.file");
 		groupFile.setVisible(false);
-		
+
 		coolbar.getChildren().add(groupFile);
-		
+
 		MToolBar fileToolBar = MenuFactoryImpl.eINSTANCE.createToolBar();
 		fileToolBar.setElementId(IWorkbenchActionConstants.TOOLBAR_FILE);
-		
-		MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
+
+		MToolBarSeparator sep = MenuFactoryImpl.eINSTANCE
+				.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.NEW_GROUP);
 		fileToolBar.getChildren().add(sep);
-        //fileToolBar.add(newWizardDropDownAction);
+		// fileToolBar.add(newWizardDropDownAction);
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.SAVE_GROUP);
 		sep.setVisible(false);
@@ -128,27 +209,27 @@
 		sep.setElementId(IWorkbenchActionConstants.NEW_EXT);
 		sep.setVisible(false);
 		fileToolBar.getChildren().add(sep);
-		
+
 		MDirectToolItem item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 		item.setElementId("save");
 		item.setLabel("S&ave");
 		fileToolBar.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 		item.setElementId("saveAll");
 		item.setLabel("Sa&ve All");
 		fileToolBar.getChildren().add(item);
-		
+
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.SAVE_EXT);
 		sep.setVisible(false);
 		fileToolBar.getChildren().add(sep);
-        
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 		item.setElementId("print");
 		item.setLabel("&Print");
 		fileToolBar.getChildren().add(item);
-        
+
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.PRINT_EXT);
 		sep.setVisible(false);
@@ -163,65 +244,66 @@
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
 		fileToolBar.getChildren().add(sep);
-		
-        coolbar.getChildren().add(fileToolBar);
-        
-        MToolBar add = MenuFactoryImpl.eINSTANCE.createToolBar();
-        add.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
-        add.setVisible(false);
-		
+
+		coolbar.getChildren().add(fileToolBar);
+
+		MToolBar add = MenuFactoryImpl.eINSTANCE.createToolBar();
+		add.setElementId(IWorkbenchActionConstants.MB_ADDITIONS);
+		add.setVisible(false);
+
 		coolbar.getChildren().add(add);
-		
+
 		MToolBar groupNav = MenuFactoryImpl.eINSTANCE.createToolBar();
 		groupNav.setElementId("group.nav");
 		groupNav.setVisible(false);
-		
+
 		coolbar.getChildren().add(groupNav);
-		
-		
+
 		MToolBar navToolBar = MenuFactoryImpl.eINSTANCE.createToolBar();
 		navToolBar.setElementId(IWorkbenchActionConstants.TOOLBAR_NAVIGATE);
-		
+
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.HISTORY_GROUP);
 		navToolBar.getChildren().add(sep);
-		
+
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.GROUP_APP);
 		sep.setVisible(false);
 		navToolBar.getChildren().add(sep);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 		item.setElementId("backwardHistory");
 		item.setLabel("Backward");
 		navToolBar.getChildren().add(item);
-		
+
 		item = MenuFactoryImpl.eINSTANCE.createDirectToolItem();
 		item.setElementId("forwardHistory");
 		item.setLabel("Forward");
 		navToolBar.getChildren().add(item);
-		
+
 		sep = MenuFactoryImpl.eINSTANCE.createToolBarSeparator();
 		sep.setElementId(IWorkbenchActionConstants.PIN_GROUP);
 		navToolBar.getChildren().add(sep);
-        
-        coolbar.getChildren().add(navToolBar);
+
+		coolbar.getChildren().add(navToolBar);
 	}
 
 	public static void setupCommandImageService(IEclipseContext ctx) {
 		CmdService cs = ContextInjectionFactory.make(CmdService.class, ctx);
-		CommandImageService service = new CommandImageService(new CommandImageManager(), cs);
+		CommandImageService service = new CommandImageService(
+				new CommandImageManager(), cs);
 		service.readRegistry();
 		ctx.set(ICommandImageService.class, service);
 	}
-	
+
 	public static MApplication setupRenderer(IEclipseContext appContext) {
 		MApplication application = ApplicationFactoryImpl.eINSTANCE
 				.createApplication();
 		application.setContext(appContext);
 		appContext.set(MApplication.class, application);
-		
-		MBindingContext rootContext = CommandsFactoryImpl.eINSTANCE.createBindingContext();
+
+		MBindingContext rootContext = CommandsFactoryImpl.eINSTANCE
+				.createBindingContext();
 		rootContext.setElementId(ORG_ECLIPSE_UI_CONTEXTS_ACTION_SET);
 		rootContext.setName("ActionSets");
 		application.getRootContext().add(rootContext);
@@ -234,12 +316,13 @@
 		TestUtil.setupRendererServices(appContext);
 
 		TestUtil.setupCommandImageService(appContext);
-		MTrimmedWindow window = BasicFactoryImpl.eINSTANCE.createTrimmedWindow();
+		MTrimmedWindow window = BasicFactoryImpl.eINSTANCE
+				.createTrimmedWindow();
 		window.setContext(appContext.createChild("MWindowContext"));
 		MMenu menuBar = MenuFactoryImpl.eINSTANCE.createMenu();
 		menuBar.setElementId("org.eclipse.ui.main.menu");
 		window.setMainMenu(menuBar);
-		
+
 		MTrimBar coolbar = BasicFactoryImpl.eINSTANCE.createTrimBar();
 		coolbar.setElementId("org.eclipse.ui.main.toolbar");
 		coolbar.setSide(SideValue.TOP);
@@ -248,27 +331,34 @@
 		application.getChildren().add(window);
 		application.setSelectedElement(window);
 		window.getContext().activate();
-		
+
 		Display display = Display.getDefault();
 		appContext.set(Display.class, display);
-		
-		final MenuManagerRenderer renderer = new MenuManagerRenderer();
+
+		final MenuManagerRenderer menuRenderer = new MenuManagerRenderer();
+		final ToolBarManagerRenderer tbRenderer = new ToolBarManagerRenderer();
 		appContext.set(IRendererFactory.class, new IRendererFactory() {
 			@Override
-			public AbstractPartRenderer getRenderer(MUIElement uiElement, Object parent) {
-				return renderer;
+			public AbstractPartRenderer getRenderer(MUIElement uiElement,
+					Object parent) {
+				if (uiElement instanceof MMenu) {
+					return menuRenderer;
+				} else if (uiElement instanceof MToolBar) {
+					return tbRenderer;
+				}
+				return null;
 			}
 		});
-		renderer.init(appContext);
-		ContextInjectionFactory.inject(renderer, appContext);
+		menuRenderer.init(appContext);
+		ContextInjectionFactory.inject(menuRenderer, appContext);
+		tbRenderer.init(appContext);
+		ContextInjectionFactory.inject(tbRenderer, appContext);
 
 		((Notifier) application).eAdapters().add(
 				new UIEventPublisher(appContext));
 		return application;
 	}
 
-	
-
 	public static void setupRendererServices(IEclipseContext appContext) {
 		appContext.set(Logger.class, new Logger() {
 
@@ -287,52 +377,89 @@
 			@Override
 			public void log(int level, String message) {
 				// TODO Auto-generated method stub
-				
+
 			}
 
 			@Override
 			public void log(int level, String message, Throwable exception) {
 				// TODO Auto-generated method stub
-				
+
 			}
 
 			@Override
 			public void log(Object context, int level, String message) {
 				// TODO Auto-generated method stub
-				
+
 			}
 
 			@Override
 			public void log(Object context, int level, String message,
 					Throwable exception) {
 				// TODO Auto-generated method stub
-				
+
 			}
 
 			@Override
 			public void log(ServiceReference<?> sr, int level, String message) {
 				// TODO Auto-generated method stub
-				
+
 			}
 
 			@Override
 			public void log(ServiceReference<?> sr, int level, String message,
 					Throwable exception) {
 				// TODO Auto-generated method stub
-				
-			}});
+
+			}
+		});
 		appContext.set(IResourceUtilities.class, new ISWTResourceUtilities() {
 
 			@Override
 			public ImageDescriptor imageDescriptorFromURI(URI iconPath) {
 				try {
-					return ImageDescriptor.createFromURL(new URL(iconPath.toString()));
+					return ImageDescriptor.createFromURL(new URL(iconPath
+							.toString()));
 				} catch (MalformedURLException e) {
 					// TODO Auto-generated catch block
 					e.printStackTrace();
 				}
 				return null;
-			} });
+			}
+		});
+		appContext.set(IPresentationEngine.class, new IPresentationEngine() {
+
+			@Override
+			public Object createGui(MUIElement element) {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public Object createGui(MUIElement element, Object parentWidget,
+					IEclipseContext parentContext) {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public void removeGui(MUIElement element) {
+				// TODO Auto-generated method stub
+
+			}
+
+			@Override
+			public Object run(MApplicationElement uiRoot,
+					IEclipseContext appContext) {
+				// TODO Auto-generated method stub
+				return null;
+			}
+
+			@Override
+			public void stop() {
+				// TODO Auto-generated method stub
+
+			}
+		});
 	}
 
 	private TestUtil() {