Bug 305793 -  tables for keybindings
Bug 305796 -  model reconciler tests need rework
Bug 305797 -  Need to re-act to keybinding model changes
diff --git a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/EBindingService.java b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/EBindingService.java
index 332fd54..333b376 100644
--- a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/EBindingService.java
+++ b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/EBindingService.java
@@ -9,12 +9,8 @@
 	Binding createBinding(TriggerSequence sequence, ParameterizedCommand command, String schemeId,
 			String contextId);
 
-	Binding activateBinding(TriggerSequence sequence, ParameterizedCommand command);
-
 	void activateBinding(Binding binding);
 
-	Binding deactivateBinding(TriggerSequence sequence, ParameterizedCommand command);
-
 	void deactivateBinding(Binding binding);
 
 	TriggerSequence createSequence(String sequence);
diff --git a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingServiceImpl.java b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingServiceImpl.java
index 061197e..1059831 100644
--- a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingServiceImpl.java
+++ b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingServiceImpl.java
@@ -13,104 +13,26 @@
 
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
+import java.util.Set;
 import javax.inject.Inject;
+import javax.inject.Named;
 import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.contexts.Context;
+import org.eclipse.core.commands.contexts.ContextManager;
+import org.eclipse.e4.core.services.annotations.Optional;
 import org.eclipse.e4.core.services.context.IEclipseContext;
 import org.eclipse.e4.ui.bindings.EBindingService;
 import org.eclipse.jface.bindings.Binding;
-import org.eclipse.jface.bindings.Trigger;
 import org.eclipse.jface.bindings.TriggerSequence;
-import org.eclipse.jface.bindings.keys.IKeyLookup;
 import org.eclipse.jface.bindings.keys.KeyBinding;
-import org.eclipse.jface.bindings.keys.KeyLookupFactory;
 import org.eclipse.jface.bindings.keys.KeySequence;
-import org.eclipse.jface.bindings.keys.KeyStroke;
 import org.eclipse.jface.bindings.keys.ParseException;
 
 /**
  *
  */
 public class BindingServiceImpl implements EBindingService {
-	static HashMap<Binding, String[]> prefixCache = new HashMap<Binding, String[]>();
-
-	static String[] getPrefixes(Binding b) {
-		String[] prefixes = prefixCache.get(b);
-		if (prefixes == null) {
-			TriggerSequence[] prefs = b.getTriggerSequence().getPrefixes();
-			prefixes = new String[prefs.length - 1];
-			prefixCache.put(b, prefixes);
-			for (int i = 1; i < prefs.length; i++) {
-				prefixes[i - 1] = B_SEQ + prefs[i];
-			}
-		}
-		return prefixes;
-	}
-
-	static String getBindingId(Binding b) {
-		return B_ID + b.getTriggerSequence().format();
-	}
-
-	static String getCommandId(Binding b) {
-		return P_ID + b.getParameterizedCommand().serialize();
-	}
-
-	static final Comparator<Binding> BEST_SEQUENCE = new Comparator<Binding>() {
-		public int compare(Binding o1, Binding o2) {
-			/*
-			 * Check to see which has the least number of triggers in the trigger sequence.
-			 */
-			final Trigger[] bestTriggers = o1.getTriggerSequence().getTriggers();
-			final Trigger[] currentTriggers = o2.getTriggerSequence().getTriggers();
-			int compareTo = bestTriggers.length - currentTriggers.length;
-			if (compareTo != 0) {
-				return compareTo;
-			}
-
-			/*
-			 * Compare the number of keys pressed in each trigger sequence. Some types of keys count
-			 * less than others (i.e., some types of modifiers keys are less likely to be chosen).
-			 */
-			compareTo = countStrokes(bestTriggers) - countStrokes(currentTriggers);
-			if (compareTo != 0) {
-				return compareTo;
-			}
-
-			// If this is still a tie, then just chose the shortest text.
-			return o1.getTriggerSequence().format().length()
-					- o2.getTriggerSequence().format().length();
-		}
-
-		private final int countStrokes(final Trigger[] triggers) {
-			int strokeCount = triggers.length;
-			for (int i = 0; i < triggers.length; i++) {
-				final Trigger trigger = triggers[i];
-				if (trigger instanceof KeyStroke) {
-					final KeyStroke keyStroke = (KeyStroke) trigger;
-					final int modifierKeys = keyStroke.getModifierKeys();
-					final IKeyLookup lookup = KeyLookupFactory.getDefault();
-					if ((modifierKeys & lookup.getAlt()) != 0) {
-						strokeCount += 8;
-					}
-					if ((modifierKeys & lookup.getCtrl()) != 0) {
-						strokeCount += 2;
-					}
-					if ((modifierKeys & lookup.getShift()) != 0) {
-						strokeCount += 4;
-					}
-					if ((modifierKeys & lookup.getCommand()) != 0) {
-						strokeCount += 2;
-					}
-				} else {
-					strokeCount += 99;
-				}
-			}
-
-			return strokeCount;
-		}
-	};
+	static final String ACTIVE_CONTEXTS = "activeContexts"; //$NON-NLS-1$
 
 	static final String LOOKUP_BINDING = "binding"; //$NON-NLS-1$
 	static final String LOOKUP_CMD = "cmd"; //$NON-NLS-1$
@@ -123,8 +45,17 @@
 	static final String B_SEQ = "bindSeq::"; //$NON-NLS-1$
 	static final String P_ID = "parmCmd::"; //$NON-NLS-1$
 
+	@Inject
 	private IEclipseContext context;
 
+	@Inject
+	private BindingTableManager manager;
+
+	@Inject
+	private ContextManager contextManager;
+
+	private ContextSet contextSet = ContextSet.EMPTY;
+
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -138,24 +69,6 @@
 				null, Binding.SYSTEM);
 	}
 
-	private Binding createDefaultBinding(TriggerSequence sequence, ParameterizedCommand command) {
-		return createBinding(sequence, command, "org.eclipse.ui.defaultAcceleratorConfiguration", //$NON-NLS-1$
-				"org.eclipse.ui.context.window"); //$NON-NLS-1$
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.e4.ui.bindings.EBindingService#activateBinding(org.eclipse.e4.ui.bindings.
-	 * TriggerSequence, org.eclipse.core.commands.ParameterizedCommand)
-	 */
-	public Binding activateBinding(TriggerSequence sequence, ParameterizedCommand command) {
-		Binding binding = createDefaultBinding(sequence, command);
-
-		activateBinding(binding);
-		return binding;
-	}
-
 	/*
 	 * (non-Javadoc)
 	 * 
@@ -164,50 +77,12 @@
 	 * )
 	 */
 	public void activateBinding(Binding binding) {
-		context.set(getBindingId(binding), binding);
-		// add mapping from command to keys
-		addLocalArray(getCommandId(binding), binding);
-
-		// deal with partial bindings
-		String[] prefixes = getPrefixes(binding);
-		for (int i = 0; i < prefixes.length; i++) {
-			addLocalArray(prefixes[i], binding);
+		String contextId = binding.getContextId();
+		BindingTable table = manager.getTable(contextId);
+		if (table == null) {
+			System.err.println("No binding table for " + contextId); //$NON-NLS-1$
 		}
-	}
-
-	private void addLocalArray(String id, Binding binding) {
-		ArrayList<Binding> bindings = new ArrayList<Binding>(3);
-		ArrayList<Binding> tmp = (ArrayList<Binding>) context.getLocal(id);
-		if (tmp != null) {
-			bindings.addAll(tmp);
-		}
-		bindings.add(binding);
-		Collections.sort(bindings, BEST_SEQUENCE);
-		context.set(id, bindings);
-	}
-
-	private void removeLocalArray(String id, Binding binding) {
-		ArrayList<Binding> tmp = (ArrayList<Binding>) context.getLocal(id);
-		if (tmp.size() < 2) {
-			context.remove(id);
-		} else {
-			tmp.remove(binding);
-			context.set(id, new ArrayList<Binding>(tmp));
-		}
-	}
-
-	/*
-	 * (non-Javadoc)
-	 * 
-	 * @seeorg.eclipse.e4.ui.bindings.EBindingService#deactivateBinding(org.eclipse.e4.ui.bindings.
-	 * TriggerSequence, org.eclipse.core.commands.ParameterizedCommand)
-	 */
-	public Binding deactivateBinding(TriggerSequence sequence, ParameterizedCommand command) {
-		Binding binding = createDefaultBinding(sequence, command);
-		Binding oldBinding = (Binding) context.get(getBindingId(binding));
-		deactivateBinding(binding);
-
-		return oldBinding;
+		table.addBinding(binding);
 	}
 
 	/*
@@ -218,16 +93,12 @@
 	 * )
 	 */
 	public void deactivateBinding(Binding binding) {
-		context.remove(getBindingId(binding));
-
-		// remove the command to trigger bindings
-		removeLocalArray(getCommandId(binding), binding);
-
-		// deal with removing the partial binding
-		String[] prefixes = getPrefixes(binding);
-		for (int i = 0; i < prefixes.length; i++) {
-			removeLocalArray(prefixes[i], binding);
+		String contextId = binding.getContextId();
+		BindingTable table = manager.getTable(contextId);
+		if (table == null) {
+			System.err.println("No binding table for " + contextId); //$NON-NLS-1$
 		}
+		table.removeBinding(binding);
 	}
 
 	/*
@@ -261,7 +132,7 @@
 	 * TriggerSequence)
 	 */
 	public Binding getPerfectMatch(TriggerSequence trigger) {
-		return (Binding) context.get(BINDING_LOOKUP, lookupBinding(trigger.format()));
+		return manager.getPerfectMatch(contextSet, trigger);
 	}
 
 	/*
@@ -271,7 +142,7 @@
 	 * TriggerSequence)
 	 */
 	public boolean isPartialMatch(TriggerSequence keySequence) {
-		return context.get(BINDING_PREFIX_LOOKUP, lookupSequence(keySequence.format())) != null;
+		return manager.isPartialMatch(contextSet, keySequence);
 	}
 
 	/*
@@ -281,13 +152,8 @@
 	 * ParameterizedCommand)
 	 */
 	public TriggerSequence getBestSequenceFor(ParameterizedCommand command) {
-		String cmdString = command.serialize();
-		ArrayList<Binding> tmp = (ArrayList<Binding>) context.get(CMD_LOOKUP,
-				lookupCommand(cmdString));
-		if (tmp != null && !tmp.isEmpty()) {
-			return tmp.get(0).getTriggerSequence();
-		}
-		return null;
+		Binding binding = manager.getBestSequenceFor(contextSet, command);
+		return binding == null ? null : binding.getTriggerSequence();
 	}
 
 	/*
@@ -297,8 +163,12 @@
 	 * ParameterizedCommand)
 	 */
 	public Collection<TriggerSequence> getSequencesFor(ParameterizedCommand command) {
-		String cmdString = command.serialize();
-		return (Collection<TriggerSequence>) context.get(CMD_SEQ_LOOKUP, lookupCommand(cmdString));
+		Collection<Binding> bindings = manager.getSequencesFor(contextSet, command);
+		ArrayList<TriggerSequence> sequences = new ArrayList<TriggerSequence>(bindings.size());
+		for (Binding binding : bindings) {
+			sequences.add(binding.getTriggerSequence());
+		}
+		return sequences;
 	}
 
 	/*
@@ -318,16 +188,7 @@
 	 * TriggerSequence)
 	 */
 	public Collection<Binding> getPartialMatches(TriggerSequence sequence) {
-		return (Collection<Binding>) context.get(LOOKUP_PARTIAL_MATCH, lookupSequence(sequence
-				.format()));
-	}
-
-	/**
-	 * @param c
-	 */
-	@Inject
-	public void setContext(IEclipseContext c) {
-		context = c;
+		return manager.getPartialMatches(contextSet, sequence);
 	}
 
 	/**
@@ -337,15 +198,16 @@
 		return context;
 	}
 
-	private Object[] lookupBinding(String bindingId) {
-		return new Object[] { B_ID + bindingId };
-	}
-
-	private Object[] lookupCommand(String cmdString) {
-		return new Object[] { P_ID + cmdString };
-	}
-
-	private Object[] lookupSequence(String sequence) {
-		return new Object[] { B_SEQ + sequence };
+	@Inject
+	public void setContextIds(@Named(ACTIVE_CONTEXTS) @Optional Set<String> set) {
+		if (set == null || set.isEmpty() || contextManager == null) {
+			contextSet = ContextSet.EMPTY;
+			return;
+		}
+		ArrayList<Context> contexts = new ArrayList<Context>();
+		for (String id : set) {
+			contexts.add(contextManager.getContext(id));
+		}
+		contextSet = manager.createContextSet(contexts);
 	}
 }
diff --git a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTable.java b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTable.java
index ec57921..db071c1 100644
--- a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTable.java
+++ b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTable.java
@@ -134,6 +134,23 @@
 		}
 	}
 
+	public void removeBinding(Binding binding) {
+		if (!getId().equals(binding.getContextId())) {
+			throw new IllegalArgumentException("Binding context " + binding.getContextId() //$NON-NLS-1$
+					+ " does not match " + getId()); //$NON-NLS-1$
+		}
+
+		bindings.remove(binding);
+		bindingsByTrigger.remove(binding.getTriggerSequence());
+		ArrayList<Binding> sequences = bindingsByCommand.get(binding.getParameterizedCommand());
+		sequences.remove(binding);
+		TriggerSequence[] prefs = binding.getTriggerSequence().getPrefixes();
+		for (int i = 1; i < prefs.length; i++) {
+			ArrayList<Binding> bindings = bindingsByPrefix.get(prefs[i]);
+			bindings.remove(binding);
+		}
+	}
+
 	public Binding getPerfectMatch(TriggerSequence trigger) {
 		return bindingsByTrigger.get(trigger);
 	}
@@ -158,4 +175,5 @@
 	public boolean isPartialMatch(TriggerSequence seq) {
 		return bindingsByPrefix.get(seq) != null;
 	}
+
 }
diff --git a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTableManager.java b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTableManager.java
index f1a580d..ddc1d23 100644
--- a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTableManager.java
+++ b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/BindingTableManager.java
@@ -51,13 +51,13 @@
 		return (BindingTable) eclipseContext.get(id);
 	}
 
-	public ContextSet createContextSet(List<Context> contexts) {
+	public ContextSet createContextSet(Collection<Context> contexts) {
 		return new ContextSet(contexts);
 	}
 
-	public Binding getPerfectMatch(ContextSet windowSet, TriggerSequence triggerSequence) {
+	public Binding getPerfectMatch(ContextSet contextSet, TriggerSequence triggerSequence) {
 		Binding result = null;
-		List<Context> contexts = windowSet.getContexts();
+		List<Context> contexts = contextSet.getContexts();
 		ListIterator<Context> it = contexts.listIterator(contexts.size());
 		while (it.hasPrevious() && result == null) {
 			Context c = it.previous();
diff --git a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/ContextSet.java b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/ContextSet.java
index e722662..0613e75 100644
--- a/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/ContextSet.java
+++ b/bundles/org.eclipse.e4.ui.bindings/src/org/eclipse/e4/ui/bindings/internal/ContextSet.java
@@ -12,6 +12,7 @@
 package org.eclipse.e4.ui.bindings.internal;
 
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
@@ -20,6 +21,8 @@
 import org.eclipse.core.commands.contexts.ContextManager;
 
 public class ContextSet {
+	public static ContextSet EMPTY = new ContextSet(Collections.EMPTY_LIST);
+
 	public static class CComp implements Comparator<Context> {
 		private ContextManager manager;
 
@@ -68,7 +71,7 @@
 
 	private List<Context> contexts;
 
-	public ContextSet(List<Context> c) {
+	public ContextSet(Collection<Context> c) {
 		contexts = new ArrayList<Context>(c);
 		Collections.sort(contexts, CONTEXT_COMP);
 	}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/plugin.properties b/bundles/org.eclipse.e4.ui.model.workbench.edit/plugin.properties
index 1eec88c..d10265e 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/plugin.properties
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/plugin.properties
@@ -159,3 +159,14 @@
 _UI_ModelComponent_processor_feature = Processor
 _UI_InputPart_type = Input Part
 _UI_Part_closeable_feature = Closeable
+_UI_BindingContext_type = Binding Context
+_UI_BindingTable_type = Binding Table
+_UI_BindingContainer_bindingTables_feature = Binding Tables
+_UI_BindingContainer_rootContext_feature = Root Context
+_UI_BindingContext_name_feature = Name
+_UI_BindingContext_description_feature = Description
+_UI_BindingContext_children_feature = Children
+_UI_BindingTable_bindingContextId_feature = Binding Context Id
+_UI_BindingTable_bindings_feature = Bindings
+_UI_Bindings_type = Bindings
+_UI_Bindings_bindingContexts_feature = Binding Contexts
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProvider.java
index 9a1e279..9b582b8 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProvider.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProvider.java
@@ -70,6 +70,7 @@
 
 			addContextPropertyDescriptor(object);
 			addVariablesPropertyDescriptor(object);
+			addBindingContextsPropertyDescriptor(object);
 		}
 		return itemPropertyDescriptors;
 	}
@@ -119,6 +120,28 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Binding Contexts feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBindingContextsPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Bindings_bindingContexts_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_Bindings_bindingContexts_feature", "_UI_Bindings_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDINGS__BINDING_CONTEXTS,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
 	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
 	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
@@ -132,7 +155,8 @@
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(MApplicationPackage.Literals.CONTEXT__PROPERTIES);
 			childrenFeatures.add(MApplicationPackage.Literals.HANDLER_CONTAINER__HANDLERS);
-			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDING_TABLES);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__ROOT_CONTEXT);
 			childrenFeatures.add(MApplicationPackage.Literals.PART_DESCRIPTOR_CONTAINER__DESCRIPTORS);
 			childrenFeatures.add(MApplicationPackage.Literals.APPLICATION__COMMANDS);
 		}
@@ -191,11 +215,13 @@
 		switch (notification.getFeatureID(MApplication.class)) {
 			case MApplicationPackage.APPLICATION__CONTEXT:
 			case MApplicationPackage.APPLICATION__VARIABLES:
+			case MApplicationPackage.APPLICATION__BINDING_CONTEXTS:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case MApplicationPackage.APPLICATION__PROPERTIES:
 			case MApplicationPackage.APPLICATION__HANDLERS:
-			case MApplicationPackage.APPLICATION__BINDINGS:
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 			case MApplicationPackage.APPLICATION__COMMANDS:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
@@ -227,8 +253,13 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS,
-				 MApplicationFactory.eINSTANCE.createKeyBinding()));
+				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDING_TABLES,
+				 MApplicationFactory.eINSTANCE.createBindingTable()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(MApplicationPackage.Literals.BINDING_CONTAINER__ROOT_CONTEXT,
+				 MApplicationFactory.eINSTANCE.createBindingContext()));
 
 		newChildDescriptors.add
 			(createChildParameter
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProviderAdapterFactory.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProviderAdapterFactory.java
index 3def8ac..260a264 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProviderAdapterFactory.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ApplicationItemProviderAdapterFactory.java
@@ -494,6 +494,52 @@
 	}
 
 	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.e4.ui.model.application.MBindingContext} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BindingContextItemProvider bindingContextItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.e4.ui.model.application.MBindingContext}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createBindingContextAdapter() {
+		if (bindingContextItemProvider == null) {
+			bindingContextItemProvider = new BindingContextItemProvider(this);
+		}
+
+		return bindingContextItemProvider;
+	}
+
+	/**
+	 * This keeps track of the one adapter used for all {@link org.eclipse.e4.ui.model.application.MBindingTable} instances.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BindingTableItemProvider bindingTableItemProvider;
+
+	/**
+	 * This creates an adapter for a {@link org.eclipse.e4.ui.model.application.MBindingTable}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Adapter createBindingTableAdapter() {
+		if (bindingTableItemProvider == null) {
+			bindingTableItemProvider = new BindingTableItemProvider(this);
+		}
+
+		return bindingTableItemProvider;
+	}
+
+	/**
 	 * This keeps track of the one adapter used for all {@link org.eclipse.e4.ui.model.application.MCommand} instances.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -909,6 +955,8 @@
 		if (windowItemProvider != null) windowItemProvider.dispose();
 		if (modelComponentsItemProvider != null) modelComponentsItemProvider.dispose();
 		if (modelComponentItemProvider != null) modelComponentItemProvider.dispose();
+		if (bindingContextItemProvider != null) bindingContextItemProvider.dispose();
+		if (bindingTableItemProvider != null) bindingTableItemProvider.dispose();
 		if (commandItemProvider != null) commandItemProvider.dispose();
 		if (commandParameterItemProvider != null) commandParameterItemProvider.dispose();
 		if (handlerItemProvider != null) handlerItemProvider.dispose();
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingContextItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingContextItemProvider.java
new file mode 100644
index 0000000..db37040
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingContextItemProvider.java
@@ -0,0 +1,216 @@
+/**
+ * Copyright (c) 2008 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.model.application.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.e4.ui.model.application.MBindingContext} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class BindingContextItemProvider
+	extends ApplicationElementItemProvider
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BindingContextItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addNamePropertyDescriptor(object);
+			addDescriptionPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Name feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addNamePropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_BindingContext_name_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_BindingContext_name_feature", "_UI_BindingContext_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDING_CONTEXT__NAME,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This adds a property descriptor for the Description feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addDescriptionPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_BindingContext_description_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_BindingContext_description_feature", "_UI_BindingContext_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDING_CONTEXT__DESCRIPTION,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
+			super.getChildrenFeatures(object);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTEXT__CHILDREN);
+		}
+		return childrenFeatures;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EStructuralFeature getChildFeature(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildFeature(object, child);
+	}
+
+	/**
+	 * This returns BindingContext.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/BindingContext")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((MBindingContext)object).getName();
+		return label == null || label.length() == 0 ?
+			getString("_UI_BindingContext_type") : //$NON-NLS-1$
+			getString("_UI_BindingContext_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(MBindingContext.class)) {
+			case MApplicationPackage.BINDING_CONTEXT__NAME:
+			case MApplicationPackage.BINDING_CONTEXT__DESCRIPTION:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add
+			(createChildParameter
+				(MApplicationPackage.Literals.BINDING_CONTEXT__CHILDREN,
+				 MApplicationFactory.eINSTANCE.createBindingContext()));
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingTableItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingTableItemProvider.java
new file mode 100644
index 0000000..9cf1080
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/BindingTableItemProvider.java
@@ -0,0 +1,192 @@
+/**
+ * Copyright (c) 2008 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.model.application.provider;
+
+
+import java.util.Collection;
+import java.util.List;
+
+import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindingTable;
+
+import org.eclipse.emf.common.notify.AdapterFactory;
+import org.eclipse.emf.common.notify.Notification;
+
+import org.eclipse.emf.ecore.EStructuralFeature;
+
+import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
+import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
+import org.eclipse.emf.edit.provider.IItemLabelProvider;
+import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.IItemPropertySource;
+import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
+import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
+import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
+import org.eclipse.emf.edit.provider.ViewerNotification;
+
+/**
+ * This is the item provider adapter for a {@link org.eclipse.e4.ui.model.application.MBindingTable} object.
+ * <!-- begin-user-doc -->
+ * <!-- end-user-doc -->
+ * @generated
+ */
+public class BindingTableItemProvider
+	extends ApplicationElementItemProvider
+	implements
+		IEditingDomainItemProvider,
+		IStructuredItemContentProvider,
+		ITreeItemContentProvider,
+		IItemLabelProvider,
+		IItemPropertySource {
+	/**
+	 * This constructs an instance from a factory and a notifier.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public BindingTableItemProvider(AdapterFactory adapterFactory) {
+		super(adapterFactory);
+	}
+
+	/**
+	 * This returns the property descriptors for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
+		if (itemPropertyDescriptors == null) {
+			super.getPropertyDescriptors(object);
+
+			addBindingContextIdPropertyDescriptor(object);
+		}
+		return itemPropertyDescriptors;
+	}
+
+	/**
+	 * This adds a property descriptor for the Binding Context Id feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBindingContextIdPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_BindingTable_bindingContextId_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_BindingTable_bindingContextId_feature", "_UI_BindingTable_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDING_TABLE__BINDING_CONTEXT_ID,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
+	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
+	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
+	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
+		if (childrenFeatures == null) {
+			super.getChildrenFeatures(object);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_TABLE__BINDINGS);
+		}
+		return childrenFeatures;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EStructuralFeature getChildFeature(Object object, Object child) {
+		// Check the type of the specified child object and return the proper feature to use for
+		// adding (see {@link AddCommand}) it as a child.
+
+		return super.getChildFeature(object, child);
+	}
+
+	/**
+	 * This returns BindingTable.gif.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object getImage(Object object) {
+		return overlayImage(object, getResourceLocator().getImage("full/obj16/BindingTable")); //$NON-NLS-1$
+	}
+
+	/**
+	 * This returns the label text for the adapted class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String getText(Object object) {
+		String label = ((MBindingTable)object).getId();
+		return label == null || label.length() == 0 ?
+			getString("_UI_BindingTable_type") : //$NON-NLS-1$
+			getString("_UI_BindingTable_type") + " " + label; //$NON-NLS-1$ //$NON-NLS-2$
+	}
+
+	/**
+	 * This handles model notifications by calling {@link #updateChildren} to update any cached
+	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void notifyChanged(Notification notification) {
+		updateChildren(notification);
+
+		switch (notification.getFeatureID(MBindingTable.class)) {
+			case MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
+				return;
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
+				return;
+		}
+		super.notifyChanged(notification);
+	}
+
+	/**
+	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
+	 * that can be created under this object.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
+		super.collectNewChildDescriptors(newChildDescriptors, object);
+
+		newChildDescriptors.add
+			(createChildParameter
+				(MApplicationPackage.Literals.BINDING_TABLE__BINDINGS,
+				 MApplicationFactory.eINSTANCE.createKeyBinding()));
+	}
+
+}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ModelComponentItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ModelComponentItemProvider.java
index 024eac0..9bcd45a 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ModelComponentItemProvider.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/ModelComponentItemProvider.java
@@ -200,7 +200,8 @@
 		if (childrenFeatures == null) {
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(MApplicationPackage.Literals.HANDLER_CONTAINER__HANDLERS);
-			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDING_TABLES);
+			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__ROOT_CONTEXT);
 			childrenFeatures.add(MApplicationPackage.Literals.MODEL_COMPONENT__CHILDREN);
 			childrenFeatures.add(MApplicationPackage.Literals.MODEL_COMPONENT__COMMANDS);
 		}
@@ -265,7 +266,8 @@
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case MApplicationPackage.MODEL_COMPONENT__HANDLERS:
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
 			case MApplicationPackage.MODEL_COMPONENT__CHILDREN:
 			case MApplicationPackage.MODEL_COMPONENT__COMMANDS:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
@@ -292,8 +294,13 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS,
-				 MApplicationFactory.eINSTANCE.createKeyBinding()));
+				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDING_TABLES,
+				 MApplicationFactory.eINSTANCE.createBindingTable()));
+
+		newChildDescriptors.add
+			(createChildParameter
+				(MApplicationPackage.Literals.BINDING_CONTAINER__ROOT_CONTEXT,
+				 MApplicationFactory.eINSTANCE.createBindingContext()));
 
 		newChildDescriptors.add
 			(createChildParameter
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/PartItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/PartItemProvider.java
index 5f8c038..03b48ca 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/PartItemProvider.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/PartItemProvider.java
@@ -80,6 +80,7 @@
 			addIconURIPropertyDescriptor(object);
 			addTooltipPropertyDescriptor(object);
 			addDirtyPropertyDescriptor(object);
+			addBindingContextsPropertyDescriptor(object);
 			addMenusPropertyDescriptor(object);
 			addToolbarPropertyDescriptor(object);
 			addCloseablePropertyDescriptor(object);
@@ -352,6 +353,28 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Binding Contexts feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBindingContextsPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Bindings_bindingContexts_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_Bindings_bindingContexts_feature", "_UI_Bindings_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDINGS__BINDING_CONTEXTS,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This adds a property descriptor for the Menus feature.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -431,7 +454,6 @@
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(MApplicationPackage.Literals.CONTEXT__PROPERTIES);
 			childrenFeatures.add(MApplicationPackage.Literals.HANDLER_CONTAINER__HANDLERS);
-			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS);
 			childrenFeatures.add(MApplicationPackage.Literals.PART__MENUS);
 			childrenFeatures.add(MApplicationPackage.Literals.PART__TOOLBAR);
 		}
@@ -500,12 +522,12 @@
 			case MApplicationPackage.PART__ICON_URI:
 			case MApplicationPackage.PART__TOOLTIP:
 			case MApplicationPackage.PART__DIRTY:
+			case MApplicationPackage.PART__BINDING_CONTEXTS:
 			case MApplicationPackage.PART__CLOSEABLE:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
 				return;
 			case MApplicationPackage.PART__PROPERTIES:
 			case MApplicationPackage.PART__HANDLERS:
-			case MApplicationPackage.PART__BINDINGS:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
 				return;
 		}
@@ -535,11 +557,6 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS,
-				 MApplicationFactory.eINSTANCE.createKeyBinding()));
-
-		newChildDescriptors.add
-			(createChildParameter
 				(MApplicationPackage.Literals.PART__MENUS,
 				 MApplicationFactory.eINSTANCE.createMenu()));
 
diff --git a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/WindowItemProvider.java b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/WindowItemProvider.java
index 5c5fd60..882d435 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/WindowItemProvider.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench.edit/src/org/eclipse/e4/ui/model/application/provider/WindowItemProvider.java
@@ -73,6 +73,7 @@
 			addTooltipPropertyDescriptor(object);
 			addContextPropertyDescriptor(object);
 			addVariablesPropertyDescriptor(object);
+			addBindingContextsPropertyDescriptor(object);
 			addXPropertyDescriptor(object);
 			addYPropertyDescriptor(object);
 			addWidthPropertyDescriptor(object);
@@ -192,6 +193,28 @@
 	}
 
 	/**
+	 * This adds a property descriptor for the Binding Contexts feature.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected void addBindingContextsPropertyDescriptor(Object object) {
+		itemPropertyDescriptors.add
+			(createItemPropertyDescriptor
+				(((ComposeableAdapterFactory)adapterFactory).getRootAdapterFactory(),
+				 getResourceLocator(),
+				 getString("_UI_Bindings_bindingContexts_feature"), //$NON-NLS-1$
+				 getString("_UI_PropertyDescriptor_description", "_UI_Bindings_bindingContexts_feature", "_UI_Bindings_type"), //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+				 MApplicationPackage.Literals.BINDINGS__BINDING_CONTEXTS,
+				 true,
+				 false,
+				 false,
+				 ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
+				 null,
+				 null));
+	}
+
+	/**
 	 * This adds a property descriptor for the X feature.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -293,7 +316,6 @@
 			super.getChildrenFeatures(object);
 			childrenFeatures.add(MApplicationPackage.Literals.CONTEXT__PROPERTIES);
 			childrenFeatures.add(MApplicationPackage.Literals.HANDLER_CONTAINER__HANDLERS);
-			childrenFeatures.add(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS);
 			childrenFeatures.add(MApplicationPackage.Literals.WINDOW__MAIN_MENU);
 		}
 		return childrenFeatures;
@@ -354,6 +376,7 @@
 			case MApplicationPackage.WINDOW__TOOLTIP:
 			case MApplicationPackage.WINDOW__CONTEXT:
 			case MApplicationPackage.WINDOW__VARIABLES:
+			case MApplicationPackage.WINDOW__BINDING_CONTEXTS:
 			case MApplicationPackage.WINDOW__X:
 			case MApplicationPackage.WINDOW__Y:
 			case MApplicationPackage.WINDOW__WIDTH:
@@ -362,7 +385,6 @@
 				return;
 			case MApplicationPackage.WINDOW__PROPERTIES:
 			case MApplicationPackage.WINDOW__HANDLERS:
-			case MApplicationPackage.WINDOW__BINDINGS:
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
 				return;
@@ -393,11 +415,6 @@
 
 		newChildDescriptors.add
 			(createChildParameter
-				(MApplicationPackage.Literals.BINDING_CONTAINER__BINDINGS,
-				 MApplicationFactory.eINSTANCE.createKeyBinding()));
-
-		newChildDescriptors.add
-			(createChildParameter
 				(MApplicationPackage.Literals.WINDOW__MAIN_MENU,
 				 MApplicationFactory.eINSTANCE.createMenu()));
 
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/model/UIElements.ecore b/bundles/org.eclipse.e4.ui.model.workbench/model/UIElements.ecore
index c584ab2..8232013 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/model/UIElements.ecore
+++ b/bundles/org.eclipse.e4.ui.model.workbench/model/UIElements.ecore
@@ -146,10 +146,11 @@
     <eGenericSuperTypes eClassifier="#//HandlerContainer"/>
     <eGenericSuperTypes eClassifier="#//BindingContainer"/>
     <eGenericSuperTypes eClassifier="#//PartDescriptorContainer"/>
+    <eGenericSuperTypes eClassifier="#//Bindings"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="PSCElement" abstract="true" interface="true"
       eSuperTypes="#//UIElement"/>
-  <eClassifiers xsi:type="ecore:EClass" name="Part" eSuperTypes="#//Contribution #//Context #//PSCElement #//UILabel #//HandlerContainer #//BindingContainer #//Dirtyable">
+  <eClassifiers xsi:type="ecore:EClass" name="Part" eSuperTypes="#//Contribution #//Context #//PSCElement #//UILabel #//HandlerContainer #//Dirtyable #//Bindings">
     <eStructuralFeatures xsi:type="ecore:EReference" name="menus" upperBound="-1"
         eType="#//Menu" containment="true"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="toolbar" eType="#//ToolBar"
@@ -191,8 +192,8 @@
     <eGenericSuperTypes eClassifier="#//UILabel"/>
     <eGenericSuperTypes eClassifier="#//Context"/>
     <eGenericSuperTypes eClassifier="#//HandlerContainer"/>
-    <eGenericSuperTypes eClassifier="#//BindingContainer"/>
     <eGenericSuperTypes eClassifier="#//PSCElement"/>
+    <eGenericSuperTypes eClassifier="#//Bindings"/>
   </eClassifiers>
   <eClassifiers xsi:type="ecore:EClass" name="ModelComponents">
     <eStructuralFeatures xsi:type="ecore:EReference" name="components" upperBound="-1"
@@ -212,6 +213,24 @@
   <eClassifiers xsi:type="ecore:EClass" name="V______________Commands_______________V"
       abstract="true" interface="true"/>
   <eClassifiers xsi:type="ecore:EClass" name="BindingContainer" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EReference" name="bindingTables" upperBound="-1"
+        eType="#//BindingTable" containment="true"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="rootContext" eType="#//BindingContext"
+        containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="Bindings" abstract="true" interface="true">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bindingContexts" ordered="false"
+        upperBound="-1" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="BindingContext" eSuperTypes="#//ApplicationElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="name" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="description" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
+    <eStructuralFeatures xsi:type="ecore:EReference" name="children" upperBound="-1"
+        eType="#//BindingContext" containment="true"/>
+  </eClassifiers>
+  <eClassifiers xsi:type="ecore:EClass" name="BindingTable" eSuperTypes="#//ApplicationElement">
+    <eStructuralFeatures xsi:type="ecore:EAttribute" name="bindingContextId" lowerBound="1"
+        eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
     <eStructuralFeatures xsi:type="ecore:EReference" name="bindings" upperBound="-1"
         eType="#//KeyBinding" containment="true"/>
   </eClassifiers>
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplication.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplication.java
index eaa04c8..0ceba65 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplication.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplication.java
@@ -28,7 +28,7 @@
  * @model
  * @generated
  */
-public interface MApplication extends MElementContainer<MWindow>, MContext, MHandlerContainer, MBindingContainer, MPartDescriptorContainer {
+public interface MApplication extends MElementContainer<MWindow>, MContext, MHandlerContainer, MBindingContainer, MPartDescriptorContainer, MBindings {
 	/**
 	 * Returns the value of the '<em><b>Commands</b></em>' containment reference list.
 	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MCommand}.
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationFactory.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationFactory.java
index 0fdce32..7f88558 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationFactory.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationFactory.java
@@ -183,6 +183,24 @@
 	MModelComponent createModelComponent();
 
 	/**
+	 * Returns a new object of class '<em>Binding Context</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Binding Context</em>'.
+	 * @generated
+	 */
+	MBindingContext createBindingContext();
+
+	/**
+	 * Returns a new object of class '<em>Binding Table</em>'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return a new object of class '<em>Binding Table</em>'.
+	 * @generated
+	 */
+	MBindingTable createBindingTable();
+
+	/**
 	 * Returns a new object of class '<em>Command</em>'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationPackage.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationPackage.java
index bf812b7..35c44a3 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationPackage.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MApplicationPackage.java
@@ -422,7 +422,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getCommand()
 	 * @generated
 	 */
-	int COMMAND = 36;
+	int COMMAND = 39;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.CommandParameterImpl <em>Command Parameter</em>}' class.
@@ -432,7 +432,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getCommandParameter()
 	 * @generated
 	 */
-	int COMMAND_PARAMETER = 37;
+	int COMMAND_PARAMETER = 40;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.HandlerImpl <em>Handler</em>}' class.
@@ -442,7 +442,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getHandler()
 	 * @generated
 	 */
-	int HANDLER = 38;
+	int HANDLER = 41;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MHandlerContainer <em>Handler Container</em>}' class.
@@ -452,7 +452,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getHandlerContainer()
 	 * @generated
 	 */
-	int HANDLER_CONTAINER = 39;
+	int HANDLER_CONTAINER = 42;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.HandledItemImpl <em>Handled Item</em>}' class.
@@ -462,7 +462,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getHandledItem()
 	 * @generated
 	 */
-	int HANDLED_ITEM = 40;
+	int HANDLED_ITEM = 43;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.HandledMenuItemImpl <em>Handled Menu Item</em>}' class.
@@ -472,7 +472,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getHandledMenuItem()
 	 * @generated
 	 */
-	int HANDLED_MENU_ITEM = 41;
+	int HANDLED_MENU_ITEM = 44;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.HandledToolItemImpl <em>Handled Tool Item</em>}' class.
@@ -482,7 +482,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getHandledToolItem()
 	 * @generated
 	 */
-	int HANDLED_TOOL_ITEM = 42;
+	int HANDLED_TOOL_ITEM = 45;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MKeySequence <em>Key Sequence</em>}' class.
@@ -492,7 +492,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getKeySequence()
 	 * @generated
 	 */
-	int KEY_SEQUENCE = 44;
+	int KEY_SEQUENCE = 47;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.KeyBindingImpl <em>Key Binding</em>}' class.
@@ -502,7 +502,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getKeyBinding()
 	 * @generated
 	 */
-	int KEY_BINDING = 43;
+	int KEY_BINDING = 46;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.ParameterImpl <em>Parameter</em>}' class.
@@ -512,7 +512,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getParameter()
 	 * @generated
 	 */
-	int PARAMETER = 45;
+	int PARAMETER = 48;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MV______________Trim_______________V <em>VTrim V</em>}' class.
@@ -522,7 +522,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getV______________Trim_______________V()
 	 * @generated
 	 */
-	int VTRIM_V = 46;
+	int VTRIM_V = 49;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.TrimContainerImpl <em>Trim Container</em>}' class.
@@ -532,7 +532,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getTrimContainer()
 	 * @generated
 	 */
-	int TRIM_CONTAINER = 47;
+	int TRIM_CONTAINER = 50;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.WindowTrimImpl <em>Window Trim</em>}' class.
@@ -542,7 +542,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getWindowTrim()
 	 * @generated
 	 */
-	int WINDOW_TRIM = 48;
+	int WINDOW_TRIM = 51;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MV______________SharedElements_______________V <em>VShared Elements V</em>}' class.
@@ -552,7 +552,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getV______________SharedElements_______________V()
 	 * @generated
 	 */
-	int VSHARED_ELEMENTS_V = 49;
+	int VSHARED_ELEMENTS_V = 52;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.PlaceholderImpl <em>Placeholder</em>}' class.
@@ -562,7 +562,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getPlaceholder()
 	 * @generated
 	 */
-	int PLACEHOLDER = 50;
+	int PLACEHOLDER = 53;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.PerspectiveImpl <em>Perspective</em>}' class.
@@ -572,7 +572,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getPerspective()
 	 * @generated
 	 */
-	int PERSPECTIVE = 51;
+	int PERSPECTIVE = 54;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.PerspectiveStackImpl <em>Perspective Stack</em>}' class.
@@ -582,7 +582,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getPerspectiveStack()
 	 * @generated
 	 */
-	int PERSPECTIVE_STACK = 52;
+	int PERSPECTIVE_STACK = 55;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MV_________Testing__________V <em>VTesting V</em>}' class.
@@ -592,7 +592,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getV_________Testing__________V()
 	 * @generated
 	 */
-	int VTESTING_V = 53;
+	int VTESTING_V = 56;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.TestHarnessImpl <em>Test Harness</em>}' class.
@@ -602,7 +602,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getTestHarness()
 	 * @generated
 	 */
-	int TEST_HARNESS = 54;
+	int TEST_HARNESS = 57;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.StringToStringMapImpl <em>String To String Map</em>}' class.
@@ -2487,13 +2487,22 @@
 	int APPLICATION__HANDLERS = ELEMENT_CONTAINER_FEATURE_COUNT + 3;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Binding Tables</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int APPLICATION__BINDINGS = ELEMENT_CONTAINER_FEATURE_COUNT + 4;
+	int APPLICATION__BINDING_TABLES = ELEMENT_CONTAINER_FEATURE_COUNT + 4;
+
+	/**
+	 * The feature id for the '<em><b>Root Context</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int APPLICATION__ROOT_CONTEXT = ELEMENT_CONTAINER_FEATURE_COUNT + 5;
 
 	/**
 	 * The feature id for the '<em><b>Descriptors</b></em>' containment reference list.
@@ -2502,7 +2511,16 @@
 	 * @generated
 	 * @ordered
 	 */
-	int APPLICATION__DESCRIPTORS = ELEMENT_CONTAINER_FEATURE_COUNT + 5;
+	int APPLICATION__DESCRIPTORS = ELEMENT_CONTAINER_FEATURE_COUNT + 6;
+
+	/**
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int APPLICATION__BINDING_CONTEXTS = ELEMENT_CONTAINER_FEATURE_COUNT + 7;
 
 	/**
 	 * The feature id for the '<em><b>Commands</b></em>' containment reference list.
@@ -2511,7 +2529,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int APPLICATION__COMMANDS = ELEMENT_CONTAINER_FEATURE_COUNT + 6;
+	int APPLICATION__COMMANDS = ELEMENT_CONTAINER_FEATURE_COUNT + 8;
 
 	/**
 	 * The number of structural features of the '<em>Application</em>' class.
@@ -2520,7 +2538,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int APPLICATION_FEATURE_COUNT = ELEMENT_CONTAINER_FEATURE_COUNT + 7;
+	int APPLICATION_FEATURE_COUNT = ELEMENT_CONTAINER_FEATURE_COUNT + 9;
 
 	/**
 	 * The feature id for the '<em><b>Id</b></em>' attribute.
@@ -2784,22 +2802,22 @@
 	int PART__HANDLERS = CONTRIBUTION_FEATURE_COUNT + 13;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PART__BINDINGS = CONTRIBUTION_FEATURE_COUNT + 14;
-
-	/**
 	 * The feature id for the '<em><b>Dirty</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int PART__DIRTY = CONTRIBUTION_FEATURE_COUNT + 15;
+	int PART__DIRTY = CONTRIBUTION_FEATURE_COUNT + 14;
+
+	/**
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PART__BINDING_CONTEXTS = CONTRIBUTION_FEATURE_COUNT + 15;
 
 	/**
 	 * The feature id for the '<em><b>Menus</b></em>' containment reference list.
@@ -3019,15 +3037,6 @@
 	int INPUT_PART__HANDLERS = PART__HANDLERS;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int INPUT_PART__BINDINGS = PART__BINDINGS;
-
-	/**
 	 * The feature id for the '<em><b>Dirty</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3037,6 +3046,15 @@
 	int INPUT_PART__DIRTY = PART__DIRTY;
 
 	/**
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int INPUT_PART__BINDING_CONTEXTS = PART__BINDING_CONTEXTS;
+
+	/**
 	 * The feature id for the '<em><b>Menus</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3253,15 +3271,6 @@
 	int PART_DESCRIPTOR__HANDLERS = PART__HANDLERS;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 * @ordered
-	 */
-	int PART_DESCRIPTOR__BINDINGS = PART__BINDINGS;
-
-	/**
 	 * The feature id for the '<em><b>Dirty</b></em>' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3271,6 +3280,15 @@
 	int PART_DESCRIPTOR__DIRTY = PART__DIRTY;
 
 	/**
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int PART_DESCRIPTOR__BINDING_CONTEXTS = PART__BINDING_CONTEXTS;
+
+	/**
 	 * The feature id for the '<em><b>Menus</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -3730,13 +3748,13 @@
 	int WINDOW__HANDLERS = ELEMENT_CONTAINER_FEATURE_COUNT + 6;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int WINDOW__BINDINGS = ELEMENT_CONTAINER_FEATURE_COUNT + 7;
+	int WINDOW__BINDING_CONTEXTS = ELEMENT_CONTAINER_FEATURE_COUNT + 7;
 
 	/**
 	 * The feature id for the '<em><b>Main Menu</b></em>' containment reference.
@@ -3847,13 +3865,22 @@
 	int MODEL_COMPONENT__HANDLERS = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 2;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Binding Tables</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__BINDINGS = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 3;
+	int MODEL_COMPONENT__BINDING_TABLES = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 3;
+
+	/**
+	 * The feature id for the '<em><b>Root Context</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int MODEL_COMPONENT__ROOT_CONTEXT = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 4;
 
 	/**
 	 * The feature id for the '<em><b>Position In Parent</b></em>' attribute.
@@ -3862,7 +3889,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__POSITION_IN_PARENT = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 4;
+	int MODEL_COMPONENT__POSITION_IN_PARENT = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 5;
 
 	/**
 	 * The feature id for the '<em><b>Parent ID</b></em>' attribute.
@@ -3871,7 +3898,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__PARENT_ID = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 5;
+	int MODEL_COMPONENT__PARENT_ID = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 6;
 
 	/**
 	 * The feature id for the '<em><b>Children</b></em>' containment reference list.
@@ -3880,7 +3907,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__CHILDREN = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 6;
+	int MODEL_COMPONENT__CHILDREN = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 7;
 
 	/**
 	 * The feature id for the '<em><b>Commands</b></em>' containment reference list.
@@ -3889,7 +3916,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__COMMANDS = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 7;
+	int MODEL_COMPONENT__COMMANDS = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 8;
 
 	/**
 	 * The feature id for the '<em><b>Processor</b></em>' attribute.
@@ -3898,7 +3925,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT__PROCESSOR = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 8;
+	int MODEL_COMPONENT__PROCESSOR = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 9;
 
 	/**
 	 * The number of structural features of the '<em>Model Component</em>' class.
@@ -3907,7 +3934,7 @@
 	 * @generated
 	 * @ordered
 	 */
-	int MODEL_COMPONENT_FEATURE_COUNT = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 9;
+	int MODEL_COMPONENT_FEATURE_COUNT = PART_DESCRIPTOR_CONTAINER_FEATURE_COUNT + 10;
 
 	/**
 	 * The number of structural features of the '<em>VCommands V</em>' class.
@@ -3919,13 +3946,22 @@
 	int VCOMMANDS_V_FEATURE_COUNT = 0;
 
 	/**
-	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * The feature id for the '<em><b>Binding Tables</b></em>' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
 	 * @generated
 	 * @ordered
 	 */
-	int BINDING_CONTAINER__BINDINGS = 0;
+	int BINDING_CONTAINER__BINDING_TABLES = 0;
+
+	/**
+	 * The feature id for the '<em><b>Root Context</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTAINER__ROOT_CONTEXT = 1;
 
 	/**
 	 * The number of structural features of the '<em>Binding Container</em>' class.
@@ -3934,7 +3970,154 @@
 	 * @generated
 	 * @ordered
 	 */
-	int BINDING_CONTAINER_FEATURE_COUNT = 1;
+	int BINDING_CONTAINER_FEATURE_COUNT = 2;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.MBindings <em>Bindings</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.e4.ui.model.application.MBindings
+	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindings()
+	 * @generated
+	 */
+	int BINDINGS = 36;
+
+	/**
+	 * The feature id for the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDINGS__BINDING_CONTEXTS = 0;
+
+	/**
+	 * The number of structural features of the '<em>Bindings</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDINGS_FEATURE_COUNT = 1;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.BindingContextImpl <em>Binding Context</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.e4.ui.model.application.impl.BindingContextImpl
+	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindingContext()
+	 * @generated
+	 */
+	int BINDING_CONTEXT = 37;
+
+	/**
+	 * The feature id for the '<em><b>Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT__ID = APPLICATION_ELEMENT__ID;
+
+	/**
+	 * The feature id for the '<em><b>Tags</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT__TAGS = APPLICATION_ELEMENT__TAGS;
+
+	/**
+	 * The feature id for the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT__NAME = APPLICATION_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT__DESCRIPTION = APPLICATION_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The feature id for the '<em><b>Children</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT__CHILDREN = APPLICATION_ELEMENT_FEATURE_COUNT + 2;
+
+	/**
+	 * The number of structural features of the '<em>Binding Context</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_CONTEXT_FEATURE_COUNT = APPLICATION_ELEMENT_FEATURE_COUNT + 3;
+
+	/**
+	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.impl.BindingTableImpl <em>Binding Table</em>}' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see org.eclipse.e4.ui.model.application.impl.BindingTableImpl
+	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindingTable()
+	 * @generated
+	 */
+	int BINDING_TABLE = 38;
+
+	/**
+	 * The feature id for the '<em><b>Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_TABLE__ID = APPLICATION_ELEMENT__ID;
+
+	/**
+	 * The feature id for the '<em><b>Tags</b></em>' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_TABLE__TAGS = APPLICATION_ELEMENT__TAGS;
+
+	/**
+	 * The feature id for the '<em><b>Binding Context Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_TABLE__BINDING_CONTEXT_ID = APPLICATION_ELEMENT_FEATURE_COUNT + 0;
+
+	/**
+	 * The feature id for the '<em><b>Bindings</b></em>' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_TABLE__BINDINGS = APPLICATION_ELEMENT_FEATURE_COUNT + 1;
+
+	/**
+	 * The number of structural features of the '<em>Binding Table</em>' class.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 * @ordered
+	 */
+	int BINDING_TABLE_FEATURE_COUNT = APPLICATION_ELEMENT_FEATURE_COUNT + 2;
 
 	/**
 	 * The feature id for the '<em><b>Id</b></em>' attribute.
@@ -5708,7 +5891,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getItemType()
 	 * @generated
 	 */
-	int ITEM_TYPE = 55;
+	int ITEM_TYPE = 58;
 
 	/**
 	 * The meta object id for the '{@link org.eclipse.e4.ui.model.application.SideValue <em>Side Value</em>}' enum.
@@ -5718,7 +5901,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getSideValue()
 	 * @generated
 	 */
-	int SIDE_VALUE = 56;
+	int SIDE_VALUE = 59;
 
 	/**
 	 * The meta object id for the '<em>IEclipse Context</em>' data type.
@@ -5728,7 +5911,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getIEclipseContext()
 	 * @generated
 	 */
-	int IECLIPSE_CONTEXT = 57;
+	int IECLIPSE_CONTEXT = 60;
 
 	/**
 	 * The meta object id for the '<em>Parameterized Command</em>' data type.
@@ -5738,7 +5921,7 @@
 	 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getParameterizedCommand()
 	 * @generated
 	 */
-	int PARAMETERIZED_COMMAND = 58;
+	int PARAMETERIZED_COMMAND = 61;
 
 
 	/**
@@ -6576,15 +6759,122 @@
 	EClass getBindingContainer();
 
 	/**
-	 * Returns the meta object for the containment reference list '{@link org.eclipse.e4.ui.model.application.MBindingContainer#getBindings <em>Bindings</em>}'.
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.e4.ui.model.application.MBindingContainer#getBindingTables <em>Binding Tables</em>}'.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @return the meta object for the containment reference list '<em>Bindings</em>'.
-	 * @see org.eclipse.e4.ui.model.application.MBindingContainer#getBindings()
+	 * @return the meta object for the containment reference list '<em>Binding Tables</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContainer#getBindingTables()
 	 * @see #getBindingContainer()
 	 * @generated
 	 */
-	EReference getBindingContainer_Bindings();
+	EReference getBindingContainer_BindingTables();
+
+	/**
+	 * Returns the meta object for the containment reference '{@link org.eclipse.e4.ui.model.application.MBindingContainer#getRootContext <em>Root Context</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference '<em>Root Context</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContainer#getRootContext()
+	 * @see #getBindingContainer()
+	 * @generated
+	 */
+	EReference getBindingContainer_RootContext();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.e4.ui.model.application.MBindings <em>Bindings</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Bindings</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindings
+	 * @generated
+	 */
+	EClass getBindings();
+
+	/**
+	 * Returns the meta object for the attribute list '{@link org.eclipse.e4.ui.model.application.MBindings#getBindingContexts <em>Binding Contexts</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute list '<em>Binding Contexts</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindings#getBindingContexts()
+	 * @see #getBindings()
+	 * @generated
+	 */
+	EAttribute getBindings_BindingContexts();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.e4.ui.model.application.MBindingContext <em>Binding Context</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Binding Context</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContext
+	 * @generated
+	 */
+	EClass getBindingContext();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.e4.ui.model.application.MBindingContext#getName <em>Name</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Name</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContext#getName()
+	 * @see #getBindingContext()
+	 * @generated
+	 */
+	EAttribute getBindingContext_Name();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.e4.ui.model.application.MBindingContext#getDescription <em>Description</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Description</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContext#getDescription()
+	 * @see #getBindingContext()
+	 * @generated
+	 */
+	EAttribute getBindingContext_Description();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.e4.ui.model.application.MBindingContext#getChildren <em>Children</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Children</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContext#getChildren()
+	 * @see #getBindingContext()
+	 * @generated
+	 */
+	EReference getBindingContext_Children();
+
+	/**
+	 * Returns the meta object for class '{@link org.eclipse.e4.ui.model.application.MBindingTable <em>Binding Table</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for class '<em>Binding Table</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingTable
+	 * @generated
+	 */
+	EClass getBindingTable();
+
+	/**
+	 * Returns the meta object for the attribute '{@link org.eclipse.e4.ui.model.application.MBindingTable#getBindingContextId <em>Binding Context Id</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the attribute '<em>Binding Context Id</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingTable#getBindingContextId()
+	 * @see #getBindingTable()
+	 * @generated
+	 */
+	EAttribute getBindingTable_BindingContextId();
+
+	/**
+	 * Returns the meta object for the containment reference list '{@link org.eclipse.e4.ui.model.application.MBindingTable#getBindings <em>Bindings</em>}'.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @return the meta object for the containment reference list '<em>Bindings</em>'.
+	 * @see org.eclipse.e4.ui.model.application.MBindingTable#getBindings()
+	 * @see #getBindingTable()
+	 * @generated
+	 */
+	EReference getBindingTable_Bindings();
 
 	/**
 	 * Returns the meta object for class '{@link org.eclipse.e4.ui.model.application.MCommand <em>Command</em>}'.
@@ -7775,12 +8065,98 @@
 		EClass BINDING_CONTAINER = eINSTANCE.getBindingContainer();
 
 		/**
+		 * The meta object literal for the '<em><b>Binding Tables</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BINDING_CONTAINER__BINDING_TABLES = eINSTANCE.getBindingContainer_BindingTables();
+
+		/**
+		 * The meta object literal for the '<em><b>Root Context</b></em>' containment reference feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BINDING_CONTAINER__ROOT_CONTEXT = eINSTANCE.getBindingContainer_RootContext();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.e4.ui.model.application.MBindings <em>Bindings</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.e4.ui.model.application.MBindings
+		 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindings()
+		 * @generated
+		 */
+		EClass BINDINGS = eINSTANCE.getBindings();
+
+		/**
+		 * The meta object literal for the '<em><b>Binding Contexts</b></em>' attribute list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BINDINGS__BINDING_CONTEXTS = eINSTANCE.getBindings_BindingContexts();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.e4.ui.model.application.impl.BindingContextImpl <em>Binding Context</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.e4.ui.model.application.impl.BindingContextImpl
+		 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindingContext()
+		 * @generated
+		 */
+		EClass BINDING_CONTEXT = eINSTANCE.getBindingContext();
+
+		/**
+		 * The meta object literal for the '<em><b>Name</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BINDING_CONTEXT__NAME = eINSTANCE.getBindingContext_Name();
+
+		/**
+		 * The meta object literal for the '<em><b>Description</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BINDING_CONTEXT__DESCRIPTION = eINSTANCE.getBindingContext_Description();
+
+		/**
+		 * The meta object literal for the '<em><b>Children</b></em>' containment reference list feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EReference BINDING_CONTEXT__CHILDREN = eINSTANCE.getBindingContext_Children();
+
+		/**
+		 * The meta object literal for the '{@link org.eclipse.e4.ui.model.application.impl.BindingTableImpl <em>Binding Table</em>}' class.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @see org.eclipse.e4.ui.model.application.impl.BindingTableImpl
+		 * @see org.eclipse.e4.ui.model.application.impl.ApplicationPackageImpl#getBindingTable()
+		 * @generated
+		 */
+		EClass BINDING_TABLE = eINSTANCE.getBindingTable();
+
+		/**
+		 * The meta object literal for the '<em><b>Binding Context Id</b></em>' attribute feature.
+		 * <!-- begin-user-doc -->
+		 * <!-- end-user-doc -->
+		 * @generated
+		 */
+		EAttribute BINDING_TABLE__BINDING_CONTEXT_ID = eINSTANCE.getBindingTable_BindingContextId();
+
+		/**
 		 * The meta object literal for the '<em><b>Bindings</b></em>' containment reference list feature.
 		 * <!-- begin-user-doc -->
 		 * <!-- end-user-doc -->
 		 * @generated
 		 */
-		EReference BINDING_CONTAINER__BINDINGS = eINSTANCE.getBindingContainer_Bindings();
+		EReference BINDING_TABLE__BINDINGS = eINSTANCE.getBindingTable_Bindings();
 
 		/**
 		 * The meta object literal for the '{@link org.eclipse.e4.ui.model.application.impl.CommandImpl <em>Command</em>}' class.
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContainer.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContainer.java
index 13c1741..eb1adc1 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContainer.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContainer.java
@@ -20,7 +20,8 @@
  * <p>
  * The following features are supported:
  * <ul>
- *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContainer#getBindings <em>Bindings</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContainer#getBindingTables <em>Binding Tables</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContainer#getRootContext <em>Root Context</em>}</li>
  * </ul>
  * </p>
  *
@@ -30,19 +31,45 @@
  */
 public interface MBindingContainer {
 	/**
-	 * Returns the value of the '<em><b>Bindings</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MKeyBinding}.
+	 * Returns the value of the '<em><b>Binding Tables</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MBindingTable}.
 	 * <!-- begin-user-doc -->
 	 * <p>
-	 * If the meaning of the '<em>Bindings</em>' containment reference list isn't clear,
+	 * If the meaning of the '<em>Binding Tables</em>' containment reference list isn't clear,
 	 * there really should be more of a description here...
 	 * </p>
 	 * <!-- end-user-doc -->
-	 * @return the value of the '<em>Bindings</em>' containment reference list.
-	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContainer_Bindings()
+	 * @return the value of the '<em>Binding Tables</em>' containment reference list.
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContainer_BindingTables()
 	 * @model containment="true"
 	 * @generated
 	 */
-	EList<MKeyBinding> getBindings();
+	EList<MBindingTable> getBindingTables();
+
+	/**
+	 * Returns the value of the '<em><b>Root Context</b></em>' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Root Context</em>' containment reference isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Root Context</em>' containment reference.
+	 * @see #setRootContext(MBindingContext)
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContainer_RootContext()
+	 * @model containment="true"
+	 * @generated
+	 */
+	MBindingContext getRootContext();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.e4.ui.model.application.MBindingContainer#getRootContext <em>Root Context</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Root Context</em>' containment reference.
+	 * @see #getRootContext()
+	 * @generated
+	 */
+	void setRootContext(MBindingContext value);
 
 } // MBindingContainer
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContext.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContext.java
new file mode 100644
index 0000000..c68c281
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingContext.java
@@ -0,0 +1,102 @@
+/**
+ * Copyright (c) 2008 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.model.application;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Binding Context</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContext#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContext#getDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingContext#getChildren <em>Children</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContext()
+ * @model
+ * @generated
+ */
+public interface MBindingContext extends MApplicationElement {
+	/**
+	 * Returns the value of the '<em><b>Name</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Name</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Name</em>' attribute.
+	 * @see #setName(String)
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContext_Name()
+	 * @model
+	 * @generated
+	 */
+	String getName();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.e4.ui.model.application.MBindingContext#getName <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Name</em>' attribute.
+	 * @see #getName()
+	 * @generated
+	 */
+	void setName(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Description</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Description</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Description</em>' attribute.
+	 * @see #setDescription(String)
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContext_Description()
+	 * @model
+	 * @generated
+	 */
+	String getDescription();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.e4.ui.model.application.MBindingContext#getDescription <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Description</em>' attribute.
+	 * @see #getDescription()
+	 * @generated
+	 */
+	void setDescription(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Children</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MBindingContext}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Children</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Children</em>' containment reference list.
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingContext_Children()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<MBindingContext> getChildren();
+
+} // MBindingContext
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingTable.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingTable.java
new file mode 100644
index 0000000..238b092
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindingTable.java
@@ -0,0 +1,75 @@
+/**
+ * Copyright (c) 2008 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.model.application;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Binding Table</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingTable#getBindingContextId <em>Binding Context Id</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindingTable#getBindings <em>Bindings</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingTable()
+ * @model
+ * @generated
+ */
+public interface MBindingTable extends MApplicationElement {
+	/**
+	 * Returns the value of the '<em><b>Binding Context Id</b></em>' attribute.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Binding Context Id</em>' attribute isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Binding Context Id</em>' attribute.
+	 * @see #setBindingContextId(String)
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingTable_BindingContextId()
+	 * @model required="true"
+	 * @generated
+	 */
+	String getBindingContextId();
+
+	/**
+	 * Sets the value of the '{@link org.eclipse.e4.ui.model.application.MBindingTable#getBindingContextId <em>Binding Context Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @param value the new value of the '<em>Binding Context Id</em>' attribute.
+	 * @see #getBindingContextId()
+	 * @generated
+	 */
+	void setBindingContextId(String value);
+
+	/**
+	 * Returns the value of the '<em><b>Bindings</b></em>' containment reference list.
+	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MKeyBinding}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Bindings</em>' containment reference list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Bindings</em>' containment reference list.
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindingTable_Bindings()
+	 * @model containment="true"
+	 * @generated
+	 */
+	EList<MKeyBinding> getBindings();
+
+} // MBindingTable
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindings.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindings.java
new file mode 100644
index 0000000..456bc58
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MBindings.java
@@ -0,0 +1,48 @@
+/**
+ * Copyright (c) 2008 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.model.application;
+
+import org.eclipse.emf.common.util.EList;
+
+/**
+ * <!-- begin-user-doc -->
+ * A representation of the model object '<em><b>Bindings</b></em>'.
+ * <!-- end-user-doc -->
+ *
+ * <p>
+ * The following features are supported:
+ * <ul>
+ *   <li>{@link org.eclipse.e4.ui.model.application.MBindings#getBindingContexts <em>Binding Contexts</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindings()
+ * @model interface="true" abstract="true"
+ * @generated
+ */
+public interface MBindings {
+	/**
+	 * Returns the value of the '<em><b>Binding Contexts</b></em>' attribute list.
+	 * The list contents are of type {@link java.lang.String}.
+	 * <!-- begin-user-doc -->
+	 * <p>
+	 * If the meaning of the '<em>Binding Contexts</em>' attribute list isn't clear,
+	 * there really should be more of a description here...
+	 * </p>
+	 * <!-- end-user-doc -->
+	 * @return the value of the '<em>Binding Contexts</em>' attribute list.
+	 * @see org.eclipse.e4.ui.model.application.MApplicationPackage#getBindings_BindingContexts()
+	 * @model ordered="false"
+	 * @generated
+	 */
+	EList<String> getBindingContexts();
+
+} // MBindings
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MPart.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MPart.java
index daf521a..6aa3d54 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MPart.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MPart.java
@@ -30,7 +30,7 @@
  * @model
  * @generated
  */
-public interface MPart extends MContribution, MContext, MPSCElement, MUILabel, MHandlerContainer, MBindingContainer, MDirtyable {
+public interface MPart extends MContribution, MContext, MPSCElement, MUILabel, MHandlerContainer, MDirtyable, MBindings {
 	/**
 	 * Returns the value of the '<em><b>Menus</b></em>' containment reference list.
 	 * The list contents are of type {@link org.eclipse.e4.ui.model.application.MMenu}.
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MWindow.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MWindow.java
index fe3c424..a313c52 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MWindow.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/MWindow.java
@@ -31,7 +31,7 @@
  * @model
  * @generated
  */
-public interface MWindow extends MElementContainer<MPSCElement>, MUILabel, MContext, MHandlerContainer, MBindingContainer, MPSCElement {
+public interface MWindow extends MElementContainer<MPSCElement>, MUILabel, MContext, MHandlerContainer, MPSCElement, MBindings {
 	/**
 	 * Returns the value of the '<em><b>Main Menu</b></em>' containment reference.
 	 * <!-- begin-user-doc -->
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationFactoryImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationFactoryImpl.java
index d788c89..ec243ac 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationFactoryImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationFactoryImpl.java
@@ -84,6 +84,8 @@
 			case MApplicationPackage.WINDOW: return (EObject)createWindow();
 			case MApplicationPackage.MODEL_COMPONENTS: return (EObject)createModelComponents();
 			case MApplicationPackage.MODEL_COMPONENT: return (EObject)createModelComponent();
+			case MApplicationPackage.BINDING_CONTEXT: return (EObject)createBindingContext();
+			case MApplicationPackage.BINDING_TABLE: return (EObject)createBindingTable();
 			case MApplicationPackage.COMMAND: return (EObject)createCommand();
 			case MApplicationPackage.COMMAND_PARAMETER: return (EObject)createCommandParameter();
 			case MApplicationPackage.HANDLER: return (EObject)createHandler();
@@ -311,6 +313,26 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public MBindingContext createBindingContext() {
+		BindingContextImpl bindingContext = new BindingContextImpl();
+		return bindingContext;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MBindingTable createBindingTable() {
+		BindingTableImpl bindingTable = new BindingTableImpl();
+		return bindingTable;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public MCommand createCommand() {
 		CommandImpl command = new CommandImpl();
 		return command;
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationImpl.java
index 8b94206..b4266e8 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationImpl.java
@@ -16,6 +16,9 @@
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+import org.eclipse.e4.ui.model.application.MBindingTable;
+import org.eclipse.e4.ui.model.application.MBindings;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MContext;
 import org.eclipse.e4.ui.model.application.MHandler;
@@ -53,8 +56,10 @@
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getVariables <em>Variables</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getProperties <em>Properties</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getHandlers <em>Handlers</em>}</li>
- *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getBindings <em>Bindings</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getBindingTables <em>Binding Tables</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getRootContext <em>Root Context</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getDescriptors <em>Descriptors</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getBindingContexts <em>Binding Contexts</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ApplicationImpl#getCommands <em>Commands</em>}</li>
  * </ul>
  * </p>
@@ -113,14 +118,24 @@
 	protected EList<MHandler> handlers;
 
 	/**
-	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
+	 * The cached value of the '{@link #getBindingTables() <em>Binding Tables</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getBindings()
+	 * @see #getBindingTables()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<MKeyBinding> bindings;
+	protected EList<MBindingTable> bindingTables;
+
+	/**
+	 * The cached value of the '{@link #getRootContext() <em>Root Context</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRootContext()
+	 * @generated
+	 * @ordered
+	 */
+	protected MBindingContext rootContext;
 
 	/**
 	 * The cached value of the '{@link #getDescriptors() <em>Descriptors</em>}' containment reference list.
@@ -133,6 +148,16 @@
 	protected EList<MPartDescriptor> descriptors;
 
 	/**
+	 * The cached value of the '{@link #getBindingContexts() <em>Binding Contexts</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBindingContexts()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> bindingContexts;
+
+	/**
 	 * The cached value of the '{@link #getCommands() <em>Commands</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -223,11 +248,54 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<MKeyBinding> getBindings() {
-		if (bindings == null) {
-			bindings = new EObjectContainmentEList<MKeyBinding>(MKeyBinding.class, this, MApplicationPackage.APPLICATION__BINDINGS);
+	public EList<MBindingTable> getBindingTables() {
+		if (bindingTables == null) {
+			bindingTables = new EObjectContainmentEList<MBindingTable>(MBindingTable.class, this, MApplicationPackage.APPLICATION__BINDING_TABLES);
 		}
-		return bindings;
+		return bindingTables;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MBindingContext getRootContext() {
+		return rootContext;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRootContext(MBindingContext newRootContext, NotificationChain msgs) {
+		MBindingContext oldRootContext = rootContext;
+		rootContext = newRootContext;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MApplicationPackage.APPLICATION__ROOT_CONTEXT, oldRootContext, newRootContext);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRootContext(MBindingContext newRootContext) {
+		if (newRootContext != rootContext) {
+			NotificationChain msgs = null;
+			if (rootContext != null)
+				msgs = ((InternalEObject)rootContext).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MApplicationPackage.APPLICATION__ROOT_CONTEXT, null, msgs);
+			if (newRootContext != null)
+				msgs = ((InternalEObject)newRootContext).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MApplicationPackage.APPLICATION__ROOT_CONTEXT, null, msgs);
+			msgs = basicSetRootContext(newRootContext, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MApplicationPackage.APPLICATION__ROOT_CONTEXT, newRootContext, newRootContext));
 	}
 
 	/**
@@ -247,6 +315,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EList<String> getBindingContexts() {
+		if (bindingContexts == null) {
+			bindingContexts = new EDataTypeUniqueEList<String>(String.class, this, MApplicationPackage.APPLICATION__BINDING_CONTEXTS);
+		}
+		return bindingContexts;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EList<MCommand> getCommands() {
 		if (commands == null) {
 			commands = new EObjectContainmentEList<MCommand>(MCommand.class, this, MApplicationPackage.APPLICATION__COMMANDS);
@@ -266,8 +346,10 @@
 				return ((InternalEList<?>)getProperties()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.APPLICATION__HANDLERS:
 				return ((InternalEList<?>)getHandlers()).basicRemove(otherEnd, msgs);
-			case MApplicationPackage.APPLICATION__BINDINGS:
-				return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+				return ((InternalEList<?>)getBindingTables()).basicRemove(otherEnd, msgs);
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
+				return basicSetRootContext(null, msgs);
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 				return ((InternalEList<?>)getDescriptors()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.APPLICATION__COMMANDS:
@@ -293,10 +375,14 @@
 				else return getProperties().map();
 			case MApplicationPackage.APPLICATION__HANDLERS:
 				return getHandlers();
-			case MApplicationPackage.APPLICATION__BINDINGS:
-				return getBindings();
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+				return getBindingTables();
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
+				return getRootContext();
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 				return getDescriptors();
+			case MApplicationPackage.APPLICATION__BINDING_CONTEXTS:
+				return getBindingContexts();
 			case MApplicationPackage.APPLICATION__COMMANDS:
 				return getCommands();
 		}
@@ -326,14 +412,21 @@
 				getHandlers().clear();
 				getHandlers().addAll((Collection<? extends MHandler>)newValue);
 				return;
-			case MApplicationPackage.APPLICATION__BINDINGS:
-				getBindings().clear();
-				getBindings().addAll((Collection<? extends MKeyBinding>)newValue);
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+				getBindingTables().clear();
+				getBindingTables().addAll((Collection<? extends MBindingTable>)newValue);
+				return;
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
+				setRootContext((MBindingContext)newValue);
 				return;
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 				getDescriptors().clear();
 				getDescriptors().addAll((Collection<? extends MPartDescriptor>)newValue);
 				return;
+			case MApplicationPackage.APPLICATION__BINDING_CONTEXTS:
+				getBindingContexts().clear();
+				getBindingContexts().addAll((Collection<? extends String>)newValue);
+				return;
 			case MApplicationPackage.APPLICATION__COMMANDS:
 				getCommands().clear();
 				getCommands().addAll((Collection<? extends MCommand>)newValue);
@@ -362,12 +455,18 @@
 			case MApplicationPackage.APPLICATION__HANDLERS:
 				getHandlers().clear();
 				return;
-			case MApplicationPackage.APPLICATION__BINDINGS:
-				getBindings().clear();
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+				getBindingTables().clear();
+				return;
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
+				setRootContext((MBindingContext)null);
 				return;
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 				getDescriptors().clear();
 				return;
+			case MApplicationPackage.APPLICATION__BINDING_CONTEXTS:
+				getBindingContexts().clear();
+				return;
 			case MApplicationPackage.APPLICATION__COMMANDS:
 				getCommands().clear();
 				return;
@@ -391,10 +490,14 @@
 				return properties != null && !properties.isEmpty();
 			case MApplicationPackage.APPLICATION__HANDLERS:
 				return handlers != null && !handlers.isEmpty();
-			case MApplicationPackage.APPLICATION__BINDINGS:
-				return bindings != null && !bindings.isEmpty();
+			case MApplicationPackage.APPLICATION__BINDING_TABLES:
+				return bindingTables != null && !bindingTables.isEmpty();
+			case MApplicationPackage.APPLICATION__ROOT_CONTEXT:
+				return rootContext != null;
 			case MApplicationPackage.APPLICATION__DESCRIPTORS:
 				return descriptors != null && !descriptors.isEmpty();
+			case MApplicationPackage.APPLICATION__BINDING_CONTEXTS:
+				return bindingContexts != null && !bindingContexts.isEmpty();
 			case MApplicationPackage.APPLICATION__COMMANDS:
 				return commands != null && !commands.isEmpty();
 		}
@@ -424,7 +527,8 @@
 		}
 		if (baseClass == MBindingContainer.class) {
 			switch (derivedFeatureID) {
-				case MApplicationPackage.APPLICATION__BINDINGS: return MApplicationPackage.BINDING_CONTAINER__BINDINGS;
+				case MApplicationPackage.APPLICATION__BINDING_TABLES: return MApplicationPackage.BINDING_CONTAINER__BINDING_TABLES;
+				case MApplicationPackage.APPLICATION__ROOT_CONTEXT: return MApplicationPackage.BINDING_CONTAINER__ROOT_CONTEXT;
 				default: return -1;
 			}
 		}
@@ -434,6 +538,12 @@
 				default: return -1;
 			}
 		}
+		if (baseClass == MBindings.class) {
+			switch (derivedFeatureID) {
+				case MApplicationPackage.APPLICATION__BINDING_CONTEXTS: return MApplicationPackage.BINDINGS__BINDING_CONTEXTS;
+				default: return -1;
+			}
+		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
 	}
 
@@ -460,7 +570,8 @@
 		}
 		if (baseClass == MBindingContainer.class) {
 			switch (baseFeatureID) {
-				case MApplicationPackage.BINDING_CONTAINER__BINDINGS: return MApplicationPackage.APPLICATION__BINDINGS;
+				case MApplicationPackage.BINDING_CONTAINER__BINDING_TABLES: return MApplicationPackage.APPLICATION__BINDING_TABLES;
+				case MApplicationPackage.BINDING_CONTAINER__ROOT_CONTEXT: return MApplicationPackage.APPLICATION__ROOT_CONTEXT;
 				default: return -1;
 			}
 		}
@@ -470,6 +581,12 @@
 				default: return -1;
 			}
 		}
+		if (baseClass == MBindings.class) {
+			switch (baseFeatureID) {
+				case MApplicationPackage.BINDINGS__BINDING_CONTEXTS: return MApplicationPackage.APPLICATION__BINDING_CONTEXTS;
+				default: return -1;
+			}
+		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
@@ -487,6 +604,8 @@
 		result.append(context);
 		result.append(", variables: "); //$NON-NLS-1$
 		result.append(variables);
+		result.append(", bindingContexts: "); //$NON-NLS-1$
+		result.append(bindingContexts);
 		result.append(')');
 		return result.toString();
 	}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationPackageImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationPackageImpl.java
index ca2c3b7..7bed4be 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationPackageImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ApplicationPackageImpl.java
@@ -21,6 +21,9 @@
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+import org.eclipse.e4.ui.model.application.MBindingTable;
+import org.eclipse.e4.ui.model.application.MBindings;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MCommandParameter;
 import org.eclipse.e4.ui.model.application.MContext;
@@ -342,6 +345,27 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	private EClass bindingsEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass bindingContextEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	private EClass bindingTableEClass = null;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	private EClass commandEClass = null;
 
 	/**
@@ -1282,7 +1306,7 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EReference getBindingContainer_Bindings() {
+	public EReference getBindingContainer_BindingTables() {
 		return (EReference)bindingContainerEClass.getEStructuralFeatures().get(0);
 	}
 
@@ -1291,6 +1315,96 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EReference getBindingContainer_RootContext() {
+		return (EReference)bindingContainerEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBindings() {
+		return bindingsEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBindings_BindingContexts() {
+		return (EAttribute)bindingsEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBindingContext() {
+		return bindingContextEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBindingContext_Name() {
+		return (EAttribute)bindingContextEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBindingContext_Description() {
+		return (EAttribute)bindingContextEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBindingContext_Children() {
+		return (EReference)bindingContextEClass.getEStructuralFeatures().get(2);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EClass getBindingTable() {
+		return bindingTableEClass;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EAttribute getBindingTable_BindingContextId() {
+		return (EAttribute)bindingTableEClass.getEStructuralFeatures().get(0);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EReference getBindingTable_Bindings() {
+		return (EReference)bindingTableEClass.getEStructuralFeatures().get(1);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EClass getCommand() {
 		return commandEClass;
 	}
@@ -1827,7 +1941,20 @@
 		v______________Commands_______________VEClass = createEClass(VCOMMANDS_V);
 
 		bindingContainerEClass = createEClass(BINDING_CONTAINER);
-		createEReference(bindingContainerEClass, BINDING_CONTAINER__BINDINGS);
+		createEReference(bindingContainerEClass, BINDING_CONTAINER__BINDING_TABLES);
+		createEReference(bindingContainerEClass, BINDING_CONTAINER__ROOT_CONTEXT);
+
+		bindingsEClass = createEClass(BINDINGS);
+		createEAttribute(bindingsEClass, BINDINGS__BINDING_CONTEXTS);
+
+		bindingContextEClass = createEClass(BINDING_CONTEXT);
+		createEAttribute(bindingContextEClass, BINDING_CONTEXT__NAME);
+		createEAttribute(bindingContextEClass, BINDING_CONTEXT__DESCRIPTION);
+		createEReference(bindingContextEClass, BINDING_CONTEXT__CHILDREN);
+
+		bindingTableEClass = createEClass(BINDING_TABLE);
+		createEAttribute(bindingTableEClass, BINDING_TABLE__BINDING_CONTEXT_ID);
+		createEReference(bindingTableEClass, BINDING_TABLE__BINDINGS);
 
 		commandEClass = createEClass(COMMAND);
 		createEAttribute(commandEClass, COMMAND__COMMAND_NAME);
@@ -1979,14 +2106,16 @@
 		applicationEClass.getEGenericSuperTypes().add(g1);
 		g1 = createEGenericType(this.getPartDescriptorContainer());
 		applicationEClass.getEGenericSuperTypes().add(g1);
+		g1 = createEGenericType(this.getBindings());
+		applicationEClass.getEGenericSuperTypes().add(g1);
 		pscElementEClass.getESuperTypes().add(this.getUIElement());
 		partEClass.getESuperTypes().add(this.getContribution());
 		partEClass.getESuperTypes().add(this.getContext());
 		partEClass.getESuperTypes().add(this.getPSCElement());
 		partEClass.getESuperTypes().add(this.getUILabel());
 		partEClass.getESuperTypes().add(this.getHandlerContainer());
-		partEClass.getESuperTypes().add(this.getBindingContainer());
 		partEClass.getESuperTypes().add(this.getDirtyable());
+		partEClass.getESuperTypes().add(this.getBindings());
 		inputPartEClass.getESuperTypes().add(this.getPart());
 		inputPartEClass.getESuperTypes().add(this.getInput());
 		partDescriptorEClass.getESuperTypes().add(this.getPart());
@@ -2012,14 +2141,16 @@
 		windowEClass.getEGenericSuperTypes().add(g1);
 		g1 = createEGenericType(this.getHandlerContainer());
 		windowEClass.getEGenericSuperTypes().add(g1);
-		g1 = createEGenericType(this.getBindingContainer());
-		windowEClass.getEGenericSuperTypes().add(g1);
 		g1 = createEGenericType(this.getPSCElement());
 		windowEClass.getEGenericSuperTypes().add(g1);
+		g1 = createEGenericType(this.getBindings());
+		windowEClass.getEGenericSuperTypes().add(g1);
 		modelComponentEClass.getESuperTypes().add(this.getPartDescriptorContainer());
 		modelComponentEClass.getESuperTypes().add(this.getApplicationElement());
 		modelComponentEClass.getESuperTypes().add(this.getHandlerContainer());
 		modelComponentEClass.getESuperTypes().add(this.getBindingContainer());
+		bindingContextEClass.getESuperTypes().add(this.getApplicationElement());
+		bindingTableEClass.getESuperTypes().add(this.getApplicationElement());
 		commandEClass.getESuperTypes().add(this.getApplicationElement());
 		commandParameterEClass.getESuperTypes().add(this.getApplicationElement());
 		handlerEClass.getESuperTypes().add(this.getContribution());
@@ -2204,7 +2335,20 @@
 		initEClass(v______________Commands_______________VEClass, MV______________Commands_______________V.class, "V______________Commands_______________V", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 
 		initEClass(bindingContainerEClass, MBindingContainer.class, "BindingContainer", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
-		initEReference(getBindingContainer_Bindings(), this.getKeyBinding(), null, "bindings", null, 0, -1, MBindingContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getBindingContainer_BindingTables(), this.getBindingTable(), null, "bindingTables", null, 0, -1, MBindingContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getBindingContainer_RootContext(), this.getBindingContext(), null, "rootContext", null, 0, 1, MBindingContainer.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(bindingsEClass, MBindings.class, "Bindings", IS_ABSTRACT, IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getBindings_BindingContexts(), ecorePackage.getEString(), "bindingContexts", null, 0, -1, MBindings.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, !IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(bindingContextEClass, MBindingContext.class, "BindingContext", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getBindingContext_Name(), ecorePackage.getEString(), "name", null, 0, 1, MBindingContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEAttribute(getBindingContext_Description(), ecorePackage.getEString(), "description", null, 0, 1, MBindingContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getBindingContext_Children(), this.getBindingContext(), null, "children", null, 0, -1, MBindingContext.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+
+		initEClass(bindingTableEClass, MBindingTable.class, "BindingTable", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
+		initEAttribute(getBindingTable_BindingContextId(), ecorePackage.getEString(), "bindingContextId", null, 1, 1, MBindingTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
+		initEReference(getBindingTable_Bindings(), this.getKeyBinding(), null, "bindings", null, 0, -1, MBindingTable.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
 
 		initEClass(commandEClass, MCommand.class, "Command", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS); //$NON-NLS-1$
 		initEAttribute(getCommand_CommandName(), ecorePackage.getEString(), "commandName", null, 0, 1, MCommand.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingContextImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingContextImpl.java
new file mode 100644
index 0000000..22d42c6
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingContextImpl.java
@@ -0,0 +1,282 @@
+/**
+ * Copyright (c) 2008 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.model.application.impl;
+
+import java.util.Collection;
+
+import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Binding Context</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.BindingContextImpl#getName <em>Name</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.BindingContextImpl#getDescription <em>Description</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.BindingContextImpl#getChildren <em>Children</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class BindingContextImpl extends ApplicationElementImpl implements MBindingContext {
+	/**
+	 * The default value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String NAME_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getName() <em>Name</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getName()
+	 * @generated
+	 * @ordered
+	 */
+	protected String name = NAME_EDEFAULT;
+
+	/**
+	 * The default value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String DESCRIPTION_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getDescription() <em>Description</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getDescription()
+	 * @generated
+	 * @ordered
+	 */
+	protected String description = DESCRIPTION_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getChildren() <em>Children</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getChildren()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<MBindingContext> children;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BindingContextImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MApplicationPackage.Literals.BINDING_CONTEXT;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getName() {
+		return name;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setName(String newName) {
+		String oldName = name;
+		name = newName;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MApplicationPackage.BINDING_CONTEXT__NAME, oldName, name));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getDescription() {
+		return description;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setDescription(String newDescription) {
+		String oldDescription = description;
+		description = newDescription;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MApplicationPackage.BINDING_CONTEXT__DESCRIPTION, oldDescription, description));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<MBindingContext> getChildren() {
+		if (children == null) {
+			children = new EObjectContainmentEList<MBindingContext>(MBindingContext.class, this, MApplicationPackage.BINDING_CONTEXT__CHILDREN);
+		}
+		return children;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_CONTEXT__NAME:
+				return getName();
+			case MApplicationPackage.BINDING_CONTEXT__DESCRIPTION:
+				return getDescription();
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				return getChildren();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_CONTEXT__NAME:
+				setName((String)newValue);
+				return;
+			case MApplicationPackage.BINDING_CONTEXT__DESCRIPTION:
+				setDescription((String)newValue);
+				return;
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				getChildren().clear();
+				getChildren().addAll((Collection<? extends MBindingContext>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_CONTEXT__NAME:
+				setName(NAME_EDEFAULT);
+				return;
+			case MApplicationPackage.BINDING_CONTEXT__DESCRIPTION:
+				setDescription(DESCRIPTION_EDEFAULT);
+				return;
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				getChildren().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_CONTEXT__NAME:
+				return NAME_EDEFAULT == null ? name != null : !NAME_EDEFAULT.equals(name);
+			case MApplicationPackage.BINDING_CONTEXT__DESCRIPTION:
+				return DESCRIPTION_EDEFAULT == null ? description != null : !DESCRIPTION_EDEFAULT.equals(description);
+			case MApplicationPackage.BINDING_CONTEXT__CHILDREN:
+				return children != null && !children.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (name: "); //$NON-NLS-1$
+		result.append(name);
+		result.append(", description: "); //$NON-NLS-1$
+		result.append(description);
+		result.append(')');
+		return result.toString();
+	}
+
+} //BindingContextImpl
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingTableImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingTableImpl.java
new file mode 100644
index 0000000..7f43725
--- /dev/null
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/BindingTableImpl.java
@@ -0,0 +1,229 @@
+/**
+ * Copyright (c) 2008 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.model.application.impl;
+
+import java.util.Collection;
+
+import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindingTable;
+import org.eclipse.e4.ui.model.application.MKeyBinding;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.NotificationChain;
+
+import org.eclipse.emf.common.util.EList;
+
+import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.InternalEObject;
+
+import org.eclipse.emf.ecore.impl.ENotificationImpl;
+
+import org.eclipse.emf.ecore.util.EObjectContainmentEList;
+import org.eclipse.emf.ecore.util.InternalEList;
+
+/**
+ * <!-- begin-user-doc -->
+ * An implementation of the model object '<em><b>Binding Table</b></em>'.
+ * <!-- end-user-doc -->
+ * <p>
+ * The following features are implemented:
+ * <ul>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.BindingTableImpl#getBindingContextId <em>Binding Context Id</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.BindingTableImpl#getBindings <em>Bindings</em>}</li>
+ * </ul>
+ * </p>
+ *
+ * @generated
+ */
+public class BindingTableImpl extends ApplicationElementImpl implements MBindingTable {
+	/**
+	 * The default value of the '{@link #getBindingContextId() <em>Binding Context Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBindingContextId()
+	 * @generated
+	 * @ordered
+	 */
+	protected static final String BINDING_CONTEXT_ID_EDEFAULT = null;
+
+	/**
+	 * The cached value of the '{@link #getBindingContextId() <em>Binding Context Id</em>}' attribute.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBindingContextId()
+	 * @generated
+	 * @ordered
+	 */
+	protected String bindingContextId = BINDING_CONTEXT_ID_EDEFAULT;
+
+	/**
+	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBindings()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<MKeyBinding> bindings;
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	protected BindingTableImpl() {
+		super();
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	protected EClass eStaticClass() {
+		return MApplicationPackage.Literals.BINDING_TABLE;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public String getBindingContextId() {
+		return bindingContextId;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setBindingContextId(String newBindingContextId) {
+		String oldBindingContextId = bindingContextId;
+		bindingContextId = newBindingContextId;
+		if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID, oldBindingContextId, bindingContextId));
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public EList<MKeyBinding> getBindings() {
+		if (bindings == null) {
+			bindings = new EObjectContainmentEList<MKeyBinding>(MKeyBinding.class, this, MApplicationPackage.BINDING_TABLE__BINDINGS);
+		}
+		return bindings;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
+		}
+		return super.eInverseRemove(otherEnd, featureID, msgs);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public Object eGet(int featureID, boolean resolve, boolean coreType) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID:
+				return getBindingContextId();
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				return getBindings();
+		}
+		return super.eGet(featureID, resolve, coreType);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@SuppressWarnings("unchecked")
+	@Override
+	public void eSet(int featureID, Object newValue) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID:
+				setBindingContextId((String)newValue);
+				return;
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				getBindings().clear();
+				getBindings().addAll((Collection<? extends MKeyBinding>)newValue);
+				return;
+		}
+		super.eSet(featureID, newValue);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public void eUnset(int featureID) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID:
+				setBindingContextId(BINDING_CONTEXT_ID_EDEFAULT);
+				return;
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				getBindings().clear();
+				return;
+		}
+		super.eUnset(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public boolean eIsSet(int featureID) {
+		switch (featureID) {
+			case MApplicationPackage.BINDING_TABLE__BINDING_CONTEXT_ID:
+				return BINDING_CONTEXT_ID_EDEFAULT == null ? bindingContextId != null : !BINDING_CONTEXT_ID_EDEFAULT.equals(bindingContextId);
+			case MApplicationPackage.BINDING_TABLE__BINDINGS:
+				return bindings != null && !bindings.isEmpty();
+		}
+		return super.eIsSet(featureID);
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	@Override
+	public String toString() {
+		if (eIsProxy()) return super.toString();
+
+		StringBuffer result = new StringBuffer(super.toString());
+		result.append(" (bindingContextId: "); //$NON-NLS-1$
+		result.append(bindingContextId);
+		result.append(')');
+		return result.toString();
+	}
+
+} //BindingTableImpl
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ModelComponentImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ModelComponentImpl.java
index 43400f0..81a6cc9 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ModelComponentImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/ModelComponentImpl.java
@@ -15,6 +15,8 @@
 import org.eclipse.e4.ui.model.application.MApplicationElement;
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MHandler;
 import org.eclipse.e4.ui.model.application.MHandlerContainer;
@@ -46,7 +48,8 @@
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getId <em>Id</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getTags <em>Tags</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getHandlers <em>Handlers</em>}</li>
- *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getBindings <em>Bindings</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getBindingTables <em>Binding Tables</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getRootContext <em>Root Context</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getPositionInParent <em>Position In Parent</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getParentID <em>Parent ID</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.ModelComponentImpl#getChildren <em>Children</em>}</li>
@@ -99,14 +102,24 @@
 	protected EList<MHandler> handlers;
 
 	/**
-	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
+	 * The cached value of the '{@link #getBindingTables() <em>Binding Tables</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getBindings()
+	 * @see #getBindingTables()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<MKeyBinding> bindings;
+	protected EList<MBindingTable> bindingTables;
+
+	/**
+	 * The cached value of the '{@link #getRootContext() <em>Root Context</em>}' containment reference.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getRootContext()
+	 * @generated
+	 * @ordered
+	 */
+	protected MBindingContext rootContext;
 
 	/**
 	 * The default value of the '{@link #getPositionInParent() <em>Position In Parent</em>}' attribute.
@@ -323,11 +336,54 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<MKeyBinding> getBindings() {
-		if (bindings == null) {
-			bindings = new EObjectContainmentEList<MKeyBinding>(MKeyBinding.class, this, MApplicationPackage.MODEL_COMPONENT__BINDINGS);
+	public EList<MBindingTable> getBindingTables() {
+		if (bindingTables == null) {
+			bindingTables = new EObjectContainmentEList<MBindingTable>(MBindingTable.class, this, MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES);
 		}
-		return bindings;
+		return bindingTables;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public MBindingContext getRootContext() {
+		return rootContext;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public NotificationChain basicSetRootContext(MBindingContext newRootContext, NotificationChain msgs) {
+		MBindingContext oldRootContext = rootContext;
+		rootContext = newRootContext;
+		if (eNotificationRequired()) {
+			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET, MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT, oldRootContext, newRootContext);
+			if (msgs == null) msgs = notification; else msgs.add(notification);
+		}
+		return msgs;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
+	public void setRootContext(MBindingContext newRootContext) {
+		if (newRootContext != rootContext) {
+			NotificationChain msgs = null;
+			if (rootContext != null)
+				msgs = ((InternalEObject)rootContext).eInverseRemove(this, EOPPOSITE_FEATURE_BASE - MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT, null, msgs);
+			if (newRootContext != null)
+				msgs = ((InternalEObject)newRootContext).eInverseAdd(this, EOPPOSITE_FEATURE_BASE - MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT, null, msgs);
+			msgs = basicSetRootContext(newRootContext, msgs);
+			if (msgs != null) msgs.dispatch();
+		}
+		else if (eNotificationRequired())
+			eNotify(new ENotificationImpl(this, Notification.SET, MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT, newRootContext, newRootContext));
 	}
 
 	/**
@@ -361,8 +417,10 @@
 		switch (featureID) {
 			case MApplicationPackage.MODEL_COMPONENT__HANDLERS:
 				return ((InternalEList<?>)getHandlers()).basicRemove(otherEnd, msgs);
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
-				return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+				return ((InternalEList<?>)getBindingTables()).basicRemove(otherEnd, msgs);
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
+				return basicSetRootContext(null, msgs);
 			case MApplicationPackage.MODEL_COMPONENT__CHILDREN:
 				return ((InternalEList<?>)getChildren()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.MODEL_COMPONENT__COMMANDS:
@@ -385,8 +443,10 @@
 				return getTags();
 			case MApplicationPackage.MODEL_COMPONENT__HANDLERS:
 				return getHandlers();
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
-				return getBindings();
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+				return getBindingTables();
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
+				return getRootContext();
 			case MApplicationPackage.MODEL_COMPONENT__POSITION_IN_PARENT:
 				return getPositionInParent();
 			case MApplicationPackage.MODEL_COMPONENT__PARENT_ID:
@@ -421,9 +481,12 @@
 				getHandlers().clear();
 				getHandlers().addAll((Collection<? extends MHandler>)newValue);
 				return;
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
-				getBindings().clear();
-				getBindings().addAll((Collection<? extends MKeyBinding>)newValue);
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+				getBindingTables().clear();
+				getBindingTables().addAll((Collection<? extends MBindingTable>)newValue);
+				return;
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
+				setRootContext((MBindingContext)newValue);
 				return;
 			case MApplicationPackage.MODEL_COMPONENT__POSITION_IN_PARENT:
 				setPositionInParent((String)newValue);
@@ -463,8 +526,11 @@
 			case MApplicationPackage.MODEL_COMPONENT__HANDLERS:
 				getHandlers().clear();
 				return;
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
-				getBindings().clear();
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+				getBindingTables().clear();
+				return;
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
+				setRootContext((MBindingContext)null);
 				return;
 			case MApplicationPackage.MODEL_COMPONENT__POSITION_IN_PARENT:
 				setPositionInParent(POSITION_IN_PARENT_EDEFAULT);
@@ -499,8 +565,10 @@
 				return tags != null && !tags.isEmpty();
 			case MApplicationPackage.MODEL_COMPONENT__HANDLERS:
 				return handlers != null && !handlers.isEmpty();
-			case MApplicationPackage.MODEL_COMPONENT__BINDINGS:
-				return bindings != null && !bindings.isEmpty();
+			case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES:
+				return bindingTables != null && !bindingTables.isEmpty();
+			case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT:
+				return rootContext != null;
 			case MApplicationPackage.MODEL_COMPONENT__POSITION_IN_PARENT:
 				return POSITION_IN_PARENT_EDEFAULT == null ? positionInParent != null : !POSITION_IN_PARENT_EDEFAULT.equals(positionInParent);
 			case MApplicationPackage.MODEL_COMPONENT__PARENT_ID:
@@ -537,7 +605,8 @@
 		}
 		if (baseClass == MBindingContainer.class) {
 			switch (derivedFeatureID) {
-				case MApplicationPackage.MODEL_COMPONENT__BINDINGS: return MApplicationPackage.BINDING_CONTAINER__BINDINGS;
+				case MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES: return MApplicationPackage.BINDING_CONTAINER__BINDING_TABLES;
+				case MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT: return MApplicationPackage.BINDING_CONTAINER__ROOT_CONTEXT;
 				default: return -1;
 			}
 		}
@@ -566,7 +635,8 @@
 		}
 		if (baseClass == MBindingContainer.class) {
 			switch (baseFeatureID) {
-				case MApplicationPackage.BINDING_CONTAINER__BINDINGS: return MApplicationPackage.MODEL_COMPONENT__BINDINGS;
+				case MApplicationPackage.BINDING_CONTAINER__BINDING_TABLES: return MApplicationPackage.MODEL_COMPONENT__BINDING_TABLES;
+				case MApplicationPackage.BINDING_CONTAINER__ROOT_CONTEXT: return MApplicationPackage.MODEL_COMPONENT__ROOT_CONTEXT;
 				default: return -1;
 			}
 		}
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/PartImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/PartImpl.java
index 23b63ae..a1a66f2 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/PartImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/PartImpl.java
@@ -15,6 +15,7 @@
 import org.eclipse.e4.core.services.context.IEclipseContext;
 
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindings;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
 import org.eclipse.e4.ui.model.application.MContext;
 import org.eclipse.e4.ui.model.application.MDirtyable;
@@ -69,8 +70,8 @@
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getIconURI <em>Icon URI</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getTooltip <em>Tooltip</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getHandlers <em>Handlers</em>}</li>
- *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getBindings <em>Bindings</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#isDirty <em>Dirty</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getBindingContexts <em>Binding Contexts</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getMenus <em>Menus</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#getToolbar <em>Toolbar</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.PartImpl#isCloseable <em>Closeable</em>}</li>
@@ -311,16 +312,6 @@
 	protected EList<MHandler> handlers;
 
 	/**
-	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @see #getBindings()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<MKeyBinding> bindings;
-
-	/**
 	 * The default value of the '{@link #isDirty() <em>Dirty</em>}' attribute.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -341,6 +332,16 @@
 	protected boolean dirty = DIRTY_EDEFAULT;
 
 	/**
+	 * The cached value of the '{@link #getBindingContexts() <em>Binding Contexts</em>}' attribute list.
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @see #getBindingContexts()
+	 * @generated
+	 * @ordered
+	 */
+	protected EList<String> bindingContexts;
+
+	/**
 	 * The cached value of the '{@link #getMenus() <em>Menus</em>}' containment reference list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
@@ -692,18 +693,6 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<MKeyBinding> getBindings() {
-		if (bindings == null) {
-			bindings = new EObjectContainmentEList<MKeyBinding>(MKeyBinding.class, this, MApplicationPackage.PART__BINDINGS);
-		}
-		return bindings;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * @generated
-	 */
 	public boolean isDirty() {
 		return dirty;
 	}
@@ -725,6 +714,18 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
+	public EList<String> getBindingContexts() {
+		if (bindingContexts == null) {
+			bindingContexts = new EDataTypeUniqueEList<String>(String.class, this, MApplicationPackage.PART__BINDING_CONTEXTS);
+		}
+		return bindingContexts;
+	}
+
+	/**
+	 * <!-- begin-user-doc -->
+	 * <!-- end-user-doc -->
+	 * @generated
+	 */
 	public EList<MMenu> getMenus() {
 		if (menus == null) {
 			menus = new EObjectContainmentEList<MMenu>(MMenu.class, this, MApplicationPackage.PART__MENUS);
@@ -827,8 +828,6 @@
 				return basicSetParent(null, msgs);
 			case MApplicationPackage.PART__HANDLERS:
 				return ((InternalEList<?>)getHandlers()).basicRemove(otherEnd, msgs);
-			case MApplicationPackage.PART__BINDINGS:
-				return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.PART__MENUS:
 				return ((InternalEList<?>)getMenus()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.PART__TOOLBAR:
@@ -888,10 +887,10 @@
 				return getTooltip();
 			case MApplicationPackage.PART__HANDLERS:
 				return getHandlers();
-			case MApplicationPackage.PART__BINDINGS:
-				return getBindings();
 			case MApplicationPackage.PART__DIRTY:
 				return isDirty();
+			case MApplicationPackage.PART__BINDING_CONTEXTS:
+				return getBindingContexts();
 			case MApplicationPackage.PART__MENUS:
 				return getMenus();
 			case MApplicationPackage.PART__TOOLBAR:
@@ -955,13 +954,13 @@
 				getHandlers().clear();
 				getHandlers().addAll((Collection<? extends MHandler>)newValue);
 				return;
-			case MApplicationPackage.PART__BINDINGS:
-				getBindings().clear();
-				getBindings().addAll((Collection<? extends MKeyBinding>)newValue);
-				return;
 			case MApplicationPackage.PART__DIRTY:
 				setDirty((Boolean)newValue);
 				return;
+			case MApplicationPackage.PART__BINDING_CONTEXTS:
+				getBindingContexts().clear();
+				getBindingContexts().addAll((Collection<? extends String>)newValue);
+				return;
 			case MApplicationPackage.PART__MENUS:
 				getMenus().clear();
 				getMenus().addAll((Collection<? extends MMenu>)newValue);
@@ -1026,12 +1025,12 @@
 			case MApplicationPackage.PART__HANDLERS:
 				getHandlers().clear();
 				return;
-			case MApplicationPackage.PART__BINDINGS:
-				getBindings().clear();
-				return;
 			case MApplicationPackage.PART__DIRTY:
 				setDirty(DIRTY_EDEFAULT);
 				return;
+			case MApplicationPackage.PART__BINDING_CONTEXTS:
+				getBindingContexts().clear();
+				return;
 			case MApplicationPackage.PART__MENUS:
 				getMenus().clear();
 				return;
@@ -1081,10 +1080,10 @@
 				return TOOLTIP_EDEFAULT == null ? tooltip != null : !TOOLTIP_EDEFAULT.equals(tooltip);
 			case MApplicationPackage.PART__HANDLERS:
 				return handlers != null && !handlers.isEmpty();
-			case MApplicationPackage.PART__BINDINGS:
-				return bindings != null && !bindings.isEmpty();
 			case MApplicationPackage.PART__DIRTY:
 				return dirty != DIRTY_EDEFAULT;
+			case MApplicationPackage.PART__BINDING_CONTEXTS:
+				return bindingContexts != null && !bindingContexts.isEmpty();
 			case MApplicationPackage.PART__MENUS:
 				return menus != null && !menus.isEmpty();
 			case MApplicationPackage.PART__TOOLBAR:
@@ -1141,18 +1140,18 @@
 				default: return -1;
 			}
 		}
-		if (baseClass == MBindingContainer.class) {
-			switch (derivedFeatureID) {
-				case MApplicationPackage.PART__BINDINGS: return MApplicationPackage.BINDING_CONTAINER__BINDINGS;
-				default: return -1;
-			}
-		}
 		if (baseClass == MDirtyable.class) {
 			switch (derivedFeatureID) {
 				case MApplicationPackage.PART__DIRTY: return MApplicationPackage.DIRTYABLE__DIRTY;
 				default: return -1;
 			}
 		}
+		if (baseClass == MBindings.class) {
+			switch (derivedFeatureID) {
+				case MApplicationPackage.PART__BINDING_CONTEXTS: return MApplicationPackage.BINDINGS__BINDING_CONTEXTS;
+				default: return -1;
+			}
+		}
 		return super.eBaseStructuralFeatureID(derivedFeatureID, baseClass);
 	}
 
@@ -1202,18 +1201,18 @@
 				default: return -1;
 			}
 		}
-		if (baseClass == MBindingContainer.class) {
-			switch (baseFeatureID) {
-				case MApplicationPackage.BINDING_CONTAINER__BINDINGS: return MApplicationPackage.PART__BINDINGS;
-				default: return -1;
-			}
-		}
 		if (baseClass == MDirtyable.class) {
 			switch (baseFeatureID) {
 				case MApplicationPackage.DIRTYABLE__DIRTY: return MApplicationPackage.PART__DIRTY;
 				default: return -1;
 			}
 		}
+		if (baseClass == MBindings.class) {
+			switch (baseFeatureID) {
+				case MApplicationPackage.BINDINGS__BINDING_CONTEXTS: return MApplicationPackage.PART__BINDING_CONTEXTS;
+				default: return -1;
+			}
+		}
 		return super.eDerivedStructuralFeatureID(baseFeatureID, baseClass);
 	}
 
@@ -1251,6 +1250,8 @@
 		result.append(tooltip);
 		result.append(", dirty: "); //$NON-NLS-1$
 		result.append(dirty);
+		result.append(", bindingContexts: "); //$NON-NLS-1$
+		result.append(bindingContexts);
 		result.append(", closeable: "); //$NON-NLS-1$
 		result.append(closeable);
 		result.append(')');
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/WindowImpl.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/WindowImpl.java
index 348d2ad..ce72a00 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/WindowImpl.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/impl/WindowImpl.java
@@ -15,6 +15,7 @@
 import org.eclipse.e4.core.services.context.IEclipseContext;
 
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
+import org.eclipse.e4.ui.model.application.MBindings;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
 import org.eclipse.e4.ui.model.application.MContext;
 import org.eclipse.e4.ui.model.application.MHandler;
@@ -56,7 +57,7 @@
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getVariables <em>Variables</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getProperties <em>Properties</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getHandlers <em>Handlers</em>}</li>
- *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getBindings <em>Bindings</em>}</li>
+ *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getBindingContexts <em>Binding Contexts</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getMainMenu <em>Main Menu</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getX <em>X</em>}</li>
  *   <li>{@link org.eclipse.e4.ui.model.application.impl.WindowImpl#getY <em>Y</em>}</li>
@@ -179,14 +180,14 @@
 	protected EList<MHandler> handlers;
 
 	/**
-	 * The cached value of the '{@link #getBindings() <em>Bindings</em>}' containment reference list.
+	 * The cached value of the '{@link #getBindingContexts() <em>Binding Contexts</em>}' attribute list.
 	 * <!-- begin-user-doc -->
 	 * <!-- end-user-doc -->
-	 * @see #getBindings()
+	 * @see #getBindingContexts()
 	 * @generated
 	 * @ordered
 	 */
-	protected EList<MKeyBinding> bindings;
+	protected EList<String> bindingContexts;
 
 	/**
 	 * The cached value of the '{@link #getMainMenu() <em>Main Menu</em>}' containment reference.
@@ -422,11 +423,11 @@
 	 * <!-- end-user-doc -->
 	 * @generated
 	 */
-	public EList<MKeyBinding> getBindings() {
-		if (bindings == null) {
-			bindings = new EObjectContainmentEList<MKeyBinding>(MKeyBinding.class, this, MApplicationPackage.WINDOW__BINDINGS);
+	public EList<String> getBindingContexts() {
+		if (bindingContexts == null) {
+			bindingContexts = new EDataTypeUniqueEList<String>(String.class, this, MApplicationPackage.WINDOW__BINDING_CONTEXTS);
 		}
-		return bindings;
+		return bindingContexts;
 	}
 
 	/**
@@ -568,8 +569,6 @@
 				return ((InternalEList<?>)getProperties()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.WINDOW__HANDLERS:
 				return ((InternalEList<?>)getHandlers()).basicRemove(otherEnd, msgs);
-			case MApplicationPackage.WINDOW__BINDINGS:
-				return ((InternalEList<?>)getBindings()).basicRemove(otherEnd, msgs);
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				return basicSetMainMenu(null, msgs);
 		}
@@ -599,8 +598,8 @@
 				else return getProperties().map();
 			case MApplicationPackage.WINDOW__HANDLERS:
 				return getHandlers();
-			case MApplicationPackage.WINDOW__BINDINGS:
-				return getBindings();
+			case MApplicationPackage.WINDOW__BINDING_CONTEXTS:
+				return getBindingContexts();
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				return getMainMenu();
 			case MApplicationPackage.WINDOW__X:
@@ -647,9 +646,9 @@
 				getHandlers().clear();
 				getHandlers().addAll((Collection<? extends MHandler>)newValue);
 				return;
-			case MApplicationPackage.WINDOW__BINDINGS:
-				getBindings().clear();
-				getBindings().addAll((Collection<? extends MKeyBinding>)newValue);
+			case MApplicationPackage.WINDOW__BINDING_CONTEXTS:
+				getBindingContexts().clear();
+				getBindingContexts().addAll((Collection<? extends String>)newValue);
 				return;
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				setMainMenu((MMenu)newValue);
@@ -699,8 +698,8 @@
 			case MApplicationPackage.WINDOW__HANDLERS:
 				getHandlers().clear();
 				return;
-			case MApplicationPackage.WINDOW__BINDINGS:
-				getBindings().clear();
+			case MApplicationPackage.WINDOW__BINDING_CONTEXTS:
+				getBindingContexts().clear();
 				return;
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				setMainMenu((MMenu)null);
@@ -743,8 +742,8 @@
 				return properties != null && !properties.isEmpty();
 			case MApplicationPackage.WINDOW__HANDLERS:
 				return handlers != null && !handlers.isEmpty();
-			case MApplicationPackage.WINDOW__BINDINGS:
-				return bindings != null && !bindings.isEmpty();
+			case MApplicationPackage.WINDOW__BINDING_CONTEXTS:
+				return bindingContexts != null && !bindingContexts.isEmpty();
 			case MApplicationPackage.WINDOW__MAIN_MENU:
 				return mainMenu != null;
 			case MApplicationPackage.WINDOW__X:
@@ -788,14 +787,14 @@
 				default: return -1;
 			}
 		}
-		if (baseClass == MBindingContainer.class) {
+		if (baseClass == MPSCElement.class) {
 			switch (derivedFeatureID) {
-				case MApplicationPackage.WINDOW__BINDINGS: return MApplicationPackage.BINDING_CONTAINER__BINDINGS;
 				default: return -1;
 			}
 		}
-		if (baseClass == MPSCElement.class) {
+		if (baseClass == MBindings.class) {
 			switch (derivedFeatureID) {
+				case MApplicationPackage.WINDOW__BINDING_CONTEXTS: return MApplicationPackage.BINDINGS__BINDING_CONTEXTS;
 				default: return -1;
 			}
 		}
@@ -831,14 +830,14 @@
 				default: return -1;
 			}
 		}
-		if (baseClass == MBindingContainer.class) {
+		if (baseClass == MPSCElement.class) {
 			switch (baseFeatureID) {
-				case MApplicationPackage.BINDING_CONTAINER__BINDINGS: return MApplicationPackage.WINDOW__BINDINGS;
 				default: return -1;
 			}
 		}
-		if (baseClass == MPSCElement.class) {
+		if (baseClass == MBindings.class) {
 			switch (baseFeatureID) {
+				case MApplicationPackage.BINDINGS__BINDING_CONTEXTS: return MApplicationPackage.WINDOW__BINDING_CONTEXTS;
 				default: return -1;
 			}
 		}
@@ -865,6 +864,8 @@
 		result.append(context);
 		result.append(", variables: "); //$NON-NLS-1$
 		result.append(variables);
+		result.append(", bindingContexts: "); //$NON-NLS-1$
+		result.append(bindingContexts);
 		result.append(", x: "); //$NON-NLS-1$
 		result.append(x);
 		result.append(", y: "); //$NON-NLS-1$
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationAdapterFactory.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationAdapterFactory.java
index a10f2ad..2a0d8b5 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationAdapterFactory.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationAdapterFactory.java
@@ -221,6 +221,18 @@
 				return createBindingContainerAdapter();
 			}
 			@Override
+			public Adapter caseBindings(MBindings object) {
+				return createBindingsAdapter();
+			}
+			@Override
+			public Adapter caseBindingContext(MBindingContext object) {
+				return createBindingContextAdapter();
+			}
+			@Override
+			public Adapter caseBindingTable(MBindingTable object) {
+				return createBindingTableAdapter();
+			}
+			@Override
 			public Adapter caseCommand(MCommand object) {
 				return createCommandAdapter();
 			}
@@ -807,6 +819,48 @@
 	}
 
 	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.e4.ui.model.application.MBindings <em>Bindings</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.e4.ui.model.application.MBindings
+	 * @generated
+	 */
+	public Adapter createBindingsAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.e4.ui.model.application.MBindingContext <em>Binding Context</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.e4.ui.model.application.MBindingContext
+	 * @generated
+	 */
+	public Adapter createBindingContextAdapter() {
+		return null;
+	}
+
+	/**
+	 * Creates a new adapter for an object of class '{@link org.eclipse.e4.ui.model.application.MBindingTable <em>Binding Table</em>}'.
+	 * <!-- begin-user-doc -->
+	 * This default implementation returns null so that we can easily ignore cases;
+	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
+	 * <!-- end-user-doc -->
+	 * @return the new adapter.
+	 * @see org.eclipse.e4.ui.model.application.MBindingTable
+	 * @generated
+	 */
+	public Adapter createBindingTableAdapter() {
+		return null;
+	}
+
+	/**
 	 * Creates a new adapter for an object of class '{@link org.eclipse.e4.ui.model.application.MCommand <em>Command</em>}'.
 	 * <!-- begin-user-doc -->
 	 * This default implementation returns null so that we can easily ignore cases;
diff --git a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationSwitch.java b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationSwitch.java
index 8a00cff..9406615 100644
--- a/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationSwitch.java
+++ b/bundles/org.eclipse.e4.ui.model.workbench/src/org/eclipse/e4/ui/model/application/util/ApplicationSwitch.java
@@ -283,6 +283,7 @@
 				if (result == null) result = caseHandlerContainer(application);
 				if (result == null) result = caseBindingContainer(application);
 				if (result == null) result = casePartDescriptorContainer(application);
+				if (result == null) result = caseBindings(application);
 				if (result == null) result = caseUIElement(application);
 				if (result == null) result = caseApplicationElement(application);
 				if (result == null) result = defaultCase(theEObject);
@@ -304,8 +305,8 @@
 				if (result == null) result = casePSCElement(part);
 				if (result == null) result = caseUILabel(part);
 				if (result == null) result = caseHandlerContainer(part);
-				if (result == null) result = caseBindingContainer(part);
 				if (result == null) result = caseDirtyable(part);
+				if (result == null) result = caseBindings(part);
 				if (result == null) result = caseUIElement(part);
 				if (result == null) result = caseApplicationElement(part);
 				if (result == null) result = defaultCase(theEObject);
@@ -321,8 +322,8 @@
 				if (result == null) result = casePSCElement(inputPart);
 				if (result == null) result = caseUILabel(inputPart);
 				if (result == null) result = caseHandlerContainer(inputPart);
-				if (result == null) result = caseBindingContainer(inputPart);
 				if (result == null) result = caseDirtyable(inputPart);
+				if (result == null) result = caseBindings(inputPart);
 				if (result == null) result = caseUIElement(inputPart);
 				if (result == null) result = caseApplicationElement(inputPart);
 				if (result == null) result = defaultCase(theEObject);
@@ -337,8 +338,8 @@
 				if (result == null) result = casePSCElement(partDescriptor);
 				if (result == null) result = caseUILabel(partDescriptor);
 				if (result == null) result = caseHandlerContainer(partDescriptor);
-				if (result == null) result = caseBindingContainer(partDescriptor);
 				if (result == null) result = caseDirtyable(partDescriptor);
+				if (result == null) result = caseBindings(partDescriptor);
 				if (result == null) result = caseUIElement(partDescriptor);
 				if (result == null) result = caseApplicationElement(partDescriptor);
 				if (result == null) result = defaultCase(theEObject);
@@ -379,8 +380,8 @@
 				if (result == null) result = caseUILabel(window);
 				if (result == null) result = caseContext(window);
 				if (result == null) result = caseHandlerContainer(window);
-				if (result == null) result = caseBindingContainer(window);
 				if (result == null) result = casePSCElement(window);
+				if (result == null) result = caseBindings(window);
 				if (result == null) result = caseUIElement(window);
 				if (result == null) result = caseApplicationElement(window);
 				if (result == null) result = defaultCase(theEObject);
@@ -414,6 +415,26 @@
 				if (result == null) result = defaultCase(theEObject);
 				return result;
 			}
+			case MApplicationPackage.BINDINGS: {
+				MBindings bindings = (MBindings)theEObject;
+				T1 result = caseBindings(bindings);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case MApplicationPackage.BINDING_CONTEXT: {
+				MBindingContext bindingContext = (MBindingContext)theEObject;
+				T1 result = caseBindingContext(bindingContext);
+				if (result == null) result = caseApplicationElement(bindingContext);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
+			case MApplicationPackage.BINDING_TABLE: {
+				MBindingTable bindingTable = (MBindingTable)theEObject;
+				T1 result = caseBindingTable(bindingTable);
+				if (result == null) result = caseApplicationElement(bindingTable);
+				if (result == null) result = defaultCase(theEObject);
+				return result;
+			}
 			case MApplicationPackage.COMMAND: {
 				MCommand command = (MCommand)theEObject;
 				T1 result = caseCommand(command);
@@ -1115,6 +1136,51 @@
 	}
 
 	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Bindings</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Bindings</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T1 caseBindings(MBindings object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Binding Context</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Binding Context</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T1 caseBindingContext(MBindingContext object) {
+		return null;
+	}
+
+	/**
+	 * Returns the result of interpreting the object as an instance of '<em>Binding Table</em>'.
+	 * <!-- begin-user-doc -->
+	 * This implementation returns null;
+	 * returning a non-null result will terminate the switch.
+	 * <!-- end-user-doc -->
+	 * @param object the target of the switch.
+	 * @return the result of interpreting the object as an instance of '<em>Binding Table</em>'.
+	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
+	 * @generated
+	 */
+	public T1 caseBindingTable(MBindingTable object) {
+		return null;
+	}
+
+	/**
 	 * Returns the result of interpreting the object as an instance of '<em>Command</em>'.
 	 * <!-- begin-user-doc -->
 	 * This implementation returns null;
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/modeling/ModelReconciler.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/modeling/ModelReconciler.java
index 441e84a..d5424b2 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/modeling/ModelReconciler.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/modeling/ModelReconciler.java
@@ -203,10 +203,22 @@
 			.getTrimContainer_Side().getName();
 
 	/**
-	 * Attribute defined by MBindingContainers (value is <code>bindings</code>).
+	 * Attribute defined by MBindingContainers (value is <code>rootContext</code>).
 	 */
-	public static final String BINDINGCONTAINER_BINDINGS_ATTNAME = MApplicationPackage.eINSTANCE
-			.getBindingContainer_Bindings().getName();
+	public static final String BINDINGCONTAINER_ROOTCONTEXT_ATTNAME = MApplicationPackage.eINSTANCE
+			.getBindingContainer_RootContext().getName();
+
+	/**
+	 * Attribute defined by MBindingContainers (value is <code>bindingTables</code>).
+	 */
+	public static final String BINDINGCONTAINER_BINDINGTABLES_ATTNAME = MApplicationPackage.eINSTANCE
+			.getBindingContainer_BindingTables().getName();
+
+	/**
+	 * Attribute defined by MBindingTables (value is <code>bindings</code>).
+	 */
+	public static final String BINDINGTABLES_BINDINGS_ATTNAME = MApplicationPackage.eINSTANCE
+			.getBindingTable_Bindings().getName();
 
 	/**
 	 * Attribute defined by MHandlers (value is <code>command</code>).
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4CommandProcessor.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4CommandProcessor.java
index cd3deb2..ef0981c 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4CommandProcessor.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4CommandProcessor.java
@@ -11,16 +11,33 @@
 
 package org.eclipse.e4.workbench.ui.internal;
 
+import java.lang.reflect.InvocationTargetException;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import org.eclipse.core.commands.Category;
 import org.eclipse.core.commands.IParameter;
+import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.contexts.Context;
+import org.eclipse.core.commands.contexts.ContextManager;
 import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.services.context.IEclipseContext;
+import org.eclipse.e4.core.services.context.spi.ContextInjectionFactory;
+import org.eclipse.e4.ui.bindings.EBindingService;
+import org.eclipse.e4.ui.bindings.internal.BindingTable;
+import org.eclipse.e4.ui.bindings.internal.BindingTableManager;
 import org.eclipse.e4.ui.model.application.MApplication;
+import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindingContext;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MCommandParameter;
+import org.eclipse.e4.ui.model.application.MKeyBinding;
+import org.eclipse.e4.ui.model.application.MParameter;
 import org.eclipse.emf.common.util.EList;
+import org.eclipse.jface.bindings.Binding;
+import org.eclipse.jface.bindings.TriggerSequence;
 
 /**
  *
@@ -28,7 +45,7 @@
 public class E4CommandProcessor {
 	public static void processCommands(IEclipseContext context, List<MCommand> commands) {
 		// fill in commands
-		Activator.trace(Policy.DEBUG_CMDS, "Initialize service from model", null); //$NON-NLS-1$
+		Activator.trace(Policy.DEBUG_CMDS, "Initialize commands from model", null); //$NON-NLS-1$
 		ECommandService cs = (ECommandService) context.get(ECommandService.class.getName());
 		Category cat = cs
 				.defineCategory(MApplication.class.getName(), "Application Category", null); //$NON-NLS-1$
@@ -49,4 +66,72 @@
 		}
 
 	}
+
+	public static void processBindings(IEclipseContext context, MBindingContainer bindingContainer) {
+		Activator.trace(Policy.DEBUG_CMDS, "Initialize binding tables from model", null); //$NON-NLS-1$
+		MBindingContext root = bindingContainer.getRootContext();
+		if (root == null) {
+			return;
+		}
+		ContextManager manager = (ContextManager) context.get(ContextManager.class.getName());
+		defineContexts(null, root, manager);
+		BindingTableManager bindingTables;
+		try {
+			bindingTables = (BindingTableManager) ContextInjectionFactory.make(
+					BindingTableManager.class, context);
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return;
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return;
+		}
+		context.set(BindingTableManager.class.getName(), bindingTables);
+		for (MBindingTable bt : bindingContainer.getBindingTables()) {
+			Context c = manager.getContext(bt.getBindingContextId());
+			defineBindingTable(context, c, bindingTables, bt);
+		}
+	}
+
+	private static void defineBindingTable(IEclipseContext context, Context bindingContext,
+			BindingTableManager manager, MBindingTable bt) {
+		BindingTable table = new BindingTable(bindingContext);
+		manager.addTable(table);
+		ECommandService cs = (ECommandService) context.get(ECommandService.class.getName());
+		EBindingService bs = (EBindingService) context.get(EBindingService.class.getName());
+		EList<MKeyBinding> bindings = bt.getBindings();
+		for (MKeyBinding binding : bindings) {
+			Map<String, Object> parameters = null;
+			EList<MParameter> modelParms = binding.getParameters();
+			if (modelParms != null && !modelParms.isEmpty()) {
+				parameters = new HashMap<String, Object>();
+				for (MParameter mParm : modelParms) {
+					parameters.put(mParm.getTag(), mParm.getValue());
+				}
+			}
+			ParameterizedCommand cmd = cs.createCommand(binding.getCommand().getId(), parameters);
+			TriggerSequence sequence = bs.createSequence(binding.getKeySequence());
+			if (cmd == null || sequence == null) {
+				System.err.println("Failed to handle binding: " + binding); //$NON-NLS-1$
+			} else {
+				Binding keyBinding = bs.createBinding(sequence, cmd,
+						"org.eclipse.ui.defaultAcceleratorConfiguration", bindingContext.getId()); //$NON-NLS-1$
+				table.addBinding(keyBinding);
+			}
+		}
+	}
+
+	private static void defineContexts(MBindingContext parent, MBindingContext current,
+			ContextManager manager) {
+		Context context = manager.getContext(current.getId());
+		if (!context.isDefined()) {
+			context.define(current.getName(), current.getDescription(), parent == null ? null
+					: parent.getId());
+		}
+		for (MBindingContext child : current.getChildren()) {
+			defineContexts(current, child, manager);
+		}
+	}
 }
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4Workbench.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4Workbench.java
index 88142dd..1c42a63 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4Workbench.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/E4Workbench.java
@@ -11,14 +11,10 @@
  ******************************************************************************/
 package org.eclipse.e4.workbench.ui.internal;
 
-import java.util.HashMap;
 import java.util.Iterator;
-import java.util.Map;
-import org.eclipse.core.commands.ParameterizedCommand;
 import org.eclipse.core.commands.contexts.ContextManager;
 import org.eclipse.core.runtime.IAdapterManager;
 import org.eclipse.core.runtime.IExtensionRegistry;
-import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.commands.EHandlerService;
 import org.eclipse.e4.core.services.IContributionFactory;
 import org.eclipse.e4.core.services.Logger;
@@ -29,19 +25,17 @@
 import org.eclipse.e4.core.services.context.spi.ContextFunction;
 import org.eclipse.e4.core.services.context.spi.ContextInjectionFactory;
 import org.eclipse.e4.core.services.context.spi.IContextConstants;
-import org.eclipse.e4.ui.bindings.EBindingService;
 import org.eclipse.e4.ui.internal.services.ActiveContextsFunction;
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationElement;
-import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindings;
 import org.eclipse.e4.ui.model.application.MContext;
 import org.eclipse.e4.ui.model.application.MElementContainer;
 import org.eclipse.e4.ui.model.application.MHandler;
 import org.eclipse.e4.ui.model.application.MHandlerContainer;
-import org.eclipse.e4.ui.model.application.MKeyBinding;
-import org.eclipse.e4.ui.model.application.MParameter;
 import org.eclipse.e4.ui.model.application.MPart;
 import org.eclipse.e4.ui.model.application.MUIElement;
+import org.eclipse.e4.ui.services.EContextService;
 import org.eclipse.e4.ui.services.IServiceConstants;
 import org.eclipse.e4.ui.services.IStylingEngine;
 import org.eclipse.e4.workbench.ui.IExceptionHandler;
@@ -49,7 +43,6 @@
 import org.eclipse.e4.workbench.ui.IWorkbench;
 import org.eclipse.emf.common.notify.Notifier;
 import org.eclipse.emf.common.util.EList;
-import org.eclipse.jface.bindings.TriggerSequence;
 
 public class E4Workbench implements IWorkbench {
 	public static final String LOCAL_ACTIVE_SHELL = "localActiveShell"; //$NON-NLS-1$
@@ -112,6 +105,7 @@
 		Activator.trace(Policy.DEBUG_WORKBENCH, "init() workbench", null); //$NON-NLS-1$
 
 		E4CommandProcessor.processCommands(appElement.getContext(), appElement.getCommands());
+		E4CommandProcessor.processBindings(appElement.getContext(), appElement);
 
 		// Do a top level processHierarchy for the application?
 		processHierarchy(appElement);
@@ -237,31 +231,15 @@
 				}
 			}
 		}
-		if (me instanceof MBindingContainer) {
+		if (me instanceof MBindings) {
 			MContext contextModel = (MContext) me;
-			MBindingContainer container = (MBindingContainer) me;
+			MBindings container = (MBindings) me;
+			EList<String> bindingContexts = container.getBindingContexts();
 			IEclipseContext context = contextModel.getContext();
-			if (context != null) {
-				ECommandService cs = (ECommandService) context.get(ECommandService.class.getName());
-				EBindingService bs = (EBindingService) context.get(EBindingService.class.getName());
-				EList<MKeyBinding> bindings = container.getBindings();
-				for (MKeyBinding binding : bindings) {
-					Map<String, Object> parameters = null;
-					EList<MParameter> modelParms = binding.getParameters();
-					if (modelParms != null && !modelParms.isEmpty()) {
-						parameters = new HashMap<String, Object>();
-						for (MParameter mParm : modelParms) {
-							parameters.put(mParm.getTag(), mParm.getValue());
-						}
-					}
-					ParameterizedCommand cmd = cs.createCommand(binding.getCommand().getId(),
-							parameters);
-					TriggerSequence sequence = bs.createSequence(binding.getKeySequence());
-					if (cmd == null || sequence == null) {
-						System.err.println("Failed to handle binding: " + binding); //$NON-NLS-1$
-					} else {
-						bs.activateBinding(sequence, cmd);
-					}
+			if (context != null && !bindingContexts.isEmpty()) {
+				EContextService cs = (EContextService) context.get(EContextService.class.getName());
+				for (String id : bindingContexts) {
+					cs.activateContext(id);
 				}
 			}
 		}
diff --git a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/XMLModelReconciler.java b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/XMLModelReconciler.java
index e2e8b51..1fbcf0d 100644
--- a/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/XMLModelReconciler.java
+++ b/bundles/org.eclipse.e4.ui.workbench/src/org/eclipse/e4/workbench/ui/internal/XMLModelReconciler.java
@@ -27,6 +27,7 @@
 import org.eclipse.e4.ui.model.application.MApplicationElement;
 import org.eclipse.e4.ui.model.application.MApplicationPackage;
 import org.eclipse.e4.ui.model.application.MBindingContainer;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MContext;
 import org.eclipse.e4.ui.model.application.MContribution;
@@ -176,8 +177,12 @@
 			return MApplicationPackage.eINSTANCE.getCommand_Description();
 		} else if (featureName.equals(KEYSEQUENCE_KEYSEQUENCE_ATTNAME)) {
 			return MApplicationPackage.eINSTANCE.getKeySequence_KeySequence();
-		} else if (featureName.equals(BINDINGCONTAINER_BINDINGS_ATTNAME)) {
-			return MApplicationPackage.eINSTANCE.getBindingContainer_Bindings();
+		} else if (featureName.equals(BINDINGCONTAINER_BINDINGTABLES_ATTNAME)) {
+			return MApplicationPackage.eINSTANCE.getBindingContainer_BindingTables();
+		} else if (featureName.equals(BINDINGCONTAINER_ROOTCONTEXT_ATTNAME)) {
+			return MApplicationPackage.eINSTANCE.getBindingContainer_RootContext();
+		} else if (featureName.equals(BINDINGTABLES_BINDINGS_ATTNAME)) {
+			return MApplicationPackage.eINSTANCE.getBindingTable_Bindings();
 		} else if (featureName.equals(HANDLER_COMMAND_ATTNAME)
 				|| featureName.equals(KEYBINDING_COMMAND_ATTNAME)
 				|| featureName.equals(HANDLEDITEM_COMMAND_ATTNAME)) {
@@ -287,7 +292,15 @@
 		}
 
 		if (object instanceof MBindingContainer) {
-			for (MKeyBinding keyBinding : ((MBindingContainer) object).getBindings()) {
+			for (MBindingTable bindingTable : ((MBindingContainer) object).getBindingTables()) {
+				if (constructDeltas(deltas, references, (EObject) bindingTable, element, id)) {
+					return true;
+				}
+			}
+		}
+
+		if (object instanceof MBindingTable) {
+			for (MKeyBinding keyBinding : ((MBindingTable) object).getBindings()) {
 				if (constructDeltas(deltas, references, (EObject) keyBinding, element, id)) {
 					return true;
 				}
@@ -972,6 +985,37 @@
 			}
 		}
 
+		if (reference instanceof MBindingTable) {
+			EMap<EObject, EList<FeatureChange>> objectChanges = changeDescription
+					.getObjectChanges();
+
+			boolean bindingTablesChanged = false;
+
+			for (Entry<EObject, EList<FeatureChange>> entry : objectChanges.entrySet()) {
+				EObject key = entry.getKey();
+				if (key == rootObject) {
+					for (FeatureChange change : entry.getValue()) {
+						if (change.getFeatureName().equals(BINDINGCONTAINER_BINDINGTABLES_ATTNAME)) {
+							List<?> commands = (List<?>) change.getValue();
+							for (Object command : commands) {
+								if (command == reference) {
+									return key;
+								}
+							}
+
+							bindingTablesChanged = true;
+							break;
+						}
+					}
+					break;
+				}
+			}
+
+			if (!bindingTablesChanged) {
+				return reference.eContainer();
+			}
+		}
+
 		if (reference instanceof MHandler) {
 			EMap<EObject, EList<FeatureChange>> objectChanges = changeDescription
 					.getObjectChanges();
@@ -1010,9 +1054,9 @@
 
 			for (Entry<EObject, EList<FeatureChange>> entry : objectChanges.entrySet()) {
 				EObject key = entry.getKey();
-				if (key instanceof MBindingContainer) {
+				if (key instanceof MBindingTable) {
 					for (FeatureChange change : entry.getValue()) {
-						if (change.getFeatureName().equals(BINDINGCONTAINER_BINDINGS_ATTNAME)) {
+						if (change.getFeatureName().equals(BINDINGTABLES_BINDINGS_ATTNAME)) {
 							List<?> commands = (List<?>) change.getValue();
 							for (Object command : commands) {
 								if (command == reference) {
@@ -1485,7 +1529,7 @@
 		// an ElementContainer has multiple children
 		return featureName.equals(ELEMENTCONTAINER_CHILDREN_ATTNAME) ||
 		// a BindingContainer has multiple bindings
-				featureName.equals(BINDINGCONTAINER_BINDINGS_ATTNAME) ||
+				featureName.equals(BINDINGTABLES_BINDINGS_ATTNAME) ||
 				// a Part has multiple menus
 				featureName.equals(PART_MENUS_ATTNAME) ||
 				// an Application has multiple commands
diff --git a/examples/org.eclipse.e4.demo.contacts/Application.e4xmi b/examples/org.eclipse.e4.demo.contacts/Application.e4xmi
index e046c02..d5624ac 100644
--- a/examples/org.eclipse.e4.demo.contacts/Application.e4xmi
+++ b/examples/org.eclipse.e4.demo.contacts/Application.e4xmi
@@ -37,14 +37,21 @@
   <handlers xmi:id="_SeXUGe8EEd6FC9cDb6iV7g" id="_SeXUGe8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.DeleteContactHandler" command="contacts.delete"/>
   <handlers xmi:id="_SeXUGu8EEd6FC9cDb6iV7g" id="_SeXUGu8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.DarkThemeHandler" command="contacts.darkTheme"/>
   <handlers xmi:id="_SeXUG-8EEd6FC9cDb6iV7g" id="_SeXUG-8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.BrightThemeHandler" command="contacts.brightTheme"/>
-  <bindings xmi:id="_SeXUHO8EEd6FC9cDb6iV7g" keySequence="CTRL+D" id="_SeXUHO8EEd6FC9cDb6iV7g" command="contacts.darkTheme"/>
-  <bindings xmi:id="_SeXUHe8EEd6FC9cDb6iV7g" keySequence="CTRL+L" id="_SeXUHe8EEd6FC9cDb6iV7g" command="contacts.brightTheme"/>
-  <bindings xmi:id="_SeXUHu8EEd6FC9cDb6iV7g" keySequence="CTRL+S" id="_SeXUHu8EEd6FC9cDb6iV7g" command="contacts.save"/>
-  <bindings xmi:id="_SeXUH-8EEd6FC9cDb6iV7g" keySequence="Delete" id="_SeXUH-8EEd6FC9cDb6iV7g" command="contacts.delete"/>
-  <bindings xmi:id="_SeXUIO8EEd6FC9cDb6iV7g" keySequence="CTRL+5 X" id="_SeXUIO8EEd6FC9cDb6iV7g" command="contacts.exit"/>
+  <rootContext xmi:id="_SeXUHO8EEd6FC9cDb6iV7y" id="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7w" id="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" id="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <bindingTables xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" bindingContextId="org.eclipse.ui.contexts.dialogAndWindow">
+    <bindings xmi:id="_SeXUHO8EEd6FC9cDb6iV7g" keySequence="CTRL+D" id="_SeXUHO8EEd6FC9cDb6iV7g" command="contacts.darkTheme"/>
+    <bindings xmi:id="_SeXUHe8EEd6FC9cDb6iV7g" keySequence="CTRL+L" id="_SeXUHe8EEd6FC9cDb6iV7g" command="contacts.brightTheme"/>
+    <bindings xmi:id="_SeXUHu8EEd6FC9cDb6iV7g" keySequence="CTRL+S" id="_SeXUHu8EEd6FC9cDb6iV7g" command="contacts.save"/>
+    <bindings xmi:id="_SeXUH-8EEd6FC9cDb6iV7g" keySequence="Delete" id="_SeXUH-8EEd6FC9cDb6iV7g" command="contacts.delete"/>
+    <bindings xmi:id="_SeXUIO8EEd6FC9cDb6iV7g" keySequence="CTRL+5 X" id="_SeXUIO8EEd6FC9cDb6iV7g" command="contacts.exit"/>
+  </bindingTables>
   <commands xmi:id="contacts.exit" id="contacts.exit" commandName="Exit" description=""/>
   <commands xmi:id="contacts.darkTheme" id="contacts.darkTheme" commandName="Dark Theme"/>
   <commands xmi:id="contacts.brightTheme" id="contacts.brightTheme" commandName="Bright Theme" description=""/>
   <commands xmi:id="contacts.save" id="contacts.save" commandName="Save" description=""/>
   <commands xmi:id="contacts.delete" id="contacts.delete" commandName="Delete" description=""/>
+  <bindingContexts>org.eclipse.ui.contexts.dialogAndWindow</bindingContexts>
 </application:Application>
diff --git a/examples/org.eclipse.e4.demo.e4photo/Application.e4xmi b/examples/org.eclipse.e4.demo.e4photo/Application.e4xmi
index 8174523..1d65549 100644
--- a/examples/org.eclipse.e4.demo.e4photo/Application.e4xmi
+++ b/examples/org.eclipse.e4.demo.e4photo/Application.e4xmi
@@ -47,11 +47,18 @@
   <handlers xmi:id="_AXeqWu8IEd6FC9cDb6iV7g" id="_AXeqWu8IEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.SwitchPerspectiveHandler" command="e4photo.switchPersepective"/>
   <handlers xmi:id="_AXeqW-8IEd6FC9cDb6iV7g" id="_AXeqW-8IEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.ImageDialogHandler" command="e4photo.imageDialog"/>
   <handlers id="e4.photo.demo.addNote.handler" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.AddNoteHandler" persistedState="" command="//@commands.4"/>
-  <bindings xmi:id="_AXeqXO8IEd6FC9cDb6iV7g" keySequence="CTRL+Q" id="_AXeqXO8IEd6FC9cDb6iV7g" command="e4photo.exit"/>
-  <bindings xmi:id="_AXeqXe8IEd6FC9cDb6iV7g" keySequence="CTRL+N" id="_AXeqXe8IEd6FC9cDb6iV7g" command="e4photo.createAlbum"/>
+  <rootContext xmi:id="_SeXUHO8EEd6FC9cDb6iV7y" id="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7w" id="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" id="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <bindingTables xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" bindingContextId="org.eclipse.ui.contexts.dialogAndWindow">
+    <bindings xmi:id="_AXeqXO8IEd6FC9cDb6iV7g" keySequence="CTRL+Q" id="_AXeqXO8IEd6FC9cDb6iV7g" command="e4photo.exit"/>
+    <bindings xmi:id="_AXeqXe8IEd6FC9cDb6iV7g" keySequence="CTRL+N" id="_AXeqXe8IEd6FC9cDb6iV7g" command="e4photo.createAlbum"/>
+  </bindingTables>
   <commands xmi:id="e4photo.exit" id="e4photo.exit" commandName="Exit" description=""/>
   <commands xmi:id="e4photo.createAlbum" id="e4photo.createAlbum" commandName="Create Album"/>
   <commands xmi:id="e4photo.switchPersepective" id="e4photo.switchPersepective" commandName="Switch Perspective" description=""/>
   <commands xmi:id="e4photo.imageDialog" id="e4photo.imageDialog" commandName="Image Dialog" description=""/>
   <commands id="e4photo.addNote" commandName="Add Note"/>
+  <bindingContexts>org.eclipse.ui.contexts.dialogAndWindow</bindingContexts>
 </application:Application>
diff --git a/tests/org.eclipse.e4.ui.bindings.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.e4.ui.bindings.tests/META-INF/MANIFEST.MF
index 2ba9412..2babc80 100644
--- a/tests/org.eclipse.e4.ui.bindings.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.e4.ui.bindings.tests/META-INF/MANIFEST.MF
@@ -12,6 +12,8 @@
  org.eclipse.e4.core.services.annotations,
  org.eclipse.e4.core.services.context,
  org.eclipse.e4.core.services.context.spi,
+ org.eclipse.e4.ui.internal.services,
+ org.eclipse.e4.ui.services,
  org.eclipse.jface.bindings,
  org.eclipse.jface.bindings.keys,
  org.eclipse.jface.bindings.keys.formatting,
diff --git a/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/BindingLookupTest.java b/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/BindingLookupTest.java
index c91bc2a..bbbd0f4 100644
--- a/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/BindingLookupTest.java
+++ b/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/BindingLookupTest.java
@@ -1,5 +1,7 @@
 package org.eclipse.e4.ui.bindings.tests;
 
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
 
@@ -7,15 +9,36 @@
 
 import org.eclipse.core.commands.Category;
 import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.contexts.Context;
+import org.eclipse.core.commands.contexts.ContextManager;
 import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.services.IDisposable;
 import org.eclipse.e4.core.services.context.IEclipseContext;
+import org.eclipse.e4.core.services.context.spi.ContextInjectionFactory;
 import org.eclipse.e4.core.services.context.spi.IContextConstants;
 import org.eclipse.e4.ui.bindings.EBindingService;
+import org.eclipse.e4.ui.bindings.internal.BindingTable;
+import org.eclipse.e4.ui.bindings.internal.BindingTableManager;
+import org.eclipse.e4.ui.bindings.internal.ContextSet;
+import org.eclipse.e4.ui.internal.services.ActiveContextsFunction;
+import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.services.IServiceConstants;
 import org.eclipse.jface.bindings.Binding;
 import org.eclipse.jface.bindings.TriggerSequence;
 
 public class BindingLookupTest extends TestCase {
+	private static final String ID_DIALOG = "org.eclipse.ui.contexts.dialog";
+	private static final String ID_DIALOG_AND_WINDOW = "org.eclipse.ui.contexts.dialogAndWindow";
+	private static final String ID_WINDOW = "org.eclipse.ui.contexts.window";
+	private static final String ID_TEXT = "org.eclipse.ui.textScope";
+	private static final String ID_JAVA = "org.eclipse.jdt.ui.javaScope";
+	private static final String ID_JS = "org.eclipse.wst.jsdt.ui.javaScriptScope";
+
+	final static String[] CONTEXTS = { ID_DIALOG_AND_WINDOW, "DAW", null,
+			ID_DIALOG, "Dialog", ID_DIALOG_AND_WINDOW, ID_WINDOW, "Window",
+			ID_DIALOG_AND_WINDOW, ID_TEXT, "Text Scope", ID_WINDOW, ID_JAVA,
+			"Java scope", ID_TEXT, ID_JS, "JavaScript scope", ID_TEXT, };
+
 	private static final String TEST_CAT1 = "test.cat1";
 	private static final String TEST_ID1 = "test.id1";
 	private static final String TEST_ID2 = "test.id2";
@@ -41,6 +64,43 @@
 		workbenchContext = createWorkbenchContext(Activator.getDefault()
 				.getGlobalContext());
 		defineCommands(workbenchContext);
+		defineContexts(workbenchContext);
+		defineBindingTables(workbenchContext);
+	}
+
+	private void defineContexts(IEclipseContext context) {
+		ContextManager contextManager = new ContextManager();
+		context.set(ContextManager.class.getName(), contextManager);
+		ContextSet.setComparator(new ContextSet.CComp(contextManager));
+		for (int i = 0; i < CONTEXTS.length; i += 3) {
+			Context c = contextManager.getContext(CONTEXTS[i]);
+			c.define(CONTEXTS[i + 1], null, CONTEXTS[i + 2]);
+		}
+
+		EContextService cs = (EContextService) context
+				.get(EContextService.class.getName());
+		cs.activateContext(ID_DIALOG_AND_WINDOW);
+		context.set(IServiceConstants.ACTIVE_CONTEXTS,
+				new ActiveContextsFunction());
+	}
+
+	private void defineBindingTables(IEclipseContext context) {
+		try {
+			BindingTableManager btm = (BindingTableManager) ContextInjectionFactory
+					.make(BindingTableManager.class, context);
+			context.set(BindingTableManager.class.getName(), btm);
+			ContextManager cm = (ContextManager) context
+					.get(ContextManager.class.getName());
+			btm.addTable(new BindingTable(cm.getContext(ID_DIALOG_AND_WINDOW)));
+			btm.addTable(new BindingTable(cm.getContext(ID_WINDOW)));
+			btm.addTable(new BindingTable(cm.getContext(ID_DIALOG)));
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
 	}
 
 	@Override
@@ -58,13 +118,14 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
-		bs.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
 		Binding perfectMatch = bs.getPerfectMatch(seq);
 		assertEquals(cmd, perfectMatch.getParameterizedCommand());
-		bs.deactivateBinding(seq, cmd);
+		bs.deactivateBinding(db);
 		assertNull(bs.getPerfectMatch(seq));
 
-		bs.activateBinding(seq, cmd);
+		bs.activateBinding(db);
 		assertEquals(cmd, bs.getPerfectMatch(seq).getParameterizedCommand());
 	}
 
@@ -76,8 +137,10 @@
 				.get(EBindingService.class.getName());
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
 		TriggerSequence seq2 = bs.createSequence("CTRL+2 X");
-		bs.activateBinding(seq, cmd);
-		bs.activateBinding(seq2, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
+		db = createDefaultBinding(bs, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
 
 		assertEquals(cmd, bs.getPerfectMatch(seq).getParameterizedCommand());
 		assertEquals(cmd, bs.getPerfectMatch(seq2).getParameterizedCommand());
@@ -93,13 +156,14 @@
 		EBindingService bs1 = (EBindingService) c1.get(EBindingService.class
 				.getName());
 		TriggerSequence seq = bs1.createSequence("CTRL+5 T");
-		bs1.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs1, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs1.activateBinding(db);
 		EBindingService wBS = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		assertEquals(cmd, wBS.getPerfectMatch(seq).getParameterizedCommand());
 		assertEquals(cmd, bs1.getPerfectMatch(seq).getParameterizedCommand());
 
-		bs1.deactivateBinding(seq, cmd);
+		bs1.deactivateBinding(db);
 		assertNull(wBS.getPerfectMatch(seq));
 		assertNull(bs1.getPerfectMatch(seq));
 	}
@@ -116,16 +180,22 @@
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
+		EContextService es = (EContextService) c1.get(EContextService.class.getName());
+		es.activateContext(ID_WINDOW);
 
 		EBindingService bs1 = (EBindingService) c1.get(EBindingService.class
 				.getName());
-		bs1.activateBinding(seq, cmd1);
+		Binding db = createDefaultBinding(bs1, seq, cmd1, ID_WINDOW);
+		bs1.activateBinding(db);
 
 		IEclipseContext c2 = TestUtil.createContext(workbenchContext, "c2");
+		EContextService es2 = (EContextService) c2.get(EContextService.class.getName());
+		es2.activateContext(ID_DIALOG);
 
 		EBindingService bs2 = (EBindingService) c2.get(EBindingService.class
 				.getName());
-		bs2.activateBinding(seq, cmd2);
+		db = createDefaultBinding(bs1, seq, cmd2, ID_DIALOG);
+		bs2.activateBinding(db);
 
 		assertEquals(cmd1, wBS.getPerfectMatch(seq).getParameterizedCommand());
 		assertEquals(cmd1, bs1.getPerfectMatch(seq).getParameterizedCommand());
@@ -144,16 +214,22 @@
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
+		EContextService es = (EContextService) c1.get(EContextService.class.getName());
+		es.activateContext(ID_WINDOW);
 
 		EBindingService bs1 = (EBindingService) c1.get(EBindingService.class
 				.getName());
-		bs1.activateBinding(seq, cmd1);
+		Binding db = createDefaultBinding(bs1, seq, cmd1, ID_WINDOW);
+		bs1.activateBinding(db);
 
 		IEclipseContext c2 = TestUtil.createContext(workbenchContext, "c2");
+		EContextService es2 = (EContextService) c2.get(EContextService.class.getName());
+		es2.activateContext(ID_DIALOG);
 
 		EBindingService bs2 = (EBindingService) c2.get(EBindingService.class
 				.getName());
-		bs2.activateBinding(seq, cmd2);
+		db = createDefaultBinding(bs1, seq, cmd2, ID_DIALOG);
+		bs2.activateBinding(db);
 
 		assertEquals(cmd1, bs1.getPerfectMatch(seq).getParameterizedCommand());
 		assertEquals(cmd2, bs2.getPerfectMatch(seq).getParameterizedCommand());
@@ -184,7 +260,8 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
-		bs.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
 
 		assertEquals(seq, bs.getBestSequenceFor(cmd));
 	}
@@ -197,8 +274,10 @@
 				.get(EBindingService.class.getName());
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
 		TriggerSequence seq2 = bs.createSequence("CTRL+2 X");
-		bs.activateBinding(seq, cmd);
-		bs.activateBinding(seq2, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
+		Binding db2 = createDefaultBinding(bs, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db2);
 
 		TriggerSequence foundSequence = bs.getBestSequenceFor(cmd);
 		assertNotNull(foundSequence);
@@ -212,10 +291,12 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = bs.createSequence("ALT+5 X");
-		bs.activateBinding(seq2, cmd);
+		Binding db2 = createDefaultBinding(bs, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db2);
 
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
-		bs.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
 
 		TriggerSequence foundSequence = bs.getBestSequenceFor(cmd);
 		assertNotNull(foundSequence);
@@ -229,7 +310,8 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = bs.createSequence("CTRL+5 T");
-		bs.activateBinding(seq2, cmd);
+		Binding db2 = createDefaultBinding(bs, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db2);
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
@@ -237,11 +319,12 @@
 				.getName());
 
 		TriggerSequence seq = bs1.createSequence("ALT+5 X");
-		bs1.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs1.activateBinding(db);
 
 		TriggerSequence foundSequence = bs.getBestSequenceFor(cmd);
 		assertNotNull(foundSequence);
-		assertEquals(seq, foundSequence);
+		assertEquals(seq2, foundSequence);
 	}
 
 	public void testLookupShortcutsTwoChildren() throws Exception {
@@ -256,16 +339,22 @@
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
+		EContextService es = (EContextService) c1.get(EContextService.class.getName());
+		es.activateContext(ID_WINDOW);
 
 		EBindingService bs1 = (EBindingService) c1.get(EBindingService.class
 				.getName());
-		bs1.activateBinding(seq, cmd1);
+		Binding db = createDefaultBinding(bs1, seq, cmd1, ID_WINDOW);
+		bs1.activateBinding(db);
 
 		IEclipseContext c2 = TestUtil.createContext(workbenchContext, "c2");
+		EContextService es2 = (EContextService) c2.get(EContextService.class.getName());
+		es2.activateContext(ID_DIALOG);
 
 		EBindingService bs2 = (EBindingService) c2.get(EBindingService.class
 				.getName());
-		bs2.activateBinding(seq, cmd2);
+		Binding db2 = createDefaultBinding(bs2, seq, cmd2, ID_DIALOG);
+		bs2.activateBinding(db2);
 
 		assertEquals(seq, wBS.getBestSequenceFor(cmd1));
 		assertNull(wBS.getBestSequenceFor(cmd2));
@@ -284,16 +373,19 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = bs.createSequence("ALT+5 X");
-		bs.activateBinding(seq2, cmd);
+		Binding db2 = createDefaultBinding(bs, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db2);
 
 		TriggerSequence seq = bs.createSequence("CTRL+5 T");
-		bs.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs.activateBinding(db);
 
-		HashSet<TriggerSequence> set = new HashSet<TriggerSequence>();
-		set.add(seq);
-		set.add(seq2);
+		// the list will always be ordered
+		ArrayList<TriggerSequence> list = new ArrayList<TriggerSequence>();
+		list.add(seq);
+		list.add(seq2);
 
-		assertEquals(set, bs.getSequencesFor(cmd));
+		assertEquals(list, bs.getSequencesFor(cmd));
 	}
 
 	public void testLookupAllShortcutsWithChild() throws Exception {
@@ -304,21 +396,26 @@
 		EBindingService wBS = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = wBS.createSequence("ALT+5 X");
-		wBS.activateBinding(seq2, cmd);
+		Binding db2 = createDefaultBinding(wBS, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		wBS.activateBinding(db2);
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
+		EContextService es = (EContextService) c1.get(EContextService.class.getName());
+		es.activateContext(ID_WINDOW);
 		EBindingService bs1 = (EBindingService) c1.get(EBindingService.class
 				.getName());
 
 		TriggerSequence seq = bs1.createSequence("CTRL+5 T");
-		bs1.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(wBS, seq, cmd, ID_WINDOW);
+		bs1.activateBinding(db);
 
-		HashSet<TriggerSequence> set = new HashSet<TriggerSequence>();
-		set.add(seq);
-		set.add(seq2);
+		// the list will always be ordered
+		ArrayList<TriggerSequence> list = new ArrayList<TriggerSequence>();
+		list.add(seq);
+		list.add(seq2);
 
-		assertEquals(set, wBS.getSequencesFor(cmd));
+		assertEquals(list, wBS.getSequencesFor(cmd));
 	}
 
 	public void testPartialMatch() throws Exception {
@@ -329,7 +426,8 @@
 		EBindingService wBS = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = wBS.createSequence("ALT+5 X");
-		wBS.activateBinding(seq2, cmd);
+		Binding db2 = createDefaultBinding(wBS, seq2, cmd, ID_DIALOG_AND_WINDOW);
+		wBS.activateBinding(db2);
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
@@ -337,7 +435,8 @@
 				.getName());
 
 		TriggerSequence seq = bs1.createSequence("CTRL+5 T");
-		bs1.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(wBS, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs1.activateBinding(db);
 
 		TriggerSequence partialMatch = bs1.createSequence("CTRL+5");
 		TriggerSequence partialNoMatch = bs1.createSequence("CTRL+8");
@@ -354,7 +453,9 @@
 		EBindingService wBS = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq2 = wBS.createSequence("ALT+5 X");
-		wBS.activateBinding(seq2, cmd);
+		Binding wbBind = createDefaultBinding(wBS, seq2, cmd,
+				ID_DIALOG_AND_WINDOW);
+		wBS.activateBinding(wbBind);
 
 		IEclipseContext c1 = TestUtil.createContext(workbenchContext, "c1");
 		workbenchContext.set(IContextConstants.ACTIVE_CHILD, c1);
@@ -362,19 +463,30 @@
 				.getName());
 
 		TriggerSequence seq = bs1.createSequence("CTRL+5 T");
-		Binding b1 = bs1.activateBinding(seq, cmd);
+		Binding b1 = createDefaultBinding(wBS, seq, cmd, ID_DIALOG_AND_WINDOW);
+		bs1.activateBinding(b1);
 		TriggerSequence sseq = bs1.createSequence("CTRL+5 Y");
-		Binding b2 = bs1.activateBinding(sseq, cmd2);
-		HashSet<Binding> commandMatches = new HashSet<Binding>();
-		commandMatches.add(b2);
+		Binding b2 = createDefaultBinding(bs1, sseq, cmd2, ID_DIALOG_AND_WINDOW);
+		bs1.activateBinding(b2);
+		ArrayList<Binding> commandMatches = new ArrayList<Binding>();
 		commandMatches.add(b1);
-		
+		commandMatches.add(b2);
+
 		TriggerSequence partialMatch = bs1.createSequence("CTRL+5");
 		TriggerSequence partialNoMatch = bs1.createSequence("CTRL+8");
 		assertFalse(bs1.isPartialMatch(partialNoMatch));
 		assertTrue(bs1.isPartialMatch(partialMatch));
-		
+
 		Collection<Binding> matches = bs1.getPartialMatches(partialMatch);
 		assertEquals(commandMatches, matches);
 	}
+
+	private Binding createDefaultBinding(EBindingService bs,
+			TriggerSequence sequence, ParameterizedCommand command,
+			String contextId) {
+		return bs.createBinding(sequence, command,
+				"org.eclipse.ui.defaultAcceleratorConfiguration", //$NON-NLS-1$
+				contextId);
+	}
+
 }
diff --git a/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/KeyDispatcherTest.java b/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/KeyDispatcherTest.java
index eb265c2..97d94bf 100644
--- a/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/KeyDispatcherTest.java
+++ b/tests/org.eclipse.e4.ui.bindings.tests/src/org/eclipse/e4/ui/bindings/tests/KeyDispatcherTest.java
@@ -1,16 +1,27 @@
 package org.eclipse.e4.ui.bindings.tests;
 
+import java.lang.reflect.InvocationTargetException;
+
 import junit.framework.TestCase;
 
 import org.eclipse.core.commands.Category;
 import org.eclipse.core.commands.ParameterizedCommand;
+import org.eclipse.core.commands.contexts.Context;
+import org.eclipse.core.commands.contexts.ContextManager;
 import org.eclipse.e4.core.commands.ECommandService;
 import org.eclipse.e4.core.commands.EHandlerService;
 import org.eclipse.e4.core.services.IDisposable;
 import org.eclipse.e4.core.services.context.IEclipseContext;
 import org.eclipse.e4.core.services.context.spi.ContextInjectionFactory;
 import org.eclipse.e4.ui.bindings.EBindingService;
+import org.eclipse.e4.ui.bindings.internal.BindingTable;
+import org.eclipse.e4.ui.bindings.internal.BindingTableManager;
+import org.eclipse.e4.ui.bindings.internal.ContextSet;
 import org.eclipse.e4.ui.bindings.keys.KeyBindingDispatcher;
+import org.eclipse.e4.ui.internal.services.ActiveContextsFunction;
+import org.eclipse.e4.ui.services.EContextService;
+import org.eclipse.e4.ui.services.IServiceConstants;
+import org.eclipse.jface.bindings.Binding;
 import org.eclipse.jface.bindings.TriggerSequence;
 import org.eclipse.swt.SWT;
 import org.eclipse.swt.custom.StyledText;
@@ -21,6 +32,14 @@
 import org.eclipse.swt.widgets.Shell;
 
 public class KeyDispatcherTest extends TestCase {
+	private static final String ID_DIALOG = "org.eclipse.ui.contexts.dialog";
+	private static final String ID_DIALOG_AND_WINDOW = "org.eclipse.ui.contexts.dialogAndWindow";
+	private static final String ID_WINDOW = "org.eclipse.ui.contexts.window";
+
+	final static String[] CONTEXTS = { ID_DIALOG_AND_WINDOW, "DAW", null,
+			ID_DIALOG, "Dialog", ID_DIALOG_AND_WINDOW, ID_WINDOW, "Window",
+			ID_DIALOG_AND_WINDOW, };
+
 	private static final String TEST_CAT1 = "test.cat1";
 	private static final String TEST_ID1 = "test.id1";
 	private static final String TEST_ID2 = "test.id2";
@@ -62,13 +81,22 @@
 		EBindingService bs = (EBindingService) workbenchContext
 				.get(EBindingService.class.getName());
 		TriggerSequence seq = bs.createSequence("CTRL+A");
-		bs.activateBinding(seq, cmd);
+		Binding db = createDefaultBinding(bs, seq, cmd);
+		bs.activateBinding(db);
 
 		ParameterizedCommand cmd2 = cs.createCommand(TEST_ID2, null);
 		twoStrokeHandler = new CallHandler();
 		hs.activateHandler(TEST_ID2, twoStrokeHandler);
 		TriggerSequence twoKeys = bs.createSequence("CTRL+5 CTRL+A");
-		bs.activateBinding(twoKeys, cmd2);
+		db = createDefaultBinding(bs, twoKeys, cmd2);
+		bs.activateBinding(db);
+	}
+
+	private Binding createDefaultBinding(EBindingService bs,
+			TriggerSequence sequence, ParameterizedCommand command) {
+		return bs.createBinding(sequence, command,
+				"org.eclipse.ui.defaultAcceleratorConfiguration", //$NON-NLS-1$
+				ID_WINDOW);
 	}
 
 	private IEclipseContext createWorkbenchContext(IEclipseContext globalContext) {
@@ -82,9 +110,47 @@
 		display = new Display();
 		workbenchContext = createWorkbenchContext(Activator.getDefault()
 				.getGlobalContext());
+		defineContexts(workbenchContext);
+		defineBindingTables(workbenchContext);
 		defineCommands(workbenchContext);
 	}
 
+	private void defineContexts(IEclipseContext context) {
+		ContextManager contextManager = new ContextManager();
+		context.set(ContextManager.class.getName(), contextManager);
+		ContextSet.setComparator(new ContextSet.CComp(contextManager));
+		for (int i = 0; i < CONTEXTS.length; i += 3) {
+			Context c = contextManager.getContext(CONTEXTS[i]);
+			c.define(CONTEXTS[i + 1], null, CONTEXTS[i + 2]);
+		}
+
+		EContextService cs = (EContextService) context
+				.get(EContextService.class.getName());
+		cs.activateContext(ID_DIALOG_AND_WINDOW);
+		cs.activateContext(ID_WINDOW);
+		context.set(IServiceConstants.ACTIVE_CONTEXTS,
+				new ActiveContextsFunction());
+	}
+
+	private void defineBindingTables(IEclipseContext context) {
+		try {
+			BindingTableManager btm = (BindingTableManager) ContextInjectionFactory
+					.make(BindingTableManager.class, context);
+			context.set(BindingTableManager.class.getName(), btm);
+			ContextManager cm = (ContextManager) context
+					.get(ContextManager.class.getName());
+			btm.addTable(new BindingTable(cm.getContext(ID_DIALOG_AND_WINDOW)));
+			btm.addTable(new BindingTable(cm.getContext(ID_WINDOW)));
+			btm.addTable(new BindingTable(cm.getContext(ID_DIALOG)));
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InstantiationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+
 	@Override
 	protected void tearDown() throws Exception {
 		if (workbenchContext instanceof IDisposable) {
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerBindingContainerTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerBindingContainerTest.java
index 7213d3b..aa556f9 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerBindingContainerTest.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerBindingContainerTest.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MKeyBinding;
 import org.eclipse.e4.workbench.modeling.ModelDelta;
@@ -27,6 +28,10 @@
 			throws Exception {
 		MApplication application = createApplication();
 
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+
 		saveModel();
 
 		ModelReconciler reconciler = createModelReconciler();
@@ -35,21 +40,22 @@
 		MKeyBinding keyBinding = MApplicationFactory.eINSTANCE
 				.createKeyBinding();
 		keyBinding.setKeySequence(keySequence);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		Object state = reconciler.serialize();
 
 		application = createApplication();
+		bindingTable = application.getBindingTables().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
-		assertEquals(0, application.getBindings().size());
+		assertEquals(0, bindingTable.getBindings().size());
 
 		applyAll(deltas);
 
-		assertEquals(1, application.getBindings().size());
+		assertEquals(1, bindingTable.getBindings().size());
 
-		keyBinding = application.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 		assertNull(keyBinding.getCommand());
 		assertEquals(keySequence, keyBinding.getKeySequence());
 		assertEquals(0, keyBinding.getParameters().size());
@@ -71,34 +77,39 @@
 			throws Exception {
 		MApplication application = createApplication();
 
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+
 		MKeyBinding keyBinding = MApplicationFactory.eINSTANCE
 				.createKeyBinding();
 		keyBinding.setKeySequence(keySequence);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		saveModel();
 
 		ModelReconciler reconciler = createModelReconciler();
 		reconciler.recordChanges(application);
 
-		application.getBindings().remove(0);
+		bindingTable.getBindings().remove(0);
 
 		Object state = reconciler.serialize();
 
 		application = createApplication();
+		bindingTable = application.getBindingTables().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
-		assertEquals(1, application.getBindings().size());
+		assertEquals(1, bindingTable.getBindings().size());
 
-		keyBinding = application.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 		assertNull(keyBinding.getCommand());
 		assertEquals(keySequence, keyBinding.getKeySequence());
 		assertEquals(0, keyBinding.getParameters().size());
 
 		applyAll(deltas);
 
-		assertEquals(0, application.getBindings().size());
+		assertEquals(0, bindingTable.getBindings().size());
 	}
 
 	public void testBindingContainer_Remove_KeyBinding_Null() throws Exception {
@@ -118,6 +129,10 @@
 			throws Exception {
 		MApplication application = createApplication();
 
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+
 		MCommand command = MApplicationFactory.eINSTANCE.createCommand();
 		application.getCommands().add(command);
 
@@ -130,22 +145,23 @@
 				.createKeyBinding();
 		keyBinding.setKeySequence(keySequence);
 		keyBinding.setCommand(command);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		Object state = reconciler.serialize();
 
 		application = createApplication();
+		bindingTable = application.getBindingTables().get(0);
 		command = application.getCommands().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
-		assertEquals(0, application.getBindings().size());
+		assertEquals(0, bindingTable.getBindings().size());
 
 		applyAll(deltas);
 
-		assertEquals(1, application.getBindings().size());
+		assertEquals(1, bindingTable.getBindings().size());
 
-		keyBinding = application.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 		assertEquals(command, keyBinding.getCommand());
 		assertEquals(keySequence, keyBinding.getKeySequence());
 	}
@@ -169,6 +185,10 @@
 			throws Exception {
 		MApplication application = createApplication();
 
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+
 		MCommand command = MApplicationFactory.eINSTANCE.createCommand();
 		application.getCommands().add(command);
 
@@ -176,32 +196,33 @@
 				.createKeyBinding();
 		keyBinding.setKeySequence(keySequence);
 		keyBinding.setCommand(command);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		saveModel();
 
 		ModelReconciler reconciler = createModelReconciler();
 		reconciler.recordChanges(application);
 
-		application.getBindings().remove(keyBinding);
+		bindingTable.getBindings().remove(keyBinding);
 
 		Object state = reconciler.serialize();
 
 		application = createApplication();
+		bindingTable = application.getBindingTables().get(0);
 		command = application.getCommands().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
-		assertEquals(1, application.getBindings().size());
+		assertEquals(1, bindingTable.getBindings().size());
 
-		keyBinding = application.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 		assertEquals(command, keyBinding.getCommand());
 		assertEquals(keySequence, keyBinding.getKeySequence());
 		assertEquals(0, keyBinding.getParameters().size());
 
 		applyAll(deltas);
 
-		assertEquals(0, application.getBindings().size());
+		assertEquals(0, bindingTable.getBindings().size());
 	}
 
 	public void testBindingContainer_Remove_BoundKeyBinding_Null()
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeyBindingTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeyBindingTest.java
index efe1eb0..1c94d0d 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeyBindingTest.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeyBindingTest.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MKeyBinding;
 import org.eclipse.e4.workbench.modeling.ModelDelta;
@@ -24,6 +25,9 @@
 
 	private void testKeySequence_KeySequence(String before, String after) {
 		MApplication application = createApplication();
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
 		MCommand command = MApplicationFactory.eINSTANCE.createCommand();
 		application.getCommands().add(command);
 
@@ -31,7 +35,7 @@
 				.createKeyBinding();
 		keyBinding.setKeySequence(before);
 		keyBinding.setCommand(command);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		saveModel();
 
@@ -43,8 +47,9 @@
 		Object state = reconciler.serialize();
 
 		application = createApplication();
+		bindingTable = application.getBindingTables().get(0);
 		command = application.getCommands().get(0);
-		keyBinding = application.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeySequenceTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeySequenceTest.java
index 8e41423..40b542a 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeySequenceTest.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerKeySequenceTest.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MKeyBinding;
 import org.eclipse.e4.workbench.modeling.ModelDelta;
 import org.eclipse.e4.workbench.modeling.ModelReconciler;
@@ -25,10 +26,14 @@
 	private void testKeySequence_KeySequence(String before, String after) {
 		MApplication application = createApplication();
 
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+
 		MKeyBinding keyBinding = MApplicationFactory.eINSTANCE
 				.createKeyBinding();
 		keyBinding.setKeySequence(before);
-		application.getBindings().add(keyBinding);
+		bindingTable.getBindings().add(keyBinding);
 
 		saveModel();
 
@@ -40,7 +45,8 @@
 		Object state = reconciler.serialize();
 
 		application = createApplication();
-		keyBinding = application.getBindings().get(0);
+		bindingTable = application.getBindingTables().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
diff --git a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerScenarioTest.java b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerScenarioTest.java
index 3776407..7a5c0c7 100644
--- a/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerScenarioTest.java
+++ b/tests/org.eclipse.e4.ui.tests/src/org/eclipse/e4/ui/tests/reconciler/ModelReconcilerScenarioTest.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.e4.ui.model.application.MApplication;
 import org.eclipse.e4.ui.model.application.MApplicationFactory;
+import org.eclipse.e4.ui.model.application.MBindingTable;
 import org.eclipse.e4.ui.model.application.MCommand;
 import org.eclipse.e4.ui.model.application.MKeyBinding;
 import org.eclipse.e4.ui.model.application.MMenu;
@@ -792,35 +793,6 @@
 		assertEquals(partD, stack2.getChildren().get(2));
 	}
 
-	public void testBindingContainer_NewWithBindings() {
-		MApplication application = createApplication();
-
-		saveModel();
-
-		ModelReconciler reconciler = createModelReconciler();
-		reconciler.recordChanges(application);
-
-		MWindow window = createWindow(application);
-
-		MKeyBinding keyBinding = MApplicationFactory.eINSTANCE
-				.createKeyBinding();
-		window.getBindings().add(keyBinding);
-
-		Object state = reconciler.serialize();
-
-		application = createApplication();
-
-		Collection<ModelDelta> deltas = constructDeltas(application, state);
-
-		assertEquals(0, application.getChildren().size());
-		assertEquals(0, application.getBindings().size());
-
-		applyAll(deltas);
-
-		window = application.getChildren().get(0);
-		assertEquals(1, window.getBindings().size());
-	}
-
 	public void testElementContainer_ActiveChild_New() {
 		MApplication application = createApplication();
 		MWindow window1 = MApplicationFactory.eINSTANCE.createWindow();
@@ -1328,56 +1300,61 @@
 			String originalWindowKeyBindingSequence,
 			String userWindowKeyBindingSequence) {
 		MApplication application = createApplication();
-		MWindow window = createWindow(application);
+
+		MBindingTable bindingTable = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		MBindingTable bindingTable2 = MApplicationFactory.eINSTANCE
+				.createBindingTable();
+		application.getBindingTables().add(bindingTable);
+		application.getBindingTables().add(bindingTable2);
 
 		MCommand command = MApplicationFactory.eINSTANCE.createCommand();
 		application.getCommands().add(command);
 
-		MKeyBinding applicationKeyBinding = MApplicationFactory.eINSTANCE
+		MKeyBinding keyBinding = MApplicationFactory.eINSTANCE
 				.createKeyBinding();
-		applicationKeyBinding.setCommand(command);
-		applicationKeyBinding
-				.setKeySequence(originalApplicationKeyBindingSequence);
+		keyBinding.setCommand(command);
+		keyBinding.setKeySequence(originalApplicationKeyBindingSequence);
 
-		MKeyBinding windowKeyBinding = MApplicationFactory.eINSTANCE
+		MKeyBinding keyBinding2 = MApplicationFactory.eINSTANCE
 				.createKeyBinding();
-		windowKeyBinding.setCommand(command);
-		windowKeyBinding.setKeySequence(originalWindowKeyBindingSequence);
+		keyBinding2.setCommand(command);
+		keyBinding2.setKeySequence(originalWindowKeyBindingSequence);
 
-		application.getBindings().add(applicationKeyBinding);
-		window.getBindings().add(windowKeyBinding);
+		bindingTable.getBindings().add(keyBinding);
+		bindingTable2.getBindings().add(keyBinding2);
 
 		saveModel();
 
 		ModelReconciler reconciler = createModelReconciler();
 		reconciler.recordChanges(application);
 
-		applicationKeyBinding.setKeySequence(userApplicationKeyBindingSequence);
-		windowKeyBinding.setKeySequence(userWindowKeyBindingSequence);
+		keyBinding.setKeySequence(userApplicationKeyBindingSequence);
+		keyBinding2.setKeySequence(userWindowKeyBindingSequence);
 
 		Object state = reconciler.serialize();
 
 		application = createApplication();
-		window = application.getChildren().get(0);
+		bindingTable = application.getBindingTables().get(0);
+		bindingTable2 = application.getBindingTables().get(1);
 
 		command = application.getCommands().get(0);
 
-		applicationKeyBinding = application.getBindings().get(0);
-		windowKeyBinding = window.getBindings().get(0);
+		keyBinding = bindingTable.getBindings().get(0);
+		keyBinding2 = bindingTable2.getBindings().get(0);
 
 		Collection<ModelDelta> deltas = constructDeltas(application, state);
 
-		assertEquals(originalApplicationKeyBindingSequence,
-				applicationKeyBinding.getKeySequence());
-		assertEquals(originalWindowKeyBindingSequence, windowKeyBinding
+		assertEquals(originalApplicationKeyBindingSequence, keyBinding
+				.getKeySequence());
+		assertEquals(originalWindowKeyBindingSequence, keyBinding2
 				.getKeySequence());
 
 		applyAll(deltas);
 
-		assertEquals(userApplicationKeyBindingSequence, applicationKeyBinding
+		assertEquals(userApplicationKeyBindingSequence, keyBinding
 				.getKeySequence());
-		assertEquals(userWindowKeyBindingSequence, windowKeyBinding
-				.getKeySequence());
+		assertEquals(userWindowKeyBindingSequence, keyBinding2.getKeySequence());
 	}
 
 	public void testApplication_Commands_MultiLevelKeyBindings_NullNull_NullNull() {
diff --git a/tests/org.eclipse.e4.ui.tests/xmi/contacts.e4xmi b/tests/org.eclipse.e4.ui.tests/xmi/contacts.e4xmi
index bece7a2..91bfd83 100644
--- a/tests/org.eclipse.e4.ui.tests/xmi/contacts.e4xmi
+++ b/tests/org.eclipse.e4.ui.tests/xmi/contacts.e4xmi
@@ -37,14 +37,21 @@
   <handlers xmi:id="_SeXUGe8EEd6FC9cDb6iV7g" id="_SeXUGe8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.DeleteContactHandler" command="contacts.delete"/>
   <handlers xmi:id="_SeXUGu8EEd6FC9cDb6iV7g" id="_SeXUGu8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.DarkThemeHandler" command="contacts.darkTheme"/>
   <handlers xmi:id="_SeXUG-8EEd6FC9cDb6iV7g" id="_SeXUG-8EEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.contacts/org.eclipse.e4.demo.contacts.handlers.BrightThemeHandler" command="contacts.brightTheme"/>
-  <bindings xmi:id="_SeXUHO8EEd6FC9cDb6iV7g" keySequence="CTRL+D" id="_SeXUHO8EEd6FC9cDb6iV7g" command="contacts.darkTheme"/>
-  <bindings xmi:id="_SeXUHe8EEd6FC9cDb6iV7g" keySequence="CTRL+L" id="_SeXUHe8EEd6FC9cDb6iV7g" command="contacts.brightTheme"/>
-  <bindings xmi:id="_SeXUHu8EEd6FC9cDb6iV7g" keySequence="CTRL+S" id="_SeXUHu8EEd6FC9cDb6iV7g" command="contacts.save"/>
-  <bindings xmi:id="_SeXUH-8EEd6FC9cDb6iV7g" keySequence="Delete" id="_SeXUH-8EEd6FC9cDb6iV7g" command="contacts.delete"/>
-  <bindings xmi:id="_SeXUIO8EEd6FC9cDb6iV7g" keySequence="CTRL+5 X" id="_SeXUIO8EEd6FC9cDb6iV7g" command="contacts.exit"/>
+  <rootContext xmi:id="_SeXUHO8EEd6FC9cDb6iV7y" id="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7w" id="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" id="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <bindingTables xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" bindingContextId="org.eclipse.ui.contexts.dialogAndWindow">
+    <bindings xmi:id="_SeXUHO8EEd6FC9cDb6iV7g" keySequence="CTRL+D" id="_SeXUHO8EEd6FC9cDb6iV7g" command="contacts.darkTheme"/>
+    <bindings xmi:id="_SeXUHe8EEd6FC9cDb6iV7g" keySequence="CTRL+L" id="_SeXUHe8EEd6FC9cDb6iV7g" command="contacts.brightTheme"/>
+    <bindings xmi:id="_SeXUHu8EEd6FC9cDb6iV7g" keySequence="CTRL+S" id="_SeXUHu8EEd6FC9cDb6iV7g" command="contacts.save"/>
+    <bindings xmi:id="_SeXUH-8EEd6FC9cDb6iV7g" keySequence="Delete" id="_SeXUH-8EEd6FC9cDb6iV7g" command="contacts.delete"/>
+    <bindings xmi:id="_SeXUIO8EEd6FC9cDb6iV7g" keySequence="CTRL+5 X" id="_SeXUIO8EEd6FC9cDb6iV7g" command="contacts.exit"/>
+  </bindingTables>
   <commands xmi:id="contacts.exit" id="contacts.exit" commandName="Exit" description=""/>
   <commands xmi:id="contacts.darkTheme" id="contacts.darkTheme" commandName="Dark Theme"/>
   <commands xmi:id="contacts.brightTheme" id="contacts.brightTheme" commandName="Bright Theme" description=""/>
   <commands xmi:id="contacts.save" id="contacts.save" commandName="Save" description=""/>
   <commands xmi:id="contacts.delete" id="contacts.delete" commandName="Delete" description=""/>
+  <bindingContexts>org.eclipse.ui.contexts.dialogAndWindow</bindingContexts>
 </application:Application>
diff --git a/tests/org.eclipse.e4.ui.tests/xmi/photo.e4xmi b/tests/org.eclipse.e4.ui.tests/xmi/photo.e4xmi
index d62520e..3bc10df 100644
--- a/tests/org.eclipse.e4.ui.tests/xmi/photo.e4xmi
+++ b/tests/org.eclipse.e4.ui.tests/xmi/photo.e4xmi
@@ -38,10 +38,17 @@
   <handlers xmi:id="_AXeqWe8IEd6FC9cDb6iV7g" id="_AXeqWe8IEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.NewProjectHandler" command="e4photo.createAlbum"/>
   <handlers xmi:id="_AXeqWu8IEd6FC9cDb6iV7g" id="_AXeqWu8IEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.SwitchPerspectiveHandler" command="e4photo.switchPersepective"/>
   <handlers xmi:id="_AXeqW-8IEd6FC9cDb6iV7g" id="_AXeqW-8IEd6FC9cDb6iV7g" URI="platform:/plugin/org.eclipse.e4.demo.e4photo/org.eclipse.e4.demo.e4photo.ImageDialogHandler" command="e4photo.imageDialog"/>
-  <bindings xmi:id="_AXeqXO8IEd6FC9cDb6iV7g" keySequence="CTRL+X" id="_AXeqXO8IEd6FC9cDb6iV7g" command="e4photo.exit"/>
-  <bindings xmi:id="_AXeqXe8IEd6FC9cDb6iV7g" keySequence="CTRL+N" id="_AXeqXe8IEd6FC9cDb6iV7g" command="e4photo.createAlbum"/>
+  <rootContext xmi:id="_SeXUHO8EEd6FC9cDb6iV7y" id="org.eclipse.ui.contexts.dialogAndWindow" name="In Dialog and Windows">
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7w" id="org.eclipse.ui.contexts.window" name="In Windows"/>
+    <children xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" id="org.eclipse.ui.contexts.dialog" name="In Dialogs"/>
+  </rootContext>
+  <bindingTables xmi:id="_SeXUEO8EEd6FC9cDb6iV7x" bindingContextId="org.eclipse.ui.contexts.dialogAndWindow">
+    <bindings xmi:id="_AXeqXO8IEd6FC9cDb6iV7g" keySequence="CTRL+Q" id="_AXeqXO8IEd6FC9cDb6iV7g" command="e4photo.exit"/>
+    <bindings xmi:id="_AXeqXe8IEd6FC9cDb6iV7g" keySequence="CTRL+N" id="_AXeqXe8IEd6FC9cDb6iV7g" command="e4photo.createAlbum"/>
+  </bindingTables>
   <commands xmi:id="e4photo.exit" id="e4photo.exit" commandName="Exit" description=""/>
   <commands xmi:id="e4photo.createAlbum" id="e4photo.createAlbum" commandName="Create Album"/>
   <commands xmi:id="e4photo.switchPersepective" id="e4photo.switchPersepective" commandName="Switch Perspective" description=""/>
   <commands xmi:id="e4photo.imageDialog" id="e4photo.imageDialog" commandName="Image Dialog" description=""/>
+  <bindingContexts>org.eclipse.ui.contexts.dialogAndWindow</bindingContexts>
 </application:Application>