Bug 330699 -  [Compatibility] Toolbar drop downs do not appear
diff --git a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
index a0c79a2..de8ebf5 100644
--- a/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
+++ b/bundles/org.eclipse.e4.ui.workbench.renderers.swt/src/org/eclipse/e4/ui/workbench/renderers/swt/ToolItemRenderer.java
@@ -23,6 +23,7 @@
 import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.commands.EHandlerService;
 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.Execute;
 import org.eclipse.e4.core.services.contributions.IContributionFactory;
@@ -31,6 +32,7 @@
 import org.eclipse.e4.ui.bindings.EBindingService;
 import org.eclipse.e4.ui.internal.workbench.Activator;
 import org.eclipse.e4.ui.internal.workbench.Policy;
+import org.eclipse.e4.ui.internal.workbench.swt.AbstractPartRenderer;
 import org.eclipse.e4.ui.model.application.MContribution;
 import org.eclipse.e4.ui.model.application.commands.MParameter;
 import org.eclipse.e4.ui.model.application.ui.MElementContainer;
@@ -40,11 +42,14 @@
 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.IPresentationEngine;
 import org.eclipse.e4.ui.workbench.UIEvents;
+import org.eclipse.jface.action.IMenuCreator;
 import org.eclipse.jface.bindings.TriggerSequence;
 import org.eclipse.swt.SWT;
+import org.eclipse.swt.events.DisposeEvent;
+import org.eclipse.swt.events.DisposeListener;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.events.SelectionListener;
@@ -68,9 +73,6 @@
 	@Inject
 	IEventBroker eventBroker;
 
-	@Inject
-	private IPresentationEngine engine;
-
 	private EventHandler itemUpdater = new EventHandler() {
 		public void handleEvent(Event event) {
 			// Ensure that this event is for a MToolItem
@@ -304,8 +306,7 @@
 					ti.addSelectionListener(new SelectionAdapter() {
 						public void widgetSelected(SelectionEvent e) {
 							if (e.detail == SWT.ARROW) {
-								Menu menu = (Menu) engine.createGui(mmenu, ti
-										.getParent().getShell(), null);
+								Menu menu = getMenu(mmenu, ti);
 
 								Rectangle itemBounds = ti.getBounds();
 								Point displayAt = ti.getParent().toDisplay(
@@ -421,4 +422,43 @@
 			});
 		}
 	}
+
+	/**
+	 * @param mmenu
+	 * @param shell
+	 * @return
+	 */
+	protected Menu getMenu(MMenu mmenu, ToolItem toolItem) {
+		Object obj = mmenu.getWidget();
+		if (obj instanceof Menu) {
+			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();
+							}
+						}
+					});
+					mmenu.setWidget(menu);
+					menu.setData(AbstractPartRenderer.OWNING_ME, menu);
+					return menu;
+				}
+			}
+		}
+		return null;
+	}
 }
diff --git a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
index d936a0e..a6554ae 100644
--- a/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
+++ b/bundles/org.eclipse.ui.workbench/Eclipse UI/org/eclipse/ui/internal/menus/MenuHelper.java
@@ -507,54 +507,62 @@
 			MRenderedMenu menu = MenuFactoryImpl.eINSTANCE.createRenderedMenu();
 			ECommandService cs = app.getContext().get(ECommandService.class);
 			final ParameterizedCommand parmCmd = cs.createCommand(cmdId, null);
-			menu.setContributionManager(new IMenuCreator() {
-				private ActionDelegateHandlerProxy handlerProxy;
+			IContextFunction generator = new ContextFunction() {
+				@Override
+				public Object compute(IEclipseContext context) {
+					return new IMenuCreator() {
+						private ActionDelegateHandlerProxy handlerProxy;
 
-				private ActionDelegateHandlerProxy getProxy() {
-					if (handlerProxy == null) {
-						handlerProxy = new ActionDelegateHandlerProxy(element,
-								IWorkbenchRegistryConstants.ATT_CLASS, id, parmCmd, PlatformUI
+						private ActionDelegateHandlerProxy getProxy() {
+							if (handlerProxy == null) {
+								handlerProxy = new ActionDelegateHandlerProxy(element,
+										IWorkbenchRegistryConstants.ATT_CLASS, id, parmCmd,
+										PlatformUI
 										.getWorkbench().getActiveWorkbenchWindow(), null, null,
-								null);
-					}
-					return handlerProxy;
-				}
+ null);
+							}
+							return handlerProxy;
+						}
 
-				private IWorkbenchWindowPulldownDelegate getDelegate() {
-					getProxy();
-					if (handlerProxy == null) {
-						return null;
-					}
-					if (handlerProxy.getDelegate() == null) {
-						handlerProxy.loadDelegate();
+						private IWorkbenchWindowPulldownDelegate getDelegate() {
+							getProxy();
+							if (handlerProxy == null) {
+								return null;
+							}
+							if (handlerProxy.getDelegate() == null) {
+								handlerProxy.loadDelegate();
 
-						ISelectionService service = PlatformUI.getWorkbench()
-								.getActiveWorkbenchWindow().getSelectionService();
-						IActionDelegate delegate = handlerProxy.getDelegate();
-						delegate.selectionChanged(handlerProxy.getAction(), service.getSelection());
-					}
-					return (IWorkbenchWindowPulldownDelegate) handlerProxy.getDelegate();
-				}
+								ISelectionService service = PlatformUI.getWorkbench()
+										.getActiveWorkbenchWindow().getSelectionService();
+								IActionDelegate delegate = handlerProxy.getDelegate();
+								delegate.selectionChanged(handlerProxy.getAction(),
+										service.getSelection());
+							}
+							return (IWorkbenchWindowPulldownDelegate) handlerProxy.getDelegate();
+						}
 
-				public Menu getMenu(Menu parent) {
-					IWorkbenchWindowPulldownDelegate2 delegate = (IWorkbenchWindowPulldownDelegate2) getDelegate();
-					if (delegate == null) {
-						return null;
-					}
-					return delegate.getMenu(parent);
-				}
+						public Menu getMenu(Menu parent) {
+							IWorkbenchWindowPulldownDelegate2 delegate = (IWorkbenchWindowPulldownDelegate2) getDelegate();
+							if (delegate == null) {
+								return null;
+							}
+							return delegate.getMenu(parent);
+						}
 
-				public Menu getMenu(Control parent) {
-					return getDelegate() == null ? null : getDelegate().getMenu(parent);
-				}
+						public Menu getMenu(Control parent) {
+							return getDelegate() == null ? null : getDelegate().getMenu(parent);
+						}
 
-				public void dispose() {
-					if (handlerProxy != null) {
-						handlerProxy.dispose();
-						handlerProxy = null;
-					}
+						public void dispose() {
+							if (handlerProxy != null) {
+								handlerProxy.dispose();
+								handlerProxy = null;
+							}
+						}
+					};
 				}
-			});
+			};
+			menu.setContributionManager(generator);
 			item.setMenu(menu);
 		} else {
 			item.setType(ItemType.PUSH);