Merge remote-tracking branch 'origin/master'
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
index e4991d9..e835583 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.java
@@ -623,4 +623,5 @@
 	public String VWindowSharedElementsEditor_Area;
 	public String ModelEditor_ExtractFragment;
 	public String ModelEditor_ExtractFragment_NoParentId;
+	public String KeyBindingEditor_SequenceLowercase;
 }
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
index 8ac1069..34ecbf8 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/Messages.properties
@@ -623,4 +623,5 @@
 Special_UnknownElement_Detail= Use an extension point!
 VWindowSharedElementsEditor_Area=Area
 ModelEditor_ExtractFragment=Extract into a fragment
-ModelEditor_ExtractFragment_NoParentId=Can not extract because parent container has no id. \nAdd an id and try again.
\ No newline at end of file
+ModelEditor_ExtractFragment_NoParentId=Can not extract because parent container has no id. \nAdd an id and try again.
+KeyBindingEditor_SequenceLowercase=Key sequences should be specified in uppercase characters
\ No newline at end of file
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java
index 88532de..9337dd6 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/KeyBindingEditor.java
@@ -359,6 +359,10 @@
 					if (keySequence.isEmpty()) {
 						return new Status(statusCode, "org.eclipse.e4.tools.emf.ui", Messages.KeyBindingEditor_SequenceEmpty); //$NON-NLS-1$
 					}
+					if (!value.toString().toUpperCase().equals(value.toString())) {
+						return new Status(IStatus.ERROR, "org.eclipse.e4.tools.emf.ui", Messages.KeyBindingEditor_SequenceLowercase); //$NON-NLS-1$ 
+					}
+
 					return Status.OK_STATUS;
 				} catch (Exception e) {
 					return new Status(statusCode, "org.eclipse.e4.tools.emf.ui", e.getMessage(), e); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
index e0e8e86..d14fca0 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/MenuContributionEditor.java
@@ -7,10 +7,13 @@
  *
  * Contributors:
  *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ *     Marco Descher <marco@descher.at> - https://bugs.eclipse.org/397650
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.component;
 
+import java.util.ArrayList;
 import java.util.List;
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
@@ -37,6 +40,7 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.swt.IWidgetValueProperty;
 import org.eclipse.jface.databinding.swt.WidgetProperties;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
@@ -66,6 +70,7 @@
 
 	private IListProperty ELEMENT_CONTAINER__CHILDREN = EMFProperties.list(UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN);
 	private EStackLayout stackLayout;
+	private List<Action> actions = new ArrayList<Action>();
 
 	private static class Struct {
 		private final String label;
@@ -84,6 +89,34 @@
 		super();
 	}
 
+	@PostConstruct
+	void init() {
+		actions.add(new Action(Messages.MenuEditor_AddHandledMenuItem, createImageDescriptor(ResourceProvider.IMG_HandledMenuItem)) {
+			@Override
+			public void run() {
+				handleAdd(MenuPackageImpl.Literals.HANDLED_MENU_ITEM, false);
+			}
+		});
+		actions.add(new Action(Messages.MenuEditor_AddMenu, createImageDescriptor(ResourceProvider.IMG_Menu)) {
+			@Override
+			public void run() {
+				handleAdd(MenuPackageImpl.Literals.MENU, false);
+			}
+		});
+		actions.add(new Action(Messages.MenuEditor_AddDirectMenuItem, createImageDescriptor(ResourceProvider.IMG_DirectMenuItem)) {
+			@Override
+			public void run() {
+				handleAdd(MenuPackageImpl.Literals.DIRECT_MENU_ITEM, false);
+			}
+		});
+		actions.add(new Action(Messages.MenuEditor_AddSeparator, createImageDescriptor(ResourceProvider.IMG_MenuSeparator)) {
+			@Override
+			public void run() {
+				handleAdd(MenuPackageImpl.Literals.MENU_SEPARATOR, true);
+			}
+		});
+	}
+
 	@Override
 	public Image getImage(Object element, Display display) {
 		if (element instanceof MUIElement) {
@@ -327,4 +360,24 @@
 	public FeaturePath[] getLabelProperties() {
 		return new FeaturePath[] { FeaturePath.fromList(UiPackageImpl.Literals.UI_ELEMENT__TO_BE_RENDERED) };
 	}
+
+	protected void handleAdd(EClass eClass, boolean separator) {
+		MMenuElement eObject = (MMenuElement) EcoreUtil.create(eClass);
+		setElementId(eObject);
+		Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN, eObject);
+
+		if (cmd.canExecute()) {
+			getEditingDomain().getCommandStack().execute(cmd);
+			if (!separator) {
+				getEditor().setSelection(eObject);
+			}
+		}
+	}
+
+	@Override
+	public List<Action> getActions(Object element) {
+		ArrayList<Action> l = new ArrayList<Action>(super.getActions(element));
+		l.addAll(actions);
+		return l;
+	}
 }
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelFragmentsEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelFragmentsEditor.java
index 9984e58..f4bd088 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelFragmentsEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ModelFragmentsEditor.java
@@ -35,7 +35,9 @@
 import org.eclipse.emf.databinding.IEMFListProperty;
 import org.eclipse.emf.ecore.EClass;
 import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
+import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.MoveCommand;
 import org.eclipse.emf.edit.command.RemoveCommand;
@@ -117,8 +119,7 @@
 		{
 
 			Composite fragCompo = new Composite(parent, SWT.NONE);
-			fragCompo.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, false, 2, 1));
-			fragCompo.setLayout(new GridLayout());
+			fragCompo.setLayoutData(new GridData(GridData.FILL, GridData.FILL, true, true, 3, 1));
 			GridLayout fragCompoLayout = new GridLayout(1, false);
 			fragCompoLayout.marginLeft = 0;
 			fragCompoLayout.marginRight = 0;
@@ -129,8 +130,7 @@
 			final TableViewer viewer = new TableViewer(fragCompo);
 			viewer.setContentProvider(new ObservableListContentProvider());
 			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.heightHint = 200;
+			GridData gd = new GridData(GridData.FILL_BOTH);
 			viewer.getControl().setLayoutData(gd);
 
 			IEMFListProperty prop = EMFProperties.list(FragmentPackageImpl.Literals.MODEL_FRAGMENTS__FRAGMENTS);
@@ -138,7 +138,7 @@
 
 			Composite buttonComp = new Composite(parent, SWT.NONE);
 			buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-			GridLayout gl = new GridLayout();
+			GridLayout gl = new GridLayout(4, false);
 			gl.marginLeft = 0;
 			gl.marginRight = 0;
 			gl.marginWidth = 0;
@@ -250,7 +250,7 @@
 			ControlFactory.createXMIId(parent, this);
 		}
 
-		ViewerElement tableElement = ViewerElement.create(context, parent, FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, this);
+		final ViewerElement tableElement = ViewerElement.create(context, parent, this);
 		tableElement.getViewer().setContentProvider(new ObservableListContentProvider());
 		tableElement.getViewer().setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
@@ -271,6 +271,80 @@
 			}
 		});
 
+		tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				EClass eClass = ((FeatureClass) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement()).eClass;
+				EObject eObject = EcoreUtil.create(eClass);
+
+				Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, eObject);
+
+				if (cmd.canExecute()) {
+					getEditingDomain().getCommandStack().execute(cmd);
+					getEditor().setSelection(eObject);
+				}
+			}
+		});
+
+		tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					List<?> elements = ((IStructuredSelection) tableElement.getViewer().getSelection()).toList();
+
+					Command cmd = RemoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, elements);
+					if (cmd.canExecute()) {
+						getEditingDomain().getCommandStack().execute(cmd);
+					}
+				}
+			}
+		});
+
+		tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+					if (s.size() == 1) {
+						Object obj = s.getFirstElement();
+						MModelFragments container = (MModelFragments) getMaster().getValue();
+						int idx = container.getImports().indexOf(obj) + 1;
+						if (idx < container.getImports().size()) {
+							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, obj, idx);
+
+							if (cmd.canExecute()) {
+								getEditingDomain().getCommandStack().execute(cmd);
+								tableElement.getViewer().setSelection(new StructuredSelection(obj));
+							}
+						}
+
+					}
+				}
+			}
+		});
+
+		tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+					if (s.size() == 1) {
+						Object obj = s.getFirstElement();
+						MModelFragments container = (MModelFragments) getMaster().getValue();
+						int idx = container.getImports().indexOf(obj) - 1;
+						if (idx >= 0) {
+							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, obj, idx);
+
+							if (cmd.canExecute()) {
+								getEditingDomain().getCommandStack().execute(cmd);
+								tableElement.getViewer().setSelection(new StructuredSelection(obj));
+							}
+						}
+					}
+				}
+			}
+		});
+
 		List<FeatureClass> list = new ArrayList<FeatureClass>();
 		Util.addClasses(ApplicationPackageImpl.eINSTANCE, list);
 		list.addAll(getEditor().getFeatureClasses(FragmentPackageImpl.Literals.MODEL_FRAGMENT, FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS));
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/StringModelFragment.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/StringModelFragment.java
index 7215a53..0ec25be 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/StringModelFragment.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/StringModelFragment.java
@@ -15,6 +15,7 @@
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.property.list.IListProperty;
+import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.IEditorFeature.FeatureClass;
 import org.eclipse.e4.tools.emf.ui.common.Util;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
@@ -23,6 +24,7 @@
 import org.eclipse.e4.tools.emf.ui.internal.common.component.ControlFactory.TextPasteHandler;
 import org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs.FeatureSelectionDialog;
 import org.eclipse.e4.tools.emf.ui.internal.common.component.dialogs.FindParentReferenceElementDialog;
+import org.eclipse.e4.tools.emf.ui.internal.common.uistructure.ViewerElement;
 import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
 import org.eclipse.e4.ui.model.fragment.MModelFragment;
 import org.eclipse.e4.ui.model.fragment.MStringModelFragment;
@@ -42,11 +44,9 @@
 import org.eclipse.jface.databinding.swt.WidgetProperties;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.swt.SWT;
@@ -70,6 +70,9 @@
 	private IListProperty MODEL_FRAGMENT__ELEMENTS = EMFProperties.list(FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS);
 
 	@Inject
+	IEclipseContext eclipseContext;
+
+	@Inject
 	public StringModelFragment() {
 		super();
 	}
@@ -188,94 +191,22 @@
 
 		// ------------------------------------------------------------
 		{
-			Label l = new Label(parent, SWT.NONE);
-			l.setText(Messages.StringModelFragment_Elements);
-			l.setLayoutData(new GridData(GridData.END, GridData.BEGINNING, false, false));
 
-			final TableViewer viewer = new TableViewer(parent);
-			viewer.setContentProvider(new ObservableListContentProvider());
-			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
-			GridData gd = new GridData(GridData.FILL_HORIZONTAL);
-			gd.heightHint = 300;
-			viewer.getControl().setLayoutData(gd);
+			final ViewerElement tableElement = ViewerElement.create(eclipseContext, parent, this);
 
-			IEMFListProperty prop = EMFProperties.list(FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS);
-			viewer.setInput(prop.observeDetail(getMaster()));
+			tableElement.getViewer().setContentProvider(new ObservableListContentProvider());
+			tableElement.getViewer().setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
-			Composite buttonComp = new Composite(parent, SWT.NONE);
-			buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-			GridLayout gl = new GridLayout(2, false);
-			gl.marginLeft = 0;
-			gl.marginRight = 0;
-			gl.marginWidth = 0;
-			gl.marginHeight = 0;
-			buttonComp.setLayout(gl);
-
-			Button b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Up);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_up));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-						if (s.size() == 1) {
-							Object obj = s.getFirstElement();
-							MModelFragment container = (MModelFragment) getMaster().getValue();
-							int idx = container.getElements().indexOf(obj) - 1;
-							if (idx >= 0) {
-								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, obj, idx);
-
-								if (cmd.canExecute()) {
-									getEditingDomain().getCommandStack().execute(cmd);
-									viewer.setSelection(new StructuredSelection(obj));
-								}
-							}
-
-						}
-					}
-				}
-			});
-
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Down);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_down));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-						if (s.size() == 1) {
-							Object obj = s.getFirstElement();
-							MModelFragment container = (MModelFragment) getMaster().getValue();
-							int idx = container.getElements().indexOf(obj) + 1;
-							if (idx < container.getElements().size()) {
-								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, obj, idx);
-
-								if (cmd.canExecute()) {
-									getEditingDomain().getCommandStack().execute(cmd);
-									viewer.setSelection(new StructuredSelection(obj));
-								}
-							}
-
-						}
-					}
-				}
-			});
-
-			final ComboViewer childrenDropDown = new ComboViewer(buttonComp);
-			childrenDropDown.getControl().setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-			childrenDropDown.setContentProvider(new ArrayContentProvider());
-			childrenDropDown.setLabelProvider(new LabelProvider() {
+			tableElement.getDropDown().setContentProvider(new ArrayContentProvider());
+			tableElement.getDropDown().setLabelProvider(new LabelProvider() {
 				@Override
 				public String getText(Object element) {
 					FeatureClass eclass = (FeatureClass) element;
 					return eclass.label;
 				}
 			});
-			childrenDropDown.setComparator(new ViewerComparator() {
+
+			tableElement.getDropDown().setComparator(new ViewerComparator() {
 				@Override
 				public int compare(Viewer viewer, Object e1, Object e2) {
 					FeatureClass eClass1 = (FeatureClass) e1;
@@ -284,21 +215,28 @@
 				}
 			});
 
-			List<FeatureClass> list = new ArrayList<FeatureClass>();
-			Util.addClasses(ApplicationPackageImpl.eINSTANCE, list);
-			list.addAll(getEditor().getFeatureClasses(FragmentPackageImpl.Literals.MODEL_FRAGMENT, FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS));
+			tableElement.getDropDown().setContentProvider(new ArrayContentProvider());
+			tableElement.getDropDown().setLabelProvider(new LabelProvider() {
+				@Override
+				public String getText(Object element) {
+					FeatureClass eclass = (FeatureClass) element;
+					return eclass.label;
+				}
+			});
 
-			childrenDropDown.setInput(list);
-			childrenDropDown.getCombo().select(0);
+			tableElement.getDropDown().setComparator(new ViewerComparator() {
+				@Override
+				public int compare(Viewer viewer, Object e1, Object e2) {
+					FeatureClass eClass1 = (FeatureClass) e1;
+					FeatureClass eClass2 = (FeatureClass) e2;
+					return eClass1.label.compareTo(eClass2.label);
+				}
+			});
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_add));
-			b.setText(Messages.ModelTooling_Common_AddEllipsis);
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
-					EClass eClass = ((FeatureClass) ((IStructuredSelection) childrenDropDown.getSelection()).getFirstElement()).eClass;
+					EClass eClass = ((FeatureClass) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement()).eClass;
 					EObject eObject = EcoreUtil.create(eClass);
 					setElementId(eObject);
 					Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, eObject);
@@ -310,15 +248,11 @@
 				}
 			});
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Remove);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_delete));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						List<?> elements = ((IStructuredSelection) viewer.getSelection()).toList();
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						List<?> elements = ((IStructuredSelection) tableElement.getViewer().getSelection()).toList();
 
 						Command cmd = RemoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, elements);
 						if (cmd.canExecute()) {
@@ -327,6 +261,61 @@
 					}
 				}
 			});
+
+			tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+						if (s.size() == 1) {
+							Object obj = s.getFirstElement();
+							MModelFragment container = (MModelFragment) getMaster().getValue();
+							int idx = container.getElements().indexOf(obj) + 1;
+							if (idx < container.getElements().size()) {
+								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, obj, idx);
+
+								if (cmd.canExecute()) {
+									getEditingDomain().getCommandStack().execute(cmd);
+									tableElement.getViewer().setSelection(new StructuredSelection(obj));
+								}
+							}
+						}
+					}
+				}
+			});
+
+			tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+						if (s.size() == 1) {
+							Object obj = s.getFirstElement();
+							MModelFragment container = (MModelFragment) getMaster().getValue();
+							int idx = container.getElements().indexOf(obj) - 1;
+							if (idx >= 0) {
+								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS, obj, idx);
+
+								if (cmd.canExecute()) {
+									getEditingDomain().getCommandStack().execute(cmd);
+									tableElement.getViewer().setSelection(new StructuredSelection(obj));
+								}
+							}
+						}
+					}
+				}
+			});
+
+			List<FeatureClass> list = new ArrayList<FeatureClass>();
+			Util.addClasses(ApplicationPackageImpl.eINSTANCE, list);
+			list.addAll(getEditor().getFeatureClasses(FragmentPackageImpl.Literals.MODEL_FRAGMENT, FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS));
+
+			tableElement.getDropDown().setInput(list);
+			tableElement.getDropDown().getCombo().select(0);
+
+			IEMFListProperty prop = EMFProperties.list(FragmentPackageImpl.Literals.MODEL_FRAGMENT__ELEMENTS);
+			tableElement.getViewer().setInput(prop.observeDetail(getMaster()));
+
 		}
 
 		folder.setSelection(0);
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolBarContributionEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolBarContributionEditor.java
index 8798078..2c16a0a 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolBarContributionEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/ToolBarContributionEditor.java
@@ -7,10 +7,13 @@
  *
  * Contributors:
  *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ *     Marco Descher <marco@descher.at> - https://bugs.eclipse.org/397650
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.component;
 
+import java.util.ArrayList;
 import java.util.List;
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
@@ -40,6 +43,7 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.swt.IWidgetValueProperty;
 import org.eclipse.jface.databinding.swt.WidgetProperties;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
@@ -70,6 +74,7 @@
 
 	private IListProperty ELEMENT_CONTAINER__CHILDREN = EMFProperties.list(UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN);
 	private EStackLayout stackLayout;
+	private List<Action> actions = new ArrayList<Action>();
 
 	@Inject
 	@Optional
@@ -92,6 +97,34 @@
 		super();
 	}
 
+	@PostConstruct
+	void init() {
+		actions.add(new Action(Messages.ToolBarEditor_AddHandledToolItem, createImageDescriptor(ResourceProvider.IMG_HandledToolItem)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.HANDLED_TOOL_ITEM, false);
+			}
+		});
+		actions.add(new Action(Messages.ToolBarEditor_AddDirectToolItem, createImageDescriptor(ResourceProvider.IMG_DirectToolItem)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.DIRECT_TOOL_ITEM, false);
+			}
+		});
+		actions.add(new Action(Messages.ToolBarEditor_AddToolControl, createImageDescriptor(ResourceProvider.IMG_ToolControl)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.TOOL_CONTROL, false);
+			}
+		});
+		actions.add(new Action(Messages.ToolBarEditor_AddToolBarSeparator, createImageDescriptor(ResourceProvider.IMG_ToolBarSeparator)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.TOOL_BAR_SEPARATOR, true);
+			}
+		});
+	}
+
 	@Override
 	public Image getImage(Object element, Display display) {
 		if (element instanceof MUIElement) {
@@ -353,4 +386,25 @@
 	public FeaturePath[] getLabelProperties() {
 		return new FeaturePath[] { FeaturePath.fromList(UiPackageImpl.Literals.UI_ELEMENT__TO_BE_RENDERED) };
 	}
+
+	@Override
+	public List<Action> getActions(Object element) {
+		ArrayList<Action> l = new ArrayList<Action>(super.getActions(element));
+		l.addAll(actions);
+		return l;
+	}
+
+	protected void handleAddChild(EClass eClass, boolean separator) {
+		MToolBarElement eObject = (MToolBarElement) EcoreUtil.create(eClass);
+		setElementId(eObject);
+
+		Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN, eObject);
+
+		if (cmd.canExecute()) {
+			getEditingDomain().getCommandStack().execute(cmd);
+			if (!separator) {
+				getEditor().setSelection(eObject);
+			}
+		}
+	}
 }
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/TrimContributionEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/TrimContributionEditor.java
index ab9254f..5c56b50 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/TrimContributionEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/TrimContributionEditor.java
@@ -7,10 +7,13 @@
  *
  * Contributors:
  *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ *     Marco Descher <marco@descher.at> - https://bugs.eclipse.org/397650
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.component;
 
+import java.util.ArrayList;
 import java.util.List;
+import javax.annotation.PostConstruct;
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
@@ -39,6 +42,7 @@
 import org.eclipse.emf.ecore.util.EcoreUtil;
 import org.eclipse.emf.edit.command.AddCommand;
 import org.eclipse.emf.edit.command.RemoveCommand;
+import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.swt.IWidgetValueProperty;
 import org.eclipse.jface.databinding.swt.WidgetProperties;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
@@ -69,6 +73,7 @@
 
 	private IListProperty ELEMENT_CONTAINER__CHILDREN = EMFProperties.list(UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN);
 	private EStackLayout stackLayout;
+	private List<Action> actions = new ArrayList<Action>();
 
 	@Inject
 	@Optional
@@ -79,6 +84,22 @@
 		super();
 	}
 
+	@PostConstruct
+	void init() {
+		actions.add(new Action(Messages.TrimBarEditor_AddToolBar, createImageDescriptor(ResourceProvider.IMG_ToolBar)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.TOOL_BAR);
+			}
+		});
+		actions.add(new Action(Messages.TrimBarEditor_AddToolControl, createImageDescriptor(ResourceProvider.IMG_ToolControl)) {
+			@Override
+			public void run() {
+				handleAddChild(MenuPackageImpl.Literals.TOOL_CONTROL);
+			}
+		});
+	}
+
 	@Override
 	public Image getImage(Object element, Display display) {
 		if (element instanceof MUIElement) {
@@ -329,4 +350,23 @@
 	public FeaturePath[] getLabelProperties() {
 		return new FeaturePath[] { FeaturePath.fromList(UiPackageImpl.Literals.UI_ELEMENT__TO_BE_RENDERED) };
 	}
+
+	protected void handleAddChild(EClass eClass) {
+		EObject toolbar = EcoreUtil.create(eClass);
+		setElementId(toolbar);
+
+		Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN, toolbar);
+
+		if (cmd.canExecute()) {
+			getEditingDomain().getCommandStack().execute(cmd);
+			getEditor().setSelection(toolbar);
+		}
+	}
+
+	@Override
+	public List<Action> getActions(Object element) {
+		ArrayList<Action> l = new ArrayList<Action>(super.getActions(element));
+		l.addAll(actions);
+		return l;
+	}
 }
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VMenuEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VMenuEditor.java
index 77ee666..2f4fc4d 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VMenuEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VMenuEditor.java
@@ -13,13 +13,15 @@
 import java.util.ArrayList;
 import java.util.List;
 import javax.annotation.PostConstruct;
+import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
 import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.ComponentLabelProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.VirtualEntry;
-import org.eclipse.e4.ui.model.application.commands.impl.CommandsPackageImpl;
+import org.eclipse.e4.tools.emf.ui.internal.common.uistructure.ViewerElement;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicPackageImpl;
 import org.eclipse.e4.ui.model.application.ui.menu.MMenu;
 import org.eclipse.e4.ui.model.application.ui.menu.impl.MenuFactoryImpl;
@@ -36,30 +38,29 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
 public class VMenuEditor extends AbstractComponentEditor {
 	private Composite composite;
 	private EMFDataBindingContext context;
-	private TableViewer viewer;
+	private StructuredViewer viewer;
 	private List<Action> actions = new ArrayList<Action>();
 	private EStructuralFeature feature;
 
+	@Inject
+	IEclipseContext eclipseContext;
+
 	public static final String VIEW_MENU_TAG = "ViewMenu"; //$NON-NLS-1$
 
 	enum Types {
@@ -134,27 +135,12 @@
 		parent = createScrollableContainer(folder);
 		item.setControl(parent.getParent());
 
-		viewer = new TableViewer(parent);
-		ObservableListContentProvider cp = new ObservableListContentProvider();
-		viewer.setContentProvider(cp);
-		GridData gd = new GridData(GridData.FILL_BOTH);
-		viewer.getControl().setLayoutData(gd);
+		final ViewerElement tableElement = ViewerElement.create(eclipseContext, parent, this);
+		viewer = tableElement.getViewer();
+		viewer.setContentProvider(new ObservableListContentProvider());
 		viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
-		Composite buttonComp = new Composite(parent, SWT.NONE);
-		buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-		GridLayout gl = new GridLayout(2, false);
-		gl.marginLeft = 0;
-		gl.marginRight = 0;
-		gl.marginWidth = 0;
-		gl.marginHeight = 0;
-		buttonComp.setLayout(gl);
-
-		Button b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Up);
-		b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_up));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-		b.addSelectionListener(new SelectionAdapter() {
+		tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
 				if (!viewer.getSelection().isEmpty()) {
@@ -177,11 +163,7 @@
 			}
 		});
 
-		b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Down);
-		b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_down));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-		b.addSelectionListener(new SelectionAdapter() {
+		tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
 				if (!viewer.getSelection().isEmpty()) {
@@ -192,7 +174,7 @@
 						List<?> list = (List<?>) container.eGet(feature);
 						int idx = list.indexOf(obj) + 1;
 						if (idx < list.size()) {
-							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), CommandsPackageImpl.Literals.HANDLER_CONTAINER__HANDLERS, obj, idx);
+							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), feature, obj, idx);
 
 							if (cmd.canExecute()) {
 								getEditingDomain().getCommandStack().execute(cmd);
@@ -205,10 +187,8 @@
 			}
 		});
 
-		final ComboViewer childrenDropDown = new ComboViewer(buttonComp);
-		childrenDropDown.getControl().setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		childrenDropDown.setContentProvider(new ArrayContentProvider());
-		childrenDropDown.setLabelProvider(new LabelProvider() {
+		tableElement.getDropDown().setContentProvider(new ArrayContentProvider());
+		tableElement.getDropDown().setLabelProvider(new LabelProvider() {
 			@Override
 			public String getText(Object element) {
 				if (element == Types.MENU) {
@@ -219,17 +199,13 @@
 				return Messages.MenuEditor_Label_ViewMenu;
 			}
 		});
-		childrenDropDown.setInput(Types.values());
-		childrenDropDown.setSelection(new StructuredSelection(Types.MENU));
+		tableElement.getDropDown().setInput(Types.values());
+		tableElement.getDropDown().setSelection(new StructuredSelection(Types.MENU));
 
-		b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-		b.setImage(createImage(ResourceProvider.IMG_Obj16_table_add));
-		b.setText(Messages.ModelTooling_Common_AddEllipsis);
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-		b.addSelectionListener(new SelectionAdapter() {
+		tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
-				Types t = (Types) ((IStructuredSelection) childrenDropDown.getSelection()).getFirstElement();
+				Types t = (Types) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement();
 				if (t == Types.MENU) {
 					handleAdd(MenuPackageImpl.Literals.MENU);
 				} else if (t == Types.POPUP_MENU) {
@@ -240,11 +216,7 @@
 			}
 		});
 
-		b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Remove);
-		b.setImage(createImage(ResourceProvider.IMG_Obj16_table_delete));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-		b.addSelectionListener(new SelectionAdapter() {
+		tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
 			@Override
 			public void widgetSelected(SelectionEvent e) {
 				if (!viewer.getSelection().isEmpty()) {
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelFragmentsEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelFragmentsEditor.java
index 516e7f2..d5aa32a 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelFragmentsEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelFragmentsEditor.java
@@ -115,11 +115,12 @@
 			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
 			GridData gd = new GridData(GridData.FILL_BOTH);
+			gd.horizontalSpan = 3;
 			viewer.getControl().setLayoutData(gd);
 
 			Composite buttonComp = new Composite(parent, SWT.NONE);
 			buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-			GridLayout gl = new GridLayout(2, false);
+			GridLayout gl = new GridLayout(4, false);
 			gl.marginLeft = 0;
 			gl.marginRight = 0;
 			gl.marginWidth = 0;
@@ -129,7 +130,7 @@
 			Button b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
 			b.setText(Messages.ModelTooling_Common_Up);
 			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_up));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
+			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 			b.addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
@@ -156,7 +157,7 @@
 			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
 			b.setText(Messages.ModelTooling_Common_Down);
 			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_down));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
+			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 			b.addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
@@ -197,7 +198,7 @@
 			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
 			b.setText(Messages.ModelTooling_Common_Remove);
 			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_delete));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
+			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 			b.addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelImportsEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelImportsEditor.java
index 1686351..482c9e1 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelImportsEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VModelImportsEditor.java
@@ -23,16 +23,28 @@
 import org.eclipse.e4.tools.emf.ui.internal.common.VirtualEntry;
 import org.eclipse.e4.tools.emf.ui.internal.common.uistructure.ViewerElement;
 import org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl;
+import org.eclipse.e4.ui.model.fragment.MModelFragments;
 import org.eclipse.e4.ui.model.fragment.impl.FragmentPackageImpl;
+import org.eclipse.emf.common.command.Command;
 import org.eclipse.emf.databinding.EMFDataBindingContext;
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.edit.command.AddCommand;
+import org.eclipse.emf.edit.command.MoveCommand;
+import org.eclipse.emf.edit.command.RemoveCommand;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ArrayContentProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
+import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.Viewer;
 import org.eclipse.jface.viewers.ViewerComparator;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
+import org.eclipse.swt.events.SelectionAdapter;
+import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
@@ -92,7 +104,7 @@
 		parent = createScrollableContainer(folder);
 		item.setControl(parent.getParent());
 
-		tableElement = ViewerElement.create(eclipseContext, parent, FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, this);
+		tableElement = ViewerElement.create(eclipseContext, parent, this);
 		tableElement.getViewer().setContentProvider(new ObservableListContentProvider());
 		tableElement.getViewer().setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
@@ -113,6 +125,80 @@
 			}
 		});
 
+		tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				EClass eClass = ((FeatureClass) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement()).eClass;
+				EObject eObject = EcoreUtil.create(eClass);
+
+				Command cmd = AddCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, eObject);
+
+				if (cmd.canExecute()) {
+					getEditingDomain().getCommandStack().execute(cmd);
+					getEditor().setSelection(eObject);
+				}
+			}
+		});
+
+		tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					List<?> elements = ((IStructuredSelection) tableElement.getViewer().getSelection()).toList();
+
+					Command cmd = RemoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, elements);
+					if (cmd.canExecute()) {
+						getEditingDomain().getCommandStack().execute(cmd);
+					}
+				}
+			}
+		});
+
+		tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+					if (s.size() == 1) {
+						Object obj = s.getFirstElement();
+						MModelFragments container = (MModelFragments) getMaster().getValue();
+						int idx = container.getImports().indexOf(obj) + 1;
+						if (idx < container.getImports().size()) {
+							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, obj, idx);
+
+							if (cmd.canExecute()) {
+								getEditingDomain().getCommandStack().execute(cmd);
+								tableElement.getViewer().setSelection(new StructuredSelection(obj));
+							}
+						}
+
+					}
+				}
+			}
+		});
+
+		tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
+			@Override
+			public void widgetSelected(SelectionEvent e) {
+				if (!tableElement.getViewer().getSelection().isEmpty()) {
+					IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+					if (s.size() == 1) {
+						Object obj = s.getFirstElement();
+						MModelFragments container = (MModelFragments) getMaster().getValue();
+						int idx = container.getImports().indexOf(obj) - 1;
+						if (idx >= 0) {
+							Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS, obj, idx);
+
+							if (cmd.canExecute()) {
+								getEditingDomain().getCommandStack().execute(cmd);
+								tableElement.getViewer().setSelection(new StructuredSelection(obj));
+							}
+						}
+					}
+				}
+			}
+		});
+
 		List<FeatureClass> list = new ArrayList<FeatureClass>();
 		Util.addClasses(ApplicationPackageImpl.eINSTANCE, list);
 		list.addAll(getEditor().getFeatureClasses(FragmentPackageImpl.Literals.MODEL_FRAGMENT, FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS));
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowControlEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowControlEditor.java
index cd6e97a..de2ff8d 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowControlEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowControlEditor.java
@@ -16,11 +16,13 @@
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.Util;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
 import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.ComponentLabelProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.VirtualEntry;
+import org.eclipse.e4.tools.emf.ui.internal.common.uistructure.ViewerElement;
 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.advanced.impl.AdvancedPackageImpl;
@@ -36,28 +38,26 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
 public class VWindowControlEditor extends AbstractComponentEditor {
 	private Composite composite;
 	private EMFDataBindingContext context;
-	private TableViewer viewer;
 	private List<Action> actions = new ArrayList<Action>();
+	private ViewerElement tableElement;
+
+	@Inject
+	IEclipseContext eclipseContext;
 
 	@Inject
 	public VWindowControlEditor() {
@@ -136,7 +136,7 @@
 			composite = createForm(parent, context, getMaster());
 		}
 		VirtualEntry<?> o = (VirtualEntry<?>) object;
-		viewer.setInput(o.getList());
+		tableElement.getViewer().setInput(o.getList());
 		getMaster().setValue(o.getOriginalParent());
 		return composite;
 	}
@@ -151,105 +151,36 @@
 		item.setControl(parent.getParent());
 
 		{
-			viewer = new TableViewer(parent);
-			ObservableListContentProvider cp = new ObservableListContentProvider();
-			viewer.setContentProvider(cp);
-			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			viewer.getControl().setLayoutData(gd);
 
-			Composite buttonComp = new Composite(parent, SWT.NONE);
-			buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-			GridLayout gl = new GridLayout(2, false);
-			gl.marginLeft = 0;
-			gl.marginRight = 0;
-			gl.marginWidth = 0;
-			gl.marginHeight = 0;
-			buttonComp.setLayout(gl);
+			tableElement = ViewerElement.create(eclipseContext, parent, this);
+			tableElement.getViewer().setContentProvider(new ObservableListContentProvider());
+			tableElement.getViewer().setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
-			Button b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Up);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_up));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-						if (s.size() == 1) {
-							Object obj = s.getFirstElement();
-							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
-							int idx = container.getChildren().indexOf(obj) - 1;
-							if (idx >= 0) {
-								if (Util.moveElementByIndex(getEditingDomain(), (MUIElement) obj, getEditor().isLiveModel(), idx)) {
-									viewer.setSelection(new StructuredSelection(obj));
-								}
-							}
+			tableElement.getDropDown().setContentProvider(new ArrayContentProvider());
 
-						}
-					}
-				}
-			});
-
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Down);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_down));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
-				@Override
-				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-						if (s.size() == 1) {
-							Object obj = s.getFirstElement();
-							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
-							int idx = container.getChildren().indexOf(obj) + 1;
-							if (idx < container.getChildren().size()) {
-								if (Util.moveElementByIndex(getEditingDomain(), (MUIElement) obj, getEditor().isLiveModel(), idx)) {
-									viewer.setSelection(new StructuredSelection(obj));
-								}
-							}
-						}
-					}
-				}
-			});
-
-			final ComboViewer childrenDropDown = new ComboViewer(buttonComp);
-			childrenDropDown.getControl().setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-			childrenDropDown.setContentProvider(new ArrayContentProvider());
-			childrenDropDown.setLabelProvider(new LabelProvider() {
+			tableElement.getDropDown().setLabelProvider(new LabelProvider() {
 				@Override
 				public String getText(Object element) {
 					EClass eclass = (EClass) element;
 					return eclass.getName();
 				}
 			});
-			childrenDropDown.setInput(new EClass[] { AdvancedPackageImpl.Literals.PERSPECTIVE_STACK, BasicPackageImpl.Literals.PART_SASH_CONTAINER, BasicPackageImpl.Literals.PART_STACK, BasicPackageImpl.Literals.PART, BasicPackageImpl.Literals.INPUT_PART, AdvancedPackageImpl.Literals.AREA });
-			childrenDropDown.setSelection(new StructuredSelection(AdvancedPackageImpl.Literals.PERSPECTIVE_STACK));
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_AddEllipsis);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_add));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
-					if (!childrenDropDown.getSelection().isEmpty()) {
-						EClass eClass = (EClass) ((IStructuredSelection) childrenDropDown.getSelection()).getFirstElement();
+					if (!tableElement.getDropDown().getSelection().isEmpty()) {
+						EClass eClass = (EClass) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement();
 						handleAdd(eClass);
 					}
 				}
 			});
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Remove);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_delete));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
-					if (!viewer.getSelection().isEmpty()) {
-						List<?> elements = ((IStructuredSelection) viewer.getSelection()).toList();
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						List<?> elements = ((IStructuredSelection) tableElement.getViewer().getSelection()).toList();
 
 						Command cmd = RemoveCommand.create(getEditingDomain(), getMaster().getValue(), UiPackageImpl.Literals.ELEMENT_CONTAINER__CHILDREN, elements);
 						if (cmd.canExecute()) {
@@ -258,6 +189,49 @@
 					}
 				}
 			});
+
+			tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+						if (s.size() == 1) {
+							Object obj = s.getFirstElement();
+							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
+							int idx = container.getChildren().indexOf(obj) + 1;
+							if (idx < container.getChildren().size()) {
+								if (Util.moveElementByIndex(getEditingDomain(), (MUIElement) obj, getEditor().isLiveModel(), idx)) {
+									tableElement.getViewer().setSelection(new StructuredSelection(obj));
+								}
+							}
+						}
+					}
+				}
+			});
+
+			tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
+				@Override
+				public void widgetSelected(SelectionEvent e) {
+					if (!tableElement.getViewer().getSelection().isEmpty()) {
+						IStructuredSelection s = (IStructuredSelection) tableElement.getViewer().getSelection();
+						if (s.size() == 1) {
+							Object obj = s.getFirstElement();
+							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
+							int idx = container.getChildren().indexOf(obj) - 1;
+							if (idx >= 0) {
+								if (Util.moveElementByIndex(getEditingDomain(), (MUIElement) obj, getEditor().isLiveModel(), idx)) {
+									tableElement.getViewer().setSelection(new StructuredSelection(obj));
+								}
+							}
+
+						}
+					}
+				}
+			});
+
+			tableElement.getDropDown().setInput(new EClass[] { AdvancedPackageImpl.Literals.PERSPECTIVE_STACK, BasicPackageImpl.Literals.PART_SASH_CONTAINER, BasicPackageImpl.Literals.PART_STACK, BasicPackageImpl.Literals.PART, BasicPackageImpl.Literals.INPUT_PART, AdvancedPackageImpl.Literals.AREA });
+			tableElement.getDropDown().setSelection(new StructuredSelection(AdvancedPackageImpl.Literals.PERSPECTIVE_STACK));
+
 		}
 
 		folder.setSelection(0);
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowSharedElementsEditor.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowSharedElementsEditor.java
index bc37837..0681bef 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowSharedElementsEditor.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/component/virtual/VWindowSharedElementsEditor.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     Tom Schindl <tom.schindl@bestsolution.at> - initial API and implementation
+ *     Wim Jongman <wim.jongman@remainsoftware.com> - bug 400804
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.component.virtual;
 
@@ -16,11 +17,12 @@
 import javax.inject.Inject;
 import org.eclipse.core.databinding.observable.list.IObservableList;
 import org.eclipse.core.databinding.observable.value.WritableValue;
+import org.eclipse.e4.core.contexts.IEclipseContext;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
 import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.ComponentLabelProvider;
 import org.eclipse.e4.tools.emf.ui.internal.common.VirtualEntry;
-import org.eclipse.e4.ui.model.application.ui.MElementContainer;
+import org.eclipse.e4.tools.emf.ui.internal.common.uistructure.ViewerElement;
 import org.eclipse.e4.ui.model.application.ui.advanced.impl.AdvancedPackageImpl;
 import org.eclipse.e4.ui.model.application.ui.basic.impl.BasicPackageImpl;
 import org.eclipse.emf.common.command.Command;
@@ -36,30 +38,29 @@
 import org.eclipse.jface.action.Action;
 import org.eclipse.jface.databinding.viewers.ObservableListContentProvider;
 import org.eclipse.jface.viewers.ArrayContentProvider;
-import org.eclipse.jface.viewers.ComboViewer;
 import org.eclipse.jface.viewers.IStructuredSelection;
 import org.eclipse.jface.viewers.LabelProvider;
 import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.TableViewer;
+import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.CTabFolder;
 import org.eclipse.swt.custom.CTabItem;
 import org.eclipse.swt.events.SelectionAdapter;
 import org.eclipse.swt.events.SelectionEvent;
 import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
 import org.eclipse.swt.widgets.Composite;
 import org.eclipse.swt.widgets.Display;
 
 public class VWindowSharedElementsEditor extends AbstractComponentEditor {
 	private Composite composite;
 	private EMFDataBindingContext context;
-	private TableViewer viewer;
+	private StructuredViewer viewer;
 	private List<Action> actions = new ArrayList<Action>();
 
 	@Inject
+	IEclipseContext eclipseContext;
+
+	@Inject
 	public VWindowSharedElementsEditor() {
 		super();
 	}
@@ -144,39 +145,25 @@
 		item.setControl(parent.getParent());
 
 		{
-			viewer = new TableViewer(parent);
-			ObservableListContentProvider cp = new ObservableListContentProvider();
-			viewer.setContentProvider(cp);
-			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
-			GridData gd = new GridData(GridData.FILL_BOTH);
-			viewer.getControl().setLayoutData(gd);
+			final ViewerElement tableElement = ViewerElement.create(eclipseContext, parent, this);
+			viewer = tableElement.getViewer();
+			viewer.setContentProvider(new ObservableListContentProvider());
+			viewer.setLabelProvider(new ComponentLabelProvider(getEditor(), Messages));
 
 			IEMFEditListProperty prop = EMFEditProperties.list(getEditingDomain(), BasicPackageImpl.Literals.WINDOW__SHARED_ELEMENTS);
 			viewer.setInput(prop.observeDetail(getMaster()));
 
-			Composite buttonComp = new Composite(parent, SWT.NONE);
-			buttonComp.setLayoutData(new GridData(GridData.FILL, GridData.END, false, false));
-			GridLayout gl = new GridLayout(2, false);
-			gl.marginLeft = 0;
-			gl.marginRight = 0;
-			gl.marginWidth = 0;
-			gl.marginHeight = 0;
-			buttonComp.setLayout(gl);
-
-			Button b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Up);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_up));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonUp().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
+
 					if (!viewer.getSelection().isEmpty()) {
 						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
 						if (s.size() == 1) {
 							Object obj = s.getFirstElement();
-							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
-							int idx = container.getChildren().indexOf(obj) - 1;
+							EObject container = (EObject) getMaster().getValue();
+							int idx = ((List<?>) container.eGet(BasicPackageImpl.Literals.WINDOW__SHARED_ELEMENTS)).indexOf(obj) - 1;
 							if (idx >= 0) {
 								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), BasicPackageImpl.Literals.WINDOW__SHARED_ELEMENTS, obj, idx);
 
@@ -185,26 +172,22 @@
 									viewer.setSelection(new StructuredSelection(obj));
 								}
 							}
-
 						}
 					}
 				}
 			});
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Down);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_arrow_down));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonDown().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
 					if (!viewer.getSelection().isEmpty()) {
 						IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
 						if (s.size() == 1) {
 							Object obj = s.getFirstElement();
-							MElementContainer<?> container = (MElementContainer<?>) getMaster().getValue();
-							int idx = container.getChildren().indexOf(obj) + 1;
-							if (idx < container.getChildren().size()) {
+							EObject container = (EObject) getMaster().getValue();
+							List<?> list = (List<?>) container.eGet(BasicPackageImpl.Literals.WINDOW__SHARED_ELEMENTS);
+							int idx = list.indexOf(obj) + 1;
+							if (idx < list.size()) {
 								Command cmd = MoveCommand.create(getEditingDomain(), getMaster().getValue(), BasicPackageImpl.Literals.WINDOW__SHARED_ELEMENTS, obj, idx);
 
 								if (cmd.canExecute()) {
@@ -212,43 +195,33 @@
 									viewer.setSelection(new StructuredSelection(obj));
 								}
 							}
-
 						}
 					}
 				}
 			});
 
-			final ComboViewer childrenDropDown = new ComboViewer(buttonComp);
-			childrenDropDown.getControl().setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-			childrenDropDown.setContentProvider(new ArrayContentProvider());
-			childrenDropDown.setLabelProvider(new LabelProvider() {
+			tableElement.getDropDown().setContentProvider(new ArrayContentProvider());
+			tableElement.getDropDown().setLabelProvider(new LabelProvider() {
 				@Override
 				public String getText(Object element) {
 					EClass eclass = (EClass) element;
 					return eclass.getName();
 				}
 			});
-			childrenDropDown.setInput(new EClass[] { BasicPackageImpl.Literals.PART_SASH_CONTAINER, BasicPackageImpl.Literals.PART, BasicPackageImpl.Literals.INPUT_PART, BasicPackageImpl.Literals.PART_STACK, AdvancedPackageImpl.Literals.AREA });
-			childrenDropDown.setSelection(new StructuredSelection(BasicPackageImpl.Literals.PART));
+			tableElement.getDropDown().setInput(new EClass[] { BasicPackageImpl.Literals.PART_SASH_CONTAINER, BasicPackageImpl.Literals.PART, BasicPackageImpl.Literals.INPUT_PART, BasicPackageImpl.Literals.PART_STACK, AdvancedPackageImpl.Literals.AREA });
+			tableElement.getDropDown().setSelection(new StructuredSelection(BasicPackageImpl.Literals.PART));
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_add));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, false, false));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonAdd().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
-					if (!childrenDropDown.getSelection().isEmpty()) {
-						EClass eClass = (EClass) ((IStructuredSelection) childrenDropDown.getSelection()).getFirstElement();
+					if (!tableElement.getDropDown().getSelection().isEmpty()) {
+						EClass eClass = (EClass) ((IStructuredSelection) tableElement.getDropDown().getSelection()).getFirstElement();
 						handleAdd(eClass);
 					}
 				}
 			});
 
-			b = new Button(buttonComp, SWT.PUSH | SWT.FLAT);
-			b.setText(Messages.ModelTooling_Common_Remove);
-			b.setImage(createImage(ResourceProvider.IMG_Obj16_table_delete));
-			b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 2, 1));
-			b.addSelectionListener(new SelectionAdapter() {
+			tableElement.getButtonRemove().addSelectionListener(new SelectionAdapter() {
 				@Override
 				public void widgetSelected(SelectionEvent e) {
 					if (!viewer.getSelection().isEmpty()) {
diff --git a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/ViewerElement.java b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/ViewerElement.java
index 46f9c64..5b5a547 100644
--- a/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/ViewerElement.java
+++ b/bundles/org.eclipse.e4.tools.emf.ui/src/org/eclipse/e4/tools/emf/ui/internal/common/uistructure/ViewerElement.java
@@ -10,33 +10,18 @@
  ******************************************************************************/
 package org.eclipse.e4.tools.emf.ui.internal.common.uistructure;
 
-import java.util.List;
 import javax.inject.Inject;
 import org.eclipse.e4.core.contexts.ContextInjectionFactory;
 import org.eclipse.e4.core.contexts.IEclipseContext;
-import org.eclipse.e4.tools.emf.ui.common.IEditorFeature.FeatureClass;
 import org.eclipse.e4.tools.emf.ui.common.component.AbstractComponentEditor;
 import org.eclipse.e4.tools.emf.ui.internal.Messages;
 import org.eclipse.e4.tools.emf.ui.internal.ResourceProvider;
 import org.eclipse.e4.tools.services.Translation;
-import org.eclipse.e4.ui.model.fragment.MModelFragments;
-import org.eclipse.e4.ui.model.fragment.impl.FragmentPackageImpl;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.edit.command.AddCommand;
-import org.eclipse.emf.edit.command.MoveCommand;
-import org.eclipse.emf.edit.command.RemoveCommand;
 import org.eclipse.jface.viewers.ComboViewer;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.StructuredSelection;
 import org.eclipse.jface.viewers.StructuredViewer;
 import org.eclipse.jface.viewers.TableViewer;
 import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
+import org.eclipse.swt.events.SelectionListener;
 import org.eclipse.swt.layout.GridData;
 import org.eclipse.swt.layout.GridLayout;
 import org.eclipse.swt.widgets.Button;
@@ -57,7 +42,12 @@
 	private ComboViewer dropDown;
 	private Button addButton;
 	private Composite parent;
-	private EReference reference;
+
+	private Button removeButton;
+
+	private Button downButton;
+
+	private Button upButton;
 
 	/**
 	 * @param parent
@@ -65,9 +55,8 @@
 	 * @param editor
 	 */
 	@Inject
-	public ViewerElement(@Translation Messages Messages, Composite parent, EReference reference, AbstractComponentEditor editor) {
+	public ViewerElement(@Translation Messages Messages, Composite parent, AbstractComponentEditor editor) {
 		this.parent = parent;
-		this.reference = reference;
 		this.editor = editor;
 		this.Messages = Messages;
 		createControl();
@@ -101,77 +90,61 @@
 		gl.marginHeight = 0;
 		buttonCompBot.setLayout(gl);
 
-		Button b = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Up);
-		b.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_up));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
-		b.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (!viewer.getSelection().isEmpty()) {
-					IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-					if (s.size() == 1) {
-						Object obj = s.getFirstElement();
-						MModelFragments container = (MModelFragments) editor.getMaster().getValue();
-						int idx = container.getImports().indexOf(obj) - 1;
-						if (idx >= 0) {
-							Command cmd = MoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), reference, obj, idx);
+		upButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
+		upButton.setText(Messages.ModelTooling_Common_Up);
+		upButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_up));
+		upButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 
-							if (cmd.canExecute()) {
-								editor.getEditingDomain().getCommandStack().execute(cmd);
-								viewer.setSelection(new StructuredSelection(obj));
-							}
-						}
+		downButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
+		downButton.setText(Messages.ModelTooling_Common_Down);
+		downButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_down));
+		downButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 
-					}
-				}
-			}
-		});
+		removeButton = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
+		removeButton.setText(Messages.ModelTooling_Common_Remove);
+		removeButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_table_delete));
+		removeButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
 
-		b = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Down);
-		b.setImage(editor.createImage(ResourceProvider.IMG_Obj16_arrow_down));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
-		b.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (!viewer.getSelection().isEmpty()) {
-					IStructuredSelection s = (IStructuredSelection) viewer.getSelection();
-					if (s.size() == 1) {
-						Object obj = s.getFirstElement();
-						MModelFragments container = (MModelFragments) editor.getMaster().getValue();
-						int idx = container.getImports().indexOf(obj) + 1;
-						if (idx < container.getImports().size()) {
-							Command cmd = MoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), reference, obj, idx);
+	}
 
-							if (cmd.canExecute()) {
-								editor.getEditingDomain().getCommandStack().execute(cmd);
-								viewer.setSelection(new StructuredSelection(obj));
-							}
-						}
+	/**
+	 * Returns the button that removes an element from the list. Use it to add
+	 * your {@link SelectionListener} to it.
+	 * 
+	 * @return
+	 */
+	public Button getButtonRemove() {
+		return removeButton;
+	}
 
-					}
-				}
-			}
-		});
+	/**
+	 * Returns the button that adds an element to the list. Use it to add your
+	 * {@link SelectionListener} to it.
+	 * 
+	 * @return
+	 */
+	public Button getButtonAdd() {
+		return addButton;
+	}
 
-		b = new Button(buttonCompBot, SWT.PUSH | SWT.FLAT);
-		b.setText(Messages.ModelTooling_Common_Remove);
-		b.setImage(editor.createImage(ResourceProvider.IMG_Obj16_table_delete));
-		b.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false, 1, 1));
-		b.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				if (!viewer.getSelection().isEmpty()) {
-					List<?> elements = ((IStructuredSelection) viewer.getSelection()).toList();
+	/**
+	 * Returns the button that moves an element down in the list. Use it to add
+	 * your {@link SelectionListener} to it.
+	 * 
+	 * @return
+	 */
+	public Button getButtonDown() {
+		return downButton;
+	}
 
-					Command cmd = RemoveCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), reference, elements);
-					if (cmd.canExecute()) {
-						editor.getEditingDomain().getCommandStack().execute(cmd);
-					}
-				}
-			}
-		});
+	/**
+	 * Returns the button that moves an element up in the list. Use it to add
+	 * your {@link SelectionListener} to it.
+	 * 
+	 * @return
+	 */
+	public Button getButtonUp() {
+		return upButton;
 	}
 
 	private void createTopButtons() {
@@ -191,20 +164,6 @@
 		addButton.setImage(editor.createImage(ResourceProvider.IMG_Obj16_table_add));
 		addButton.setText(Messages.ModelTooling_Common_AddEllipsis);
 		addButton.setLayoutData(new GridData(GridData.FILL, GridData.CENTER, true, false));
-		addButton.addSelectionListener(new SelectionAdapter() {
-			@Override
-			public void widgetSelected(SelectionEvent e) {
-				EClass eClass = ((FeatureClass) ((IStructuredSelection) dropDown.getSelection()).getFirstElement()).eClass;
-				EObject eObject = EcoreUtil.create(eClass);
-
-				Command cmd = AddCommand.create(editor.getEditingDomain(), editor.getMaster().getValue(), reference, eObject);
-
-				if (cmd.canExecute()) {
-					editor.getEditingDomain().getCommandStack().execute(cmd);
-					editor.getEditor().setSelection(eObject);
-				}
-			}
-		});
 
 	}
 
@@ -222,11 +181,10 @@
 	 * @param editor
 	 * @return a new {@link ViewerElement}
 	 */
-	public static ViewerElement create(IEclipseContext parentContext, Composite parent, EReference reference, AbstractComponentEditor editor) {
+	public static ViewerElement create(IEclipseContext parentContext, Composite parent, AbstractComponentEditor editor) {
 		IEclipseContext mycontext = parentContext.createChild();
 		mycontext.set(Composite.class, parent);
 		mycontext.set(AbstractComponentEditor.class, editor);
-		mycontext.set(EReference.class, FragmentPackageImpl.Literals.MODEL_FRAGMENTS__IMPORTS);
 		return ContextInjectionFactory.make(ViewerElement.class, mycontext);
 	}
 }
diff --git a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/E4NewProjectWizard.java b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/E4NewProjectWizard.java
index e7067fb..5073493 100644
--- a/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/E4NewProjectWizard.java
+++ b/bundles/org.eclipse.e4.tools/src/org/eclipse/e4/internal/tools/wizards/project/E4NewProjectWizard.java
@@ -713,18 +713,17 @@
 
 	private class ContentWizard extends Wizard implements IBundleContentWizard {
 
-		String[] dependencies = new String[] { "javax.inject",
-				"org.eclipse.core.runtime", "org.eclipse.swt",
-				"org.eclipse.core.databinding",
-				"org.eclipse.core.databinding.beans", "org.eclipse.jface",
-				"org.eclipse.jface.databinding", "org.eclipse.e4.ui.services",
-				"org.eclipse.e4.ui.workbench", "org.eclipse.e4.core.services",
-				"org.eclipse.e4.core.di", "org.eclipse.e4.ui.di",
+		String[] dependencies = new String[] { 
+				"javax.inject",
+				"org.eclipse.core.runtime", 
+				"org.eclipse.swt",
+				"org.eclipse.jface",
+				"org.eclipse.e4.ui.services",
+				"org.eclipse.e4.ui.workbench", 
+				"org.eclipse.e4.core.di", 
+				"org.eclipse.e4.ui.di",
 				"org.eclipse.e4.core.contexts",
-				"org.eclipse.e4.ui.workbench.swt",
-				"org.eclipse.core.databinding.property",
-				"org.eclipse.e4.ui.css.core", "org.w3c.css.sac",
-				"org.eclipse.e4.core.commands", "org.eclipse.e4.ui.bindings" };
+				};
 
 		public void init(IFieldData data) {
 		}