diff --git a/org.fortiss.tooling.base.ui/.settings b/org.fortiss.tooling.base.ui/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.base.ui/.settings
+++ b/org.fortiss.tooling.base.ui/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
index 041caa29dacb8317ea1c625e61a3f2bd1e628da7..2492dbdeffc8235f398f3633019d7c9d9dcbe6f0 100644
--- a/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.base.ui/META-INF/MANIFEST.MF
@@ -17,13 +17,16 @@ Export-Package: org.fortiss.tooling.base.ui,
  org.fortiss.tooling.base.ui.annotation.view,
  org.fortiss.tooling.base.ui.annotation.view.generic,
  org.fortiss.tooling.base.ui.annotation.view.generic.filter,
- org.fortiss.tooling.base.ui.compose,
  org.fortiss.tooling.base.ui.contentprovider,
  org.fortiss.tooling.base.ui.dialog,
  org.fortiss.tooling.base.ui.dnd.gef,
  org.fortiss.tooling.base.ui.dnd.jface,
  org.fortiss.tooling.base.ui.editor,
  org.fortiss.tooling.base.ui.editor.annotations,
+ org.fortiss.tooling.base.ui.editor.fx,
+ org.fortiss.tooling.base.ui.editor.fx.controller,
+ org.fortiss.tooling.base.ui.editor.fx.model,
+ org.fortiss.tooling.base.ui.editor.fx.visual,
  org.fortiss.tooling.base.ui.editpart,
  org.fortiss.tooling.base.ui.editpart.allocation,
  org.fortiss.tooling.base.ui.editpart.command,
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/.ratings
deleted file mode 100644
index ef161cfb92f38f97856ab39e1691224e0f897f6c..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/.ratings
+++ /dev/null
@@ -1 +0,0 @@
-ConstraintBasedProcessCompositor.java 6b98bc9c8096ff6553ffc49040a0919dadb20bae GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/ConstraintBasedProcessCompositor.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/ConstraintBasedProcessCompositor.java
deleted file mode 100644
index 6b98bc9c8096ff6553ffc49040a0919dadb20bae..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/compose/ConstraintBasedProcessCompositor.java
+++ /dev/null
@@ -1,100 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2011 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.compose;
-
-import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
-import static org.fortiss.tooling.base.ui.utils.ConstraintsBaseUIUtils.deactivateConfiguration;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.getDefaultConfig;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.isDefaultConfiguration;
-
-import java.util.List;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.base.model.element.ConstraintConfiguration;
-import org.fortiss.tooling.base.model.element.IConstraintBasedProcess;
-import org.fortiss.tooling.kernel.extension.IElementCompositor;
-import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
-import org.fortiss.tooling.kernel.extension.data.Prototype;
-import org.fortiss.tooling.kernel.model.IProjectRootElement;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-
-/**
- * {@link IElementCompositor} implementation for the {@link IProjectRootElement} s.
- * 
- * @author hoelzl
- */
-public class ConstraintBasedProcessCompositor<CBP extends IConstraintBasedProcess>
-		implements IElementCompositor<CBP> {
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canCompose(CBP container, EObject contained,
-			IElementCompositionContext context) {
-		return contained instanceof ConstraintConfiguration;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean compose(CBP container, EObject contained, IElementCompositionContext context) {
-		ConstraintConfiguration config = (ConstraintConfiguration)contained;
-		Stream<ConstraintConfiguration> configNamesStream = container.getConfigurations().stream();
-		List<String> existingNames =
-				configNamesStream.map(c -> c.getName()).collect(Collectors.toList());
-		String name = config.getName();
-		while(existingNames.contains(name)) {
-			name += " bis";
-		}
-		config.setName(name);
-		container.getConfigurations().add(config);
-		return true;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canComposePrototype(Prototype prototype) {
-		// As of now constraint configurations should never be added by prototype.
-		return false;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canDecompose(EObject contained) {
-		return contained instanceof ConstraintConfiguration &&
-				!isDefaultConfiguration((ConstraintConfiguration)contained);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean decompose(EObject contained) {
-		if(contained.eContainer() instanceof IConstraintBasedProcess) {
-			IConstraintBasedProcess cbdp = (IConstraintBasedProcess)contained.eContainer();
-			if(contained.equals(cbdp.getCurrentObjective())) {
-				ConstraintConfiguration defaultConfig = getDefaultConfig(cbdp);
-				cbdp.setCurrentObjective(defaultConfig);
-				if(cbdp.eContainer() instanceof IConstraintInstanceContainer) {
-					IConstraintInstanceContainer cstrContainer =
-							(IConstraintInstanceContainer)cbdp.eContainer();
-					deactivateConfiguration((ConstraintConfiguration)contained, cstrContainer,
-							defaultConfig);
-				}
-			}
-		}
-		delete(contained);
-		return true;
-	}
-}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditor.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditor.java
deleted file mode 100644
index 155a5a7ac41c668ae7ef978e8be13b83f5abd67d..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditor.java
+++ /dev/null
@@ -1,997 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2011 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.editor;
-
-import static java.util.stream.Collectors.toList;
-import static org.eclipse.core.runtime.IStatus.ERROR;
-import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
-import static org.eclipse.jface.dialogs.ErrorDialog.openError;
-import static org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.adjustColorIndex;
-import static org.fortiss.tooling.base.ui.utils.ConstraintsBaseUIUtils.activateConfiguration;
-import static org.fortiss.tooling.base.ui.utils.ConstraintsBaseUIUtils.deactivateConfiguration;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.DEFAULT_CONFIGURATION_NAME;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.getActiveConfigurationsTransitively;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.getActiveConstraintsTransitively;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.retrieveDefaultConfig;
-import static org.fortiss.tooling.kernel.utils.EcoreUtils.disableNotificationsOf;
-import static org.fortiss.tooling.kernel.utils.EcoreUtils.enableNotificationsOf;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-import org.conqat.ide.commons.ui.jface.TreeContentProviderBase;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.util.IPropertyChangeListener;
-import org.eclipse.jface.viewers.CellEditor;
-import org.eclipse.jface.viewers.CheckStateChangedEvent;
-import org.eclipse.jface.viewers.CheckboxTreeViewer;
-import org.eclipse.jface.viewers.DelegatingStyledCellLabelProvider;
-import org.eclipse.jface.viewers.EditingSupport;
-import org.eclipse.jface.viewers.ICheckStateListener;
-import org.eclipse.jface.viewers.ICheckStateProvider;
-import org.eclipse.jface.viewers.ILabelProviderListener;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StyledString;
-import org.eclipse.jface.viewers.TextCellEditor;
-import org.eclipse.jface.viewers.TreeViewerColumn;
-import org.eclipse.jface.viewers.Viewer;
-import org.eclipse.jface.viewers.ViewerComparator;
-import org.eclipse.jface.viewers.ViewerFilter;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.graphics.Image;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.fortiss.tooling.base.model.element.ConstraintConfiguration;
-import org.fortiss.tooling.base.model.element.ElementFactory;
-import org.fortiss.tooling.base.model.element.IConstraintBasedProcess;
-import org.fortiss.tooling.base.ui.ToolingBaseUIActivator;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.ConfigurationRefWithContextualConfiguration;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.ConstraintWithContextualConfiguration;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.GreenFontStyler;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.NormalFontStyler;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.RedFontStyler;
-import org.fortiss.tooling.base.ui.editor.ConstraintBasedProcessEditorHelper.TreeStructureNode;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.FailedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.SuccessConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.impl.ConstraintInstanceImpl;
-import org.fortiss.tooling.kernel.model.constraints.impl.ConstraintNameToChecksumImpl;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.service.IElementCompositorService;
-import org.fortiss.tooling.kernel.service.IPersistencyService;
-import org.fortiss.tooling.kernel.ui.extension.base.EditorBase;
-import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
-import org.fortiss.tooling.kernel.ui.service.IActionService;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
-
-// TODO Refactor this huge class and provide a dedicated perspective (see #3189)
-/**
- * Editor for {@link IConstraintBasedProcess}s.
- * 
- * @author aravantinos
- */
-public class ConstraintBasedProcessEditor<CBP extends IConstraintBasedProcess>
-		extends EditorBase<CBP> implements ContextMenuContextProvider, ISelectionProvider {
-
-	/** Width of columns to display constraints. */
-	private static final int COLUMN_WIDTH = 1300;
-
-	/** {@inheritDoc} */
-	@Override
-	public void addPartPropertyListener(IPropertyChangeListener listener) {
-		super.addPartPropertyListener(listener);
-	}
-
-	/** Model context of the edited project. */
-	private ITopLevelElement top;
-
-	/** Constraint container for the edited project. */
-	private IConstraintInstanceContainer cstrContainer;
-
-	/** Tree viewer for the configurations. */
-	private CheckboxTreeViewer treeViewer;
-
-	/** Selection of the tree. */
-	private ISelection selection;
-
-	/** List of parent nodes. */
-	private List<TreeStructureNode> parentList;
-
-	/** Adapter for refreshing content. */
-	private EContentAdapter refreshAdapter;
-
-	/** {@inheritDoc} */
-	@Override
-	public void createPartControl(Composite parent) {
-		top = IPersistencyService.getInstance().getTopLevelElementFor(editedObject);
-		getSite().setSelectionProvider(this);
-		retrieveDefaultConfig(editedObject);
-		cstrContainer = editedObject.getConstraintInstanceContainer();
-		parent.setLayout(new GridLayout(1, true));
-		createTree(parent);
-		MenuManager menuManager = IContextMenuService.getInstance().createDefaultContextMenu(this);
-		Menu menu = menuManager.createContextMenu(treeViewer.getTree());
-		treeViewer.getTree().setMenu(menu);
-		createCurrentObjectivePart(parent);
-		refreshAdapter = new EContentAdapter() {
-			/** {@inheritDoc} */
-			@Override
-			public void notifyChanged(Notification notification) {
-				treeViewer.refresh();
-			}
-		};
-		editedObject.eAdapters().add(refreshAdapter);
-		treeViewer.addFilter(new ViewerFilter() {
-			/** {@inheritDoc} */
-			@Override
-			public boolean select(Viewer viewer, Object parentElement, Object element) {
-				if(element instanceof TreeStructureNode &&
-						parentElement instanceof TreeStructureNode) {
-					return checkIfDuplicate(viewer, parentElement, element);
-				}
-				return true;
-			}
-		});
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void dispose() {
-		disableNotificationsOf(editedObject);
-		editedObject.eAdapters().remove(refreshAdapter);
-		enableNotificationsOf(editedObject);
-		super.dispose();
-	}
-
-	/** Create current the controls "Current objective:". */
-	private void createCurrentObjectivePart(Composite parent) {
-		Composite currentObjComposite = new Composite(parent, SWT.None);
-		currentObjComposite.setLayout(new GridLayout(2, false));
-	}
-
-	/** Dummy object used to add new elements in the tree. */
-	private static class DummyObject {
-		// Nothing to implement: just a marker class
-	}
-
-	/** Content provider for the configuration tree. */
-	private class ConfigTreeContentProvider extends TreeContentProviderBase {
-
-		/** {@inheritDoc} */
-		@Override
-		public Object getParent(Object inputElement) {
-			if(inputElement instanceof ConfigurationRefWithContextualConfiguration) {
-				ConfigurationRefWithContextualConfiguration input =
-						(ConfigurationRefWithContextualConfiguration)inputElement;
-				for(TreeStructureNode iterableElement : parentList) {
-					if(iterableElement.data instanceof ConfigurationRefWithContextualConfiguration) {
-						ConfigurationRefWithContextualConfiguration ref =
-								(ConfigurationRefWithContextualConfiguration)iterableElement.data;
-						if(ref.config.getName().equalsIgnoreCase(input.config.getName())) {
-							return iterableElement.parent;
-						}
-					}
-				}
-			} else if(inputElement instanceof TreeStructureNode) {
-				return ((TreeStructureNode)inputElement).parent;
-			}
-			return null;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public Object[] getChildren(Object parentElement) {
-
-			if(parentList == null) {
-				parentList = new ArrayList<TreeStructureNode>();
-			}
-			if(parentElement instanceof IConstraintBasedProcess) {
-				IConstraintBasedProcess cbdp = (IConstraintBasedProcess)parentElement;
-				ArrayList<Object> configs = new ArrayList<>();
-				configs.add(new DummyObject());
-				configs.addAll(cbdp.getConfigurations());
-				return configs.toArray();
-			} else if(parentElement instanceof ConstraintConfiguration) {
-
-				List<Object> types = new ArrayList<Object>();
-				final IConstraintUIService cuis = IConstraintUIService.getInstance();
-				Set<Class<? extends IConstraint>> availableCstrs = cuis.getAllConstraints();
-				availableCstrs.removeAll(cuis.getAlwaysActivatedConstraints());
-
-				EList<ConstraintConfiguration> configs = editedObject.getConfigurations();
-				if(configs.size() > 1) {
-					List<ConfigurationRefWithContextualConfiguration> configCollection =
-							configs.stream()
-									.map(t -> new ConfigurationRefWithContextualConfiguration(t,
-											(ConstraintConfiguration)parentElement))
-									.collect(toList());
-					List<ConfigurationRefWithContextualConfiguration> refs = configCollection;
-					refs.removeIf(c -> c.config.getName().equalsIgnoreCase(c.target.getName()));
-					refs.forEach(c -> {
-						parentList.add(new TreeStructureNode(parentElement, c));
-					});
-					types.add(refs);
-				}
-
-				Set<Class<? extends IConstraint>> availableConstraints = cuis.getAllConstraints();
-
-				// Collecting the groups in the array list
-				List<String> groupName = new ArrayList<String>();
-				for(Class<? extends IConstraint> c : availableConstraints) {
-					String constGroupName = IConstraintService.getInstance().getGroupName(c);
-					if(!groupName.contains(constGroupName)) {
-						groupName.add(constGroupName);
-					}
-				}
-
-				// Collect the constraints for each of the groups.
-				for(String constraintGroupName : groupName) {
-					HashMap<String, String> constraintInfo = new HashMap<String, String>();
-					for(Class<? extends IConstraint> c : availableConstraints) {
-						String cGroupName = IConstraintService.getInstance().getGroupName(c);
-						String desc = cuis.getDescription(c);
-						constraintMap.put(c.getName(), desc);
-						if(cGroupName.equalsIgnoreCase(constraintGroupName)) {
-							constraintInfo.put(c.getName(), cuis.getDescription(c));
-						}
-					}
-					groupNameAndConstraints.put(constraintGroupName, constraintInfo);
-				}
-				// Add the constraint groups to the tree.
-				for(String constraintGroupName : groupNameAndConstraints.keySet()) {
-					types.add(new TreeStructureNode(parentElement, constraintGroupName));
-					parentList.add(new TreeStructureNode(parentElement, constraintGroupName));
-				}
-
-				return types.toArray();
-			} else if(parentElement instanceof List<?>) {
-				return ((List<?>)parentElement).toArray();
-			}
-
-			// Add the constraints to the tree based on the group name.
-			else if(parentElement instanceof TreeStructureNode) {
-				HashMap<String, String> constraintInfo = new HashMap<String, String>();
-				List<TreeStructureNode> nodeList = new ArrayList<TreeStructureNode>();
-
-				Object stringNode = ((TreeStructureNode)parentElement).data;
-				if(groupNameAndConstraints.get(stringNode) != null) {
-					for(String constraintGroupName : groupNameAndConstraints.keySet()) {
-						if(stringNode.toString().equalsIgnoreCase(constraintGroupName.toString())) {
-
-							HashMap<String, String> groupedConstraint =
-									groupNameAndConstraints.get(constraintGroupName);
-							for(String key : groupedConstraint.keySet()) {
-								constraintInfo.put(key, groupedConstraint.get(key));
-								TreeStructureNode node = new TreeStructureNode(parentElement, key);
-								parentList.add(node);
-								nodeList.add(node);
-							}
-						}
-					}
-				}
-				return nodeList.toArray();
-			}
-			return new Object[0];
-		}
-	}
-
-	/** This constraint map contains the name and the description of all of the constraints */
-	private HashMap<String, String> constraintMap = new HashMap<String, String>();
-
-	/** This HashMap contains the groups and the the grouped constraints (as a HashMap) */
-	private HashMap<String, HashMap<String, String>> groupNameAndConstraints =
-			new HashMap<String, HashMap<String, String>>();
-
-	/** Text labels for the tree of configurations. */
-	private String getLabelText(Object element) {
-		if(element instanceof DummyObject) {
-			return "click to add a new configuration";
-		} else if(element instanceof ConstraintConfiguration) {
-			return ((ConstraintConfiguration)element).getName();
-		} else if(element instanceof ConstraintWithContextualConfiguration) {
-			IConstraintUIService cuis = IConstraintUIService.getInstance();
-			return cuis.getDescription(((ConstraintWithContextualConfiguration)element).cstr);
-		} else if(element instanceof ConfigurationRefWithContextualConfiguration) {
-			return ((ConfigurationRefWithContextualConfiguration)element).target.getName();
-		} else if(element instanceof List<?>) {
-			return "Required configurations";
-		} else if(element instanceof TreeStructureNode) {
-
-			Object stringNode = ((TreeStructureNode)element).data;
-			if(groupNameAndConstraints.containsKey(stringNode)) {
-				for(String constraintGroupName : groupNameAndConstraints.keySet()) {
-					if((stringNode.toString().equalsIgnoreCase(constraintGroupName.toString()))) {
-						return constraintGroupName + getInstanceCount(element);
-					}
-				}
-			} else if(constraintMap.containsKey(stringNode)) {
-				return constraintMap.get(stringNode);
-			}
-		}
-		return null;
-	}
-
-	/** Check state provider for the tree of configurations. */
-	private class ConfigTreeCheckStateProvider implements ICheckStateProvider {
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean isGrayed(Object element) {
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean isChecked(Object element) {
-
-			if(element instanceof ConstraintWithContextualConfiguration) {
-				ConstraintWithContextualConfiguration cstrInContext =
-						(ConstraintWithContextualConfiguration)element;
-				IConstraintService cs = IConstraintService.getInstance();
-				String name = cs.getName(cstrInContext.cstr);
-				HashMap<String, String> hashMap = groupNameAndConstraints.get(element.toString());
-				return hashMap.keySet().contains(name);
-			} else if(element instanceof ConfigurationRefWithContextualConfiguration) {
-
-				ConfigurationRefWithContextualConfiguration configRef =
-						(ConfigurationRefWithContextualConfiguration)element;
-				return configRef.config.getIncludedConfigurations().contains(configRef.target);
-			} else if(element instanceof TreeStructureNode) {
-				String stringNode = ((TreeStructureNode)element).data.toString();
-				if(constraintMap.containsKey(stringNode)) {
-					ITreeContentProvider provider =
-							(ITreeContentProvider)treeViewer.getContentProvider();
-					Object parent = provider.getParent(element);
-					Object parent2 = provider.getParent(parent);
-					ConstraintConfiguration config = ((ConstraintConfiguration)parent2);
-					EList<String> activeConstraints = config.getActiveConstraints();
-					for(String string : activeConstraints) {
-						if(string.equalsIgnoreCase(stringNode)) {
-							return true;
-						}
-					}
-				}
-			}
-			return false;
-		}
-	}
-
-	/** Check state listener for the tree of configurations. */
-	private class ConfigTreeCheckStateListener implements ICheckStateListener {
-		/** {@inheritDoc} */
-		@Override
-		public void checkStateChanged(CheckStateChangedEvent event) {
-			// Get object element from the state changed
-			Object element = event.getElement();
-			IConstraintService cs = IConstraintService.getInstance();
-			IConstraintUIService cuis = IConstraintUIService.getInstance();
-			ConstraintConfiguration currentObj = editedObject.getCurrentObjective();
-			if(element instanceof ConstraintWithContextualConfiguration) {
-				ConstraintWithContextualConfiguration cstrInContext =
-						(ConstraintWithContextualConfiguration)element;
-				String name = cs.getName(cstrInContext.cstr);
-
-				top.runAsCommand(() -> {
-					if(event.getChecked()) {
-
-						cstrInContext.config.getActiveConstraints().add(name);
-						List<ConstraintConfiguration> activeConfigs =
-								getActiveConfigurationsTransitively(currentObj, null);
-						if(activeConfigs.contains(cstrInContext.config)) {
-							cuis.activate(cstrInContext.cstr, cstrContainer);
-						}
-					} else {
-						cstrInContext.config.getActiveConstraints().remove(name);
-						List<Class<? extends IConstraint>> stillActiveCstrs =
-								getActiveConstraintsTransitively(currentObj, cstrInContext.config);
-						if(!stillActiveCstrs.contains(cstrInContext.cstr)) {
-							cuis.deactivate(cstrInContext.cstr, cstrContainer);
-						}
-					}
-				});
-			} else if(element instanceof ConfigurationRefWithContextualConfiguration) {
-
-				ConfigurationRefWithContextualConfiguration configRef =
-						(ConfigurationRefWithContextualConfiguration)element;
-				top.runAsCommand(() -> {
-					if(event.getChecked()) {
-						configRef.config.getIncludedConfigurations().add(configRef.target);
-						activateConfiguration(configRef.target, cstrContainer);
-					} else {
-						configRef.config.getIncludedConfigurations().remove(configRef.target);
-						deactivateConfiguration(configRef.target, cstrContainer, configRef.config);
-					}
-				});
-			}
-			// Check if the constraint belongs to the constraints HashMap
-			else if(element instanceof TreeStructureNode) {
-
-				ITreeContentProvider provider =
-						(ITreeContentProvider)treeViewer.getContentProvider();
-				Object parent = provider.getParent(element);
-				Object parent2 = provider.getParent(parent);
-				ConstraintConfiguration config = ((ConstraintConfiguration)parent2);
-				String constraintName = ((TreeStructureNode)element).data.toString();
-				if(constraintMap.containsKey(constraintName)) {
-					top.runAsNonDirtyingCommand(new Runnable() {
-						/** {@inheritDoc} */
-						@Override
-						public void run() {
-							// Get the constraintName as a full class path (e.g.,
-							// a.b.c.constraintName.Java)
-							if(event.getChecked()) {
-								config.getActiveConstraints().add(constraintName);
-
-								List<ConstraintConfiguration> activeConfigs =
-										getActiveConfigurationsTransitively(config, null);
-								// If the set of active constraints is not empty, and the selected
-								// constraint is in the active constraints list
-								if(!activeConfigs.isEmpty() && activeConfigs.get(0) != null) {
-									// get all active constraints of the first configuration which
-									// is selected using activeConfigs.get(0)
-									EList<String> activeConstraints =
-											activeConfigs.get(0).getActiveConstraints();
-									if(activeConstraints
-											.contains(cs.getConstraintByName(constraintName)
-													.getCanonicalName())) {
-										// Activate the constraint
-										cuis.activate(cs.getConstraintByName(constraintName),
-												cstrContainer);
-									}
-								}
-							} else {
-								clearConstraintInstance(cs, cuis, config, constraintName);
-							}
-						}
-					});
-				}
-			}
-			treeViewer.refresh();
-		}
-	}
-
-	/** Tree for configurations. */
-	private class ConfigTree extends CheckboxTreeViewer implements ISelectionChangedListener {
-
-		/** Constructor. */
-		public ConfigTree(Composite parent) {
-			super(parent);
-			getTree().setLayoutData(new GridData(800, 600));
-			setContentProvider(new ConfigTreeContentProvider());
-			setCheckStateProvider(new ConfigTreeCheckStateProvider());
-			addCheckStateListener(new ConfigTreeCheckStateListener());
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void selectionChanged(SelectionChangedEvent event) {
-			selection = event.getSelection();
-			IActionService.getInstance().refresh();
-		}
-	}
-
-	/** Creates the tree of configurations. */
-	private void createTree(Composite parent) {
-		treeViewer = new ConfigTree(parent);
-		TreeColumn column = new TreeColumn(treeViewer.getTree(), SWT.LEFT);
-		column.setText("Constraint configurations");
-		column.setWidth(COLUMN_WIDTH);
-		TreeViewerColumn onlyViewerColumn = new TreeViewerColumn(treeViewer, column);
-		onlyViewerColumn.setLabelProvider(new BoldColumnLabelProvider());
-
-		onlyViewerColumn.setEditingSupport(new EditingSupport(treeViewer) {
-			/** {@inheritDoc} */
-			@Override
-			protected void setValue(Object element, Object value) {
-				if(element instanceof DummyObject) {
-					if(!alreadyExists((String)value)) {
-						ConstraintConfiguration newconfig =
-								ElementFactory.eINSTANCE.createConstraintConfiguration();
-						newconfig.setName((String)value);
-						top.runAsCommand(() -> IElementCompositorService.getInstance()
-								.compose(editedObject, newconfig, null));
-					}
-				}
-				if(element instanceof ConstraintConfiguration) {
-					ConstraintConfiguration config = (ConstraintConfiguration)element;
-					if(config.getName().equals(DEFAULT_CONFIGURATION_NAME) ||
-							config.getName().equals(value)) {
-						return;
-					}
-					if(!alreadyExists((String)value)) {
-						top.runAsCommand(
-								() -> ((ConstraintConfiguration)element).setName((String)value));
-					}
-				}
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			protected Object getValue(Object element) {
-				return getLabelText(element);
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			protected CellEditor getCellEditor(Object element) {
-				return new TextCellEditor((Composite)getViewer().getControl());
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			protected boolean canEdit(Object element) {
-				return element instanceof ConstraintConfiguration ||
-						element instanceof DummyObject || constraintMap.containsKey(element);
-			}
-		});
-		treeViewer.setUseHashlookup(true);
-		treeViewer.setComparator(new ConstraintComparator());
-		treeViewer.setInput(editedObject);
-	}
-
-	/**
-	 * @param element
-	 *            the element to set color
-	 * @return color instance that will be applied on the element
-	 */
-	public Color getConstraintBackgroundColor(Object element) {
-		// Get the complete path of the constraint class (e.g., a.b.c.constraint.java)
-		String constraintToFind = ((TreeStructureNode)element).data.toString();
-		// If the constraint is in the active constraint list and the status is true
-		// than make the background color green
-
-		EList<ConstraintInstance> constraintInstances =
-				editedObject.getConstraintInstanceContainer().getConstraintInstances();
-		ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();
-		Object parent = provider.getParent(element);
-		Object parent2 = provider.getParent(parent);
-		ConstraintConfiguration config = ((ConstraintConfiguration)parent2);
-
-		final Display display = Display.getCurrent();
-		if(config.getName().equalsIgnoreCase(editedObject.getCurrentObjective().getName())) {
-			for(ConstraintInstance instance : constraintInstances) {
-				for(String constraintName : editedObject.getCurrentObjective()
-						.getActiveConstraints()) {
-					if(instance.getConstraintName().equalsIgnoreCase(constraintName) &&
-							constraintToFind.equalsIgnoreCase(constraintName)) {
-						IConstraintInstanceStatus status =
-								IConstraintUIService.getInstance().getStatus(instance);
-						if(status instanceof SuccessConstraintInstanceStatus) {
-							return display.getSystemColor(SWT.COLOR_GREEN);
-						} else if(status instanceof FailedConstraintInstanceStatus) {
-							return display.getSystemColor(SWT.COLOR_RED);
-						}
-					}
-				}
-			}
-		}
-		return display.getSystemColor(SWT.COLOR_WHITE);
-	}
-
-	/**
-	 * Checks if the name already exists among current configurations, if so displays an error
-	 * message and return true, otherwise returns false.
-	 */
-	private boolean alreadyExists(String name) {
-		List<String> configNames =
-				editedObject.getConfigurations().stream().map(c -> c.getName()).collect(toList());
-		if(configNames.contains(name)) {
-			Status status = new Status(ERROR, ToolingBaseUIActivator.PLUGIN_ID, 0,
-					"A configuration with this name already exists.", null);
-			openError(Display.getCurrent().getActiveShell(), "Error", null, status);
-			return true;
-		}
-		return false;
-	}
-
-	/** Comparator for the contents of the tree. */
-	private class ConstraintComparator extends ViewerComparator {
-
-		/** {@inheritDoc} */
-		@Override
-		public int compare(Viewer viewer, Object e1, Object e2) {
-			if(e1 instanceof DummyObject) {
-				return -1;
-			} else if(e2 instanceof DummyObject) {
-				return 1;
-			} else if(e1 instanceof ConstraintConfiguration &&
-					e2 instanceof ConstraintConfiguration) {
-				return ((ConstraintConfiguration)e1).getName()
-						.compareToIgnoreCase(((ConstraintConfiguration)e2).getName());
-			} else if(e1 instanceof ConstraintWithContextualConfiguration &&
-					e2 instanceof ConstraintWithContextualConfiguration) {
-				IConstraintUIService cuis = IConstraintUIService.getInstance();
-				String desc1 =
-						cuis.getDescription(((ConstraintWithContextualConfiguration)e1).cstr);
-				String desc2 =
-						cuis.getDescription(((ConstraintWithContextualConfiguration)e2).cstr);
-				return desc1.compareToIgnoreCase(desc2);
-			} else if(e1 instanceof ConfigurationRefWithContextualConfiguration &&
-					e2 instanceof ConfigurationRefWithContextualConfiguration) {
-				String n1 = ((ConfigurationRefWithContextualConfiguration)e1).target.getName();
-				String n2 = ((ConfigurationRefWithContextualConfiguration)e2).target.getName();
-				return n1.compareToIgnoreCase(n2);
-			} else if(e1 instanceof TreeStructureNode && e2 instanceof TreeStructureNode) {
-				String n1 = ((TreeStructureNode)e1).parent.toString();
-				String n2 = ((TreeStructureNode)e2).parent.toString();
-				return n1.compareToIgnoreCase(n2);
-			}
-			return super.compare(viewer, e1, e2);
-		}
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public EObject getSelectedModelElement() {
-		if(getSelectedModelElementList().isEmpty()) {
-			return null;
-		}
-		// Returns the first element, which is ensured to exist by the previous statement.
-		Object selected = getSelectedModelElementList().get(0);
-		return selected instanceof EObject ? (EObject)selected : null;
-	}
-
-	/** {@inheritDoc} */
-	@SuppressWarnings("unchecked")
-	@Override
-	public List<EObject> getSelectedModelElementList() {
-		boolean isStructured = selection instanceof StructuredSelection;
-		return isStructured ? ((StructuredSelection)selection).toList() : new ArrayList<>();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		// Not supported
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public ISelection getSelection() {
-		return selection == null ? new StructuredSelection() : selection;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		// Not supported
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void setSelection(ISelection selection) {
-		// Not supported
-	}
-
-	/**
-	 * If the constraint is unchecked from the tree remove the
-	 * constraint from the active constraints list and constraint instance list
-	 * 
-	 * @param cs
-	 *            constraintService
-	 * @param cuis
-	 *            constraintUIService
-	 * @param config
-	 *            the configuration in which the constraint remains
-	 * @param constraintName
-	 *            the name of the constraint
-	 */
-	private void clearConstraintInstance(IConstraintService cs, IConstraintUIService cuis,
-			ConstraintConfiguration config, String constraintName) {
-
-		config.getActiveConstraints().remove(constraintName);
-		// If the constraint is still not active
-		EList<String> stillActiveConstraints = config.getActiveConstraints();
-		if(!stillActiveConstraints
-				.contains(cs.getConstraintByName(constraintName).getCanonicalName())) {
-			Class<? extends IConstraint> constrainttoDeActivate =
-					cs.getConstraintByName(constraintName);
-			// Deactivate the constraint
-			cuis.deactivate(constrainttoDeActivate, cstrContainer);
-
-			ITopLevelElement modelContext =
-					IPersistencyService.getInstance().getTopLevelElementFor(editedObject);
-			modelContext.runAsNonDirtyingCommand(() -> {
-
-				TreeIterator<EObject> allContents =
-						editedObject.getCurrentObjective().eResource().getAllContents();
-				EList<EObject> eContents = editedObject.getCurrentObjective().eContents();
-				List<EObject> duplicateList = new ArrayList<EObject>();
-				duplicateList.addAll(eContents);
-				List<Object> toRemove = new ArrayList<Object>();
-
-				while(allContents.hasNext()) {
-					EObject next = allContents.next();
-
-					if(next instanceof ConstraintNameToChecksumImpl &&
-							next.toString().contains(constraintName)) {
-						toRemove.add(next);
-					}
-					if(next instanceof ConstraintInstanceImpl &&
-							next.toString().contains(constraintName)) {
-						toRemove.add(next);
-					}
-				}
-				toRemove.forEach(c -> {
-					duplicateList.remove(c);
-					delete((EObject)c);
-				});
-			});
-		}
-	}
-
-	/**
-	 * @param viewer
-	 *            the tree viewer
-	 * @param parentElement
-	 *            the parent element of the given element
-	 * @param element
-	 *            the element to consider
-	 * @return the decision on whether the constraint was checked in previous dependent configs or
-	 *         not
-	 */
-	private boolean checkIfDuplicate(Viewer viewer, Object parentElement, Object element) {
-		ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();
-
-		ConstraintConfiguration config =
-				((ConstraintConfiguration)provider.getParent(parentElement));
-		List<Class<? extends IConstraint>> activeConstraintsTransitively =
-				getActiveConstraintsTransitively(config, null);
-		List<String> constraintList = activeConstraintsTransitively.stream()
-				.map((item) -> item.getName()).collect(toList());
-
-		for(String string : constraintList) {
-			if(!config.getActiveConstraints().contains(string) &&
-					((TreeStructureNode)element).data.toString().equalsIgnoreCase(string)) {
-				return false;
-			}
-		}
-
-		return true;
-	}
-
-	/** @return the concatenated string containing the score for the configuration. */
-	private String getInstanceCount(Object element) {
-		String constraintGroupName = ((TreeStructureNode)element).data.toString();
-		// If the constraint is in the active constraint list and the status is true
-		// than make the background color green
-
-		int successCount = 0;
-		int failCount = 0;
-		HashMap<String, String> hashMap = groupNameAndConstraints.get(constraintGroupName);
-		EList<ConstraintInstance> constraintInstances =
-				editedObject.getConstraintInstanceContainer().getConstraintInstances();
-		ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();
-		Object parent = provider.getParent(element);
-		ConstraintConfiguration config = ((ConstraintConfiguration)parent);
-
-		EList<String> activeConstraints = config.getActiveConstraints();
-		List<Class<? extends IConstraint>> stillActiveCstrs =
-				getActiveConstraintsTransitively(config, null);
-
-		int duplicateSize = stillActiveCstrs.stream()
-				.filter(c -> !(activeConstraints.contains(c.getName()))).collect(toList()).size();
-		if(config.getName().equalsIgnoreCase(editedObject.getCurrentObjective().getName())) {
-			for(ConstraintInstance instance : constraintInstances) {
-				for(String constraintName : editedObject.getCurrentObjective()
-						.getActiveConstraints()) {
-					if(instance.getConstraintName().equalsIgnoreCase(constraintName) &&
-							(hashMap.containsKey(constraintName))) {
-						IConstraintInstanceStatus status =
-								IConstraintUIService.getInstance().getStatus(instance);
-						if(status instanceof SuccessConstraintInstanceStatus) {
-							successCount++;
-						}
-					}
-				}
-			}
-
-			int totalNumOfGrpConstraints = hashMap.size() - duplicateSize;
-			return "[ " + successCount + " / " + failCount + "/" + totalNumOfGrpConstraints + " ]";
-		}
-		return "";
-	}
-
-	/** Text labels for the tree of configurations. */
-	private StyledString getStylizedLabel(Object element) {
-		if(element instanceof DummyObject) {
-			return new StyledString("click to add a new configuration");
-		} else if(element instanceof ConstraintConfiguration) {
-			return new StyledString(((ConstraintConfiguration)element).getName());
-		} else if(element instanceof ConstraintBasedProcessEditorHelper.ConstraintWithContextualConfiguration) {
-			IConstraintUIService cuis = IConstraintUIService.getInstance();
-			return new StyledString(cuis.getDescription(
-					((ConstraintBasedProcessEditorHelper.ConstraintWithContextualConfiguration)element).cstr));
-		} else if(element instanceof ConfigurationRefWithContextualConfiguration) {
-			return new StyledString(
-					((ConfigurationRefWithContextualConfiguration)element).target.getName());
-		} else if(element instanceof List<?>) {
-			return new StyledString("Required configurations");
-		} else if(element instanceof TreeStructureNode) {
-
-			Object stringNode = ((TreeStructureNode)element).data;
-			if(groupNameAndConstraints.containsKey(stringNode)) {
-				for(String constraintGroupName : groupNameAndConstraints.keySet()) {
-					if((stringNode.toString().equalsIgnoreCase(constraintGroupName.toString()))) {
-
-						ArrayList<Integer> instanceCountList = getInstanceCount2(element);
-						int constarintNameLength = constraintGroupName.length();
-						if(instanceCountList == null) {
-							StyledString finalString = new StyledString(constraintGroupName);
-							adjustColorIndex(groupNameAndConstraints.keySet().size());
-							finalString.setStyle(0, finalString.length(), new NormalFontStyler());
-							return finalString;
-						}
-						// the elements are stored in the list sequentially- success count, fail
-						// count and total number of instances
-						String successfulConst = Integer.toString(instanceCountList.get(0));
-						int successLength = successfulConst.length();
-						String failedConst = Integer.toString(instanceCountList.get(1));
-						String totalConst = Integer.toString(instanceCountList.get(2));
-						int failCountLength = failedConst.length();
-						// creating the string with all the counts
-						if(instanceCountList.size() == 3) {
-
-							StyledString finalString = new StyledString(constraintGroupName + "[" +
-									successfulConst + "/" + failedConst + "/" + totalConst + "]");
-							adjustColorIndex(groupNameAndConstraints.keySet().size());
-
-							finalString.setStyle(0, finalString.length(), new NormalFontStyler());
-							finalString.setStyle(constarintNameLength + 1, successLength,
-									new GreenFontStyler());
-							finalString.setStyle(constarintNameLength + 2 + successLength,
-									failCountLength, new RedFontStyler());
-							return finalString;
-						}
-					}
-				}
-			} else if(constraintMap.containsKey(stringNode)) {
-				return new StyledString(constraintMap.get(stringNode));
-			}
-		}
-		return null;
-	}
-
-	/** Class to create stylized string for labels of the tree. */
-	private class BoldColumnLabelProvider extends DelegatingStyledCellLabelProvider {
-		/** {@inheritDoc} */
-		@Override
-		public Color getForeground(Object element) {
-			return null;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public Color getBackground(Object element) {
-			if(element instanceof TreeStructureNode) {
-				if(constraintMap.containsKey(((TreeStructureNode)element).data.toString())) {
-					// Ask for the constraint color based on status
-					return getConstraintBackgroundColor(element);
-				}
-			}
-			return null;
-		}
-
-		/** Class for generating stylized text. */
-		public BoldColumnLabelProvider() {
-			super(new IStyledLabelProvider() {
-				/** {@inheritDoc} */
-				@Override
-				public Image getImage(Object element) {
-					return null;
-				}
-
-				/** {@inheritDoc} */
-				@Override
-				public StyledString getStyledText(Object element) {
-					return getStylizedLabel(element);
-				}
-
-				/** {@inheritDoc} */
-				@Override
-				public void addListener(ILabelProviderListener listener) {
-					return;
-				}
-
-				/** {@inheritDoc} */
-				@Override
-				public void dispose() {
-					return;
-				}
-
-				/** {@inheritDoc} */
-				@Override
-				public boolean isLabelProperty(Object element, String property) {
-					return false;
-				}
-
-				/** {@inheritDoc} */
-				@Override
-				public void removeListener(ILabelProviderListener listener) {
-					return;
-				}
-			});
-		}
-	}
-
-	/**
-	 * @param element
-	 *            the group name element
-	 * @return array list of integer containing success count, fail count, and total count
-	 */
-	private ArrayList<Integer> getInstanceCount2(Object element) {
-		String constraintGroupName = ((TreeStructureNode)element).data.toString();
-		// If the constraint is in the active constraint list and the status is true
-		// than make the background color green
-
-		int successCount = 0;
-		int failCount = 0;
-		HashMap<String, String> hashMap = groupNameAndConstraints.get(constraintGroupName);
-		EList<ConstraintInstance> constraintInstances =
-				editedObject.getConstraintInstanceContainer().getConstraintInstances();
-		ITreeContentProvider provider = (ITreeContentProvider)treeViewer.getContentProvider();
-		Object parent = provider.getParent(element);
-		ConstraintConfiguration config = ((ConstraintConfiguration)parent);
-
-		if(config.getName().equalsIgnoreCase(editedObject.getCurrentObjective().getName())) {
-			for(ConstraintInstance instance : constraintInstances) {
-				for(String constraintName : editedObject.getCurrentObjective()
-						.getActiveConstraints()) {
-					if(instance.getConstraintName().equalsIgnoreCase(constraintName) &&
-							(hashMap.containsKey(constraintName))) {
-						IConstraintInstanceStatus status =
-								IConstraintUIService.getInstance().getStatus(instance);
-						if(status instanceof SuccessConstraintInstanceStatus) {
-							successCount++;
-						}
-						if(status instanceof FailedConstraintInstanceStatus) {
-							failCount++;
-						}
-					}
-				}
-			}
-			ArrayList<Integer> countList = new ArrayList<Integer>();
-			countList.add(new Integer(successCount));
-			countList.add(new Integer(failCount));
-			countList.add(new Integer(hashMap.size()));
-			return countList;
-		}
-		return null;
-	}
-}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditorHelper.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditorHelper.java
deleted file mode 100644
index 11d48e8a2aecd48eea259a42ef1192c4b292a334..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/ConstraintBasedProcessEditorHelper.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2017 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.editor;
-
-import static org.eclipse.jface.resource.FontDescriptor.createFrom;
-
-import org.eclipse.jface.resource.FontDescriptor;
-import org.eclipse.jface.viewers.StyledString.Styler;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Font;
-import org.eclipse.swt.graphics.FontData;
-import org.eclipse.swt.graphics.TextStyle;
-import org.eclipse.swt.widgets.Display;
-import org.fortiss.tooling.base.model.element.ConstraintConfiguration;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-
-// TODO Refactor together with ConstraintBasedProcessEditor and provide a dedicated perspective (see #3189)
-/**
- * This class is a helper class that provides, 1) the colors for the constraint groups,
- * 2) manage the references between the constraint configurations and
- * 3) manages the tree manipulation that is used to visualize the constraintsGroups,
- * constraintConfigurations and constraints.
- * 
- * @author abid
- * 
- */
-public class ConstraintBasedProcessEditorHelper {
-
-	/** Color Array for at least seven groups. */
-	private static int[] colorArray =
-			{SWT.COLOR_DARK_GREEN, SWT.COLOR_DARK_BLUE, SWT.COLOR_DARK_YELLOW, SWT.COLOR_BLACK,
-					SWT.COLOR_DARK_RED, SWT.COLOR_GREEN, SWT.COLOR_CYAN};
-
-	/** Counter for the colorArray */
-	private static int colorCtr = 0;
-
-	/** Reference to a constraint configuration. */
-	private static class WithContextualConfiguration {
-
-		/** Contextual constraint configuration. */
-		ConstraintConfiguration config;
-
-		/** Constructor. */
-		public WithContextualConfiguration(ConstraintConfiguration config) {
-			this.config = config;
-		}
-	}
-
-	/** Constraint accompanied with a configuration providing the context. */
-	public static class ConstraintWithContextualConfiguration extends WithContextualConfiguration {
-
-		/** Constraint. */
-		/* package */Class<? extends IConstraint> cstr;
-
-		/** Constructor. */
-		public ConstraintWithContextualConfiguration(Class<? extends IConstraint> cstr,
-				ConstraintConfiguration config) {
-			super(config);
-			this.cstr = cstr;
-		}
-	}
-
-	/**
-	 * Configuration accompanied with another configuration providing the context.
-	 * Intent is that the contained configuration is a dependency of the context one.
-	 */
-	public static class ConfigurationRefWithContextualConfiguration
-			extends WithContextualConfiguration {
-
-		/** Constraint. */
-		/* package */ConstraintConfiguration target;
-
-		/** Constructor. */
-		public ConfigurationRefWithContextualConfiguration(ConstraintConfiguration configRef,
-				ConstraintConfiguration config) {
-			super(config);
-			this.target = configRef;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean equals(Object obj) {
-			if(obj instanceof ConfigurationRefWithContextualConfiguration) {
-				// current target name
-				String currentTargetName = this.target.getName();
-				// contextualRef Target of the configuration
-				String configRefTrgtObjName =
-						((ConfigurationRefWithContextualConfiguration)obj).target.getName();
-				// current configuration
-				String currentConfigName = this.config.getName();
-				// contextualRef Object of the configuration
-				String configRefObjName =
-						((ConfigurationRefWithContextualConfiguration)obj).config.getName();
-				return currentTargetName.equalsIgnoreCase(configRefTrgtObjName) &&
-						currentConfigName.equalsIgnoreCase(configRefObjName);
-			}
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public int hashCode() {
-			return target.hashCode();
-		}
-	}
-
-	/** Class to manipulate and store parent of elements. */
-	public static class TreeStructureNode {
-
-		/** Parent object variable. */
-		/* package */Object parent;
-
-		/** Data object variable. */
-		/* package */Object data;
-
-		/** Constructor. */
-		public TreeStructureNode(Object parent, Object children) {
-			this.parent = parent;
-			this.data = children;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean equals(Object obj) {
-			if(obj instanceof TreeStructureNode) {
-				// the current tree node to be compared with
-				String currentStructureNode = this.data.toString();
-				// the tree node to be checked
-				String treeStructureNode = ((TreeStructureNode)obj).data.toString();
-				// parent of the current tree node
-				String currentParentNode = this.parent.toString();
-				// parent of the object that needs to be checked
-				String objectParentNode = ((TreeStructureNode)obj).parent.toString();
-				return currentStructureNode.equalsIgnoreCase(treeStructureNode) &&
-						currentParentNode.equalsIgnoreCase(objectParentNode);
-			}
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public int hashCode() {
-			return parent.hashCode();
-		}
-	}
-
-	/** Styler class to create colored bold labels for constraint group name. */
-	public static class NormalFontStyler extends Styler {
-
-		/** Counter to keep track of currently used color in color array. */
-		private int colorIndex = 0;
-
-		/** Constructor. */
-		public NormalFontStyler() {
-			this.colorIndex = colorCtr;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void applyStyles(final TextStyle textStyle) {
-
-			FontDescriptor boldDescriptor = createFrom(new FontData()).setStyle(SWT.BOLD);
-			Font boldFont = boldDescriptor.createFont(Display.getCurrent());
-			textStyle.font = boldFont;
-			textStyle.foreground = Display.getCurrent().getSystemColor(colorArray[colorIndex]);
-		}
-	}
-
-	/** Styler class to create red color labels. */
-	public static class RedFontStyler extends Styler {
-		/** {@inheritDoc} */
-		@Override
-		public void applyStyles(final TextStyle textStyle) {
-			FontDescriptor boldDescriptor = createFrom(new FontData()).setStyle(SWT.BOLD);
-			Font boldFont = boldDescriptor.createFont(Display.getCurrent());
-			textStyle.font = boldFont;
-			textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_RED);
-		}
-	}
-
-	/** Styler class to create green color labels. */
-	public static class GreenFontStyler extends Styler {
-		/** {@inheritDoc} */
-		@Override
-		public void applyStyles(final TextStyle textStyle) {
-			FontDescriptor boldDescriptor = createFrom(new FontData()).setStyle(SWT.BOLD);
-			Font boldFont = boldDescriptor.createFont(Display.getCurrent());
-			textStyle.font = boldFont;
-			textStyle.foreground = Display.getCurrent().getSystemColor(SWT.COLOR_DARK_GREEN);
-		}
-	}
-
-	/**
-	 * This function is responsible for updating the color of the constraints groups as they are
-	 * added by updating the color counter (i.e., ColorCtr)
-	 * 
-	 * @param groupSize
-	 *            is the size of the constraints groups
-	 */
-	public static void adjustColorIndex(int groupSize) {
-		colorCtr++;
-		colorCtr %= groupSize;
-	}
-}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..21108b1edd907c85abeb1a45d9b92e0fcc5e7941
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/.ratings
@@ -0,0 +1,9 @@
+ContextMenuUtil.java 3e04dbd52ee99a59735d39b4087c55b07fb91076 GREEN
+EObjectBasedDiagramControllerBase.java 3564ece9b3cac29caaf9201e0be3451a6a3c2b21 GREEN
+EObjectBasedRectangularResizableContentControllerBase.java a263a6c123ee96015e0a5c37b6e3c13ebd0e8a75 GREEN
+EObjectModelChangeProvider.java 664e4db2e32124832682aff8235ac380ed4db1c0 GREEN
+KernelServiceBasedModelChangeProviderBase.java 7c30347fb0c7cc4aacc79aeaf85167872afc1958 GREEN
+LayoutModelElementModelChangeProvider.java 70c50b789c0088a7e5363bf662bc707a5b5ddf10 GREEN
+LayoutedModelElementBasedContentAnchorageController.java c4dfb9dbcd16078c63321d5dec13a902e4088949 GREEN
+LayoutedModelElementBasedDiagramAnchorageController.java 8e66f7d8207d2b6a03abaa151f94b51449ad66c7 GREEN
+LayoutedModelElementBasedLinkBendPointController.java eb00b6119c02199b53b1a8e3cee2687f835b727c GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..4811e9c2991d2e451beef74b3519eb1eeb70d8b0
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/.ratings
@@ -0,0 +1,10 @@
+ContextMenuUtil.java 7be87ce47b775d90c533078e22d4d445d9864caf GREEN
+EObjectDiagramController.java 66b14c1c77953cad7caecae1e04f455958943f28 GREEN
+EObjectModelChangeProvider.java f4b60cebb088a5c81ca92a41614e1a5d40030502 GREEN
+EObjectRectangularResizableContentControllerBase.java 787a540213f29e8daaecd9afe98af8b3f4088db7 GREEN
+KernelServiceBasedModelChangeProviderBase.java 18e48f17ea8dfba90de024a8959fc5a4b0d05d45 GREEN
+LayoutModelChangeProvider.java b5449d02eaf39086909720c43e21bd061005fc9e GREEN
+LayoutedContentAnchorageController.java 3794b41d76e9ce14ead0bd812cde5c1a6d348d5c GREEN
+LayoutedDiagramAnchorageController.java 1e1ac7c5fa26c632736f5023e90f05d09bc0710d GREEN
+LayoutedLinkBendPointController.java a8372485ae96f2abf773d1baeb1f8c7b2b25985f GREEN
+LayoutedRectangularResizableContentController.java 1e18af3ee10dd3754325ed389fed664da65a0b61 GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java
new file mode 100644
index 0000000000000000000000000000000000000000..7be87ce47b775d90c533078e22d4d445d9864caf
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/ContextMenuUtil.java
@@ -0,0 +1,111 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static org.fortiss.tooling.base.utils.LayoutModelElementFactory.createPoint;
+
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewer;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerFeatures;
+import org.fortiss.tooling.base.dnd.ElementDropContext;
+import org.fortiss.tooling.base.model.layout.Point;
+import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
+import org.fortiss.tooling.kernel.extension.data.Prototype;
+import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+import org.fortiss.tooling.kernel.service.IPrototypeService;
+
+import javafx.scene.control.Menu;
+import javafx.scene.control.MenuItem;
+
+/**
+ * Helper class for creating context menus.
+ * 
+ * @author hoelzl
+ */
+final class ContextMenuUtil {
+	/** Creates the menu populated with composable prototypes. */
+	public static List<MenuItem> createPrototypeMenu(EObject target,
+			IElementCompositionContext context) {
+		IPrototypeService pers = IPrototypeService.getInstance();
+		IElementCompositorService ecs = IElementCompositorService.getInstance();
+		ICommandStackService css = ICommandStackService.getInstance();
+		List<MenuItem> result = new ArrayList<>();
+		Menu newMenu = new Menu("New ...");
+		List<Prototype> protos = pers.getComposablePrototypes(target.getClass());
+		for(Prototype p : protos) {
+			EObject prototypeCopy = p.getPrototypeCopy();
+			if(ecs.canCompose(target, prototypeCopy, context)) {
+				MenuItem mi = new MenuItem(p.getName());
+				mi.setOnAction(evt -> {
+					css.runAsCommand(target, () -> {
+						ecs.compose(target, prototypeCopy, context);
+					});
+				});
+				newMenu.getItems().add(mi);
+			}
+		}
+		if(!newMenu.getItems().isEmpty()) {
+			result.add(newMenu);
+		}
+		return result;
+	}
+
+	/** Creates the element composition context. */
+	public static IElementCompositionContext createElementCompositionContext(EObject target,
+			double x, double y, boolean isRoot, double zoom) {
+		Point loc = createPoint((int)x, (int)y, "CompositionPoint");
+		return new ElementDropContext(target, loc, isRoot, zoom);
+	}
+
+	/** Returns the default display menu for interaction with diagram viewer features. */
+	public static Menu createDisplayMenu(DiagramViewer viewer) {
+		Menu menu = new Menu("Display ...");
+		DiagramViewerFeatures features = viewer.getFeatures();
+		// link highlighting
+		if(features.isLinkHighlightingEnabled()) {
+			MenuItem disableLinkHighlighting = new MenuItem("Disable Link Highlighting");
+			disableLinkHighlighting.setOnAction(evt -> {
+				features.setLinkHighlightingEnabled(false);
+			});
+			menu.getItems().add(disableLinkHighlighting);
+		} else {
+			MenuItem enableLinkHighlighting = new MenuItem("Enable Link Highlighting");
+			enableLinkHighlighting.setOnAction(evt -> {
+				features.setLinkHighlightingEnabled(true);
+			});
+			menu.getItems().add(enableLinkHighlighting);
+		}
+		// interaction area shading
+		if(features.isInteractionAreaShadingEnabled()) {
+			MenuItem disableInteractionShading = new MenuItem("Disable Interactive Area Shading");
+			disableInteractionShading.setOnAction(evt -> {
+				features.setInteractionAreaShadingEnabled(false);
+			});
+			menu.getItems().add(disableInteractionShading);
+		} else {
+			MenuItem enableInteractionShading = new MenuItem("Enable Interactive Area Shading");
+			enableInteractionShading.setOnAction(evt -> {
+				features.setInteractionAreaShadingEnabled(true);
+			});
+			menu.getItems().add(enableInteractionShading);
+		}
+		return menu;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java
new file mode 100644
index 0000000000000000000000000000000000000000..66b14c1c77953cad7caecae1e04f455958943f28
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectDiagramController.java
@@ -0,0 +1,88 @@
+/*******************************************************************************
+ * Copyright (c) 2017, 2018 fortiss GmbH. 
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Florian Hoelzl (fortiss GmbH) - initial implementation
+ *
+ *******************************************************************************/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.lang.Math.max;
+import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createDisplayMenu;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
+
+import java.util.List;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerFeatures;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base.ControllerBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
+
+import javafx.scene.Node;
+import javafx.scene.control.MenuItem;
+
+/**
+ * Diagram controller that uses the {@link IElementCompositorService} to create context menu
+ * entries for prototypes provided by the {@link IContextMenuService}.
+ * 
+ * @author hoelzl
+ */
+public class EObjectDiagramController<T extends EObject> extends ControllerBase {
+
+	/** The model change provider. */
+	private final EObjectModelChangeProvider modelChangeProvider;
+
+	/** Constructor. */
+	public EObjectDiagramController(IMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+		this.modelChangeProvider = new EObjectModelChangeProvider(getModelElement());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IModelChangeProvider getModelChangeProvider() {
+		return modelChangeProvider;
+	}
+
+	/** Returns the {@link EObject} model element. */
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		// wild cast works: see constructor check with exception
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<MenuItem> contextMenuContributions(Node node, DiagramCoordinate diagramLocation) {
+		// outer-most grid areas of the diagram are inaccessible
+		DiagramViewerFeatures features = getViewer().getFeatures();
+		double x = max(features.getHorizontalSpacing(), diagramLocation.getX());
+		double y = max(features.getVerticalSpacing(), diagramLocation.getY());
+
+		// wild cast works: see constructor exception
+		T modelParent = getModelElement();
+		IElementCompositionContext edc = createElementCompositionContext(modelParent, x, y, true,
+				getViewer().getFeatures().getCurrentZoomFactor());
+		List<MenuItem> result = createPrototypeMenu(modelParent, edc);
+		result.add(createDisplayMenu(getViewer()));
+		return result;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectModelChangeProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectModelChangeProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..f4b60cebb088a5c81ca92a41614e1a5d40030502
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectModelChangeProvider.java
@@ -0,0 +1,60 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.ecore.EObject;
+
+/**
+ * An {@link KernelServiceBasedModelChangeProviderBase} for {@link EObject}s.
+ * 
+ * @author hoelzl
+ */
+final class EObjectModelChangeProvider extends KernelServiceBasedModelChangeProviderBase<EObject> {
+	/** The model element. */
+	private final EObject modelElement;
+	/** The EMF notification listener. */
+	private final EObjectElementAdapter notificationListener;
+
+	/** Constructor. */
+	public EObjectModelChangeProvider(EObject modelElement) {
+		this.modelElement = modelElement;
+		this.notificationListener = new EObjectElementAdapter();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected EObject getModelElement() {
+		return modelElement;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Adapter getNotificationListener() {
+		return notificationListener;
+	}
+
+	/** Specialized adapter listening to model changes of {@link EObject}. */
+	private class EObjectElementAdapter extends AdapterImpl {
+		/** {@inheritDoc} */
+		@Override
+		public void notifyChanged(Notification event) {
+			addNotification(event);
+		}
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..787a540213f29e8daaecd9afe98af8b3f4088db7
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/EObjectRectangularResizableContentControllerBase.java
@@ -0,0 +1,180 @@
+/*******************************************************************************
+ * Copyright (c) 2017, 2018 fortiss GmbH. 
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Florian Hoelzl (fortiss GmbH) - initial implementation
+ *
+ *******************************************************************************/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.lang.Math.max;
+import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_HEIGHT;
+import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_SHAPE_MINIMUM_WIDTH;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createElementCompositionContext;
+import static org.fortiss.tooling.base.ui.editor.fx.controller.ContextMenuUtil.createPrototypeMenu;
+
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerFeatures;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.change.Change;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IClickController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IDragController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base.ClickControllerBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.rectangular.RectangularContentAnchorageMoveController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.rectangular.RectangularResizableContentControllerBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.fortiss.tooling.base.model.element.ElementPackage;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
+import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
+import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
+
+import javafx.geometry.Dimension2D;
+import javafx.scene.Node;
+import javafx.scene.control.MenuItem;
+import javafx.scene.input.MouseEvent;
+
+/**
+ * {@link RectangularResizableContentControllerBase} with a listener mechanism for the layout of the
+ * connected {@link EObject model element}.
+ * 
+ * @author hoelzl
+ */
+public abstract class EObjectRectangularResizableContentControllerBase<T extends EObject>
+		extends RectangularResizableContentControllerBase {
+
+	/** {@link IModelChangeProvider} for this controller */
+	private final LayoutModelChangeProvider layoutModelChangeProvider;
+	/** The click controller handling double-click to open editor. */
+	private final IClickController openEditorDoubleClickController = new ClickControllerBase() {
+		@Override
+		public Change singleClick(MouseEvent event, Node node, DiagramCoordinate diagramLocation) {
+			return EObjectRectangularResizableContentControllerBase.super.getClickController(node,
+					diagramLocation).singleClick(event, node, diagramLocation);
+		}
+
+		@Override
+		public Change secondaryClick(MouseEvent event, Node node,
+				DiagramCoordinate diagramLocation) {
+			return EObjectRectangularResizableContentControllerBase.super.getClickController(node,
+					diagramLocation).secondaryClick(event, node, diagramLocation);
+		}
+
+		@Override
+		public Change doubleClick(MouseEvent event, Node node, DiagramCoordinate diagramLocation) {
+			EObject eo = getModelElement();
+			IModelElementHandler<EObject> handler =
+					IModelElementHandlerService.getInstance().getModelElementHandler(eo);
+			if(handler != null) {
+				eo = handler.handleOpenModelElementRequest(eo);
+			}
+			IModelEditorBindingService.getInstance().openInEditor(eo);
+			return null; // no changes to model
+		}
+	};
+
+	/** Constructor. */
+	public EObjectRectangularResizableContentControllerBase(IContentMVCBundle mvcb,
+			Class<T> modelType) {
+		super(mvcb);
+
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+
+		ILayoutedModelElement lme = (ILayoutedModelElement)mvcb.getModel();
+		this.layoutModelChangeProvider = new LayoutModelChangeProvider(lme) {
+			/** {@inheritDoc} */
+			@Override
+			protected boolean acceptNotification(Notification notification) {
+				if(notification.getNotifier() != getModelElement()) {
+					return false;
+				}
+				return isAnchorageFeature(notification.getFeature());
+			}
+		};
+	}
+
+	/** Returns the correctly casted model element. */
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		// wild cast works: see constructor check with exception
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IModelChangeProvider getModelChangeProvider() {
+		return layoutModelChangeProvider;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected IDragController createAnchorageMoveController(IContentAnchorageMVCBundle anchorage) {
+		// we need an overridden port move controller due to the frameworks default snapping
+		// behavior, which snaps to anchorage size while AF3 ports snap to half their size
+		return new RectangularContentAnchorageMoveController(this, anchorage) {
+			/** {@inheritDoc} */
+			@Override
+			protected Dimension2D overrideBorderSnap(Dimension2D anchorageSize) {
+				// this override is required because ports can be moved by half their size
+				// while the default implementation would only allow for full size of the port
+				return new Dimension2D(anchorageSize.getWidth() / 2, anchorageSize.getHeight() / 2);
+			}
+		};
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Dimension2D getMinimumSize() {
+		return new Dimension2D(DEFAULT_SHAPE_MINIMUM_WIDTH, DEFAULT_SHAPE_MINIMUM_HEIGHT);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<MenuItem> contextMenuContributions(Node node, DiagramCoordinate diagramLocation) {
+		// outer-most grid areas of the diagram are inaccessible
+		DiagramViewerFeatures features = getViewer().getFeatures();
+		double x = max(features.getHorizontalSpacing(), diagramLocation.getX());
+		double y = max(features.getVerticalSpacing(), diagramLocation.getY());
+
+		// wild cast works: see constructor exception
+		EObject modelParent = (EObject)getModel();
+		IElementCompositionContext edc = createElementCompositionContext(modelParent, x, y, false,
+				getViewer().getFeatures().getCurrentZoomFactor());
+		return createPrototypeMenu(modelParent, edc);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void delete() {
+		IElementCompositorService.getInstance().decompose(getModelElement());
+	}
+
+	/** Checks whether the given feature corresponds to an anchorage model element. */
+	protected boolean isAnchorageFeature(Object feature) {
+		return feature == ElementPackage.Literals.IHIERARCHIC_ELEMENT__CONNECTORS;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IClickController getClickController(Node node, DiagramCoordinate diagramLocation) {
+		return openEditorDoubleClickController;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/KernelServiceBasedModelChangeProviderBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/KernelServiceBasedModelChangeProviderBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..18e48f17ea8dfba90de024a8959fc5a4b0d05d45
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/KernelServiceBasedModelChangeProviderBase.java
@@ -0,0 +1,89 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import java.util.ArrayList;
+import java.util.EventObject;
+import java.util.List;
+
+import org.eclipse.emf.common.command.CommandStackListener;
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.ModelChangeProviderBase;
+import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
+import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.tooling.kernel.service.IPersistencyService;
+
+/**
+ * Base class for {@link IModelChangeProvider}s using kernel services.
+ * 
+ * @author hoelzl
+ */
+abstract class KernelServiceBasedModelChangeProviderBase<T extends EObject>
+		extends ModelChangeProviderBase implements CommandStackListener {
+	/** The persistency service reference. */
+	private static final IPersistencyService persistencyService = IPersistencyService.getInstance();
+	/** The command stack service. */
+	private static final ICommandStackService commandStackService =
+			ICommandStackService.getInstance();
+	/** List of relevant {@link Notification}s recorded during a change transaction. */
+	private final List<Notification> notifications = new ArrayList<>();
+
+	/** Returns the model element. */
+	protected abstract T getModelElement();
+
+	/** Returns the EMF notification listener. */
+	protected abstract Adapter getNotificationListener();
+
+	/** Adds the given {@link Notification} to list of notifications. */
+	protected final void addNotification(Notification event) {
+		notifications.add(event);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected final void connectToModel() {
+		notifications.clear();
+		T modelElement = getModelElement();
+		Adapter notificationListener = getNotificationListener();
+		ITopLevelElement root = persistencyService.getTopLevelElementFor(modelElement);
+		commandStackService.addCommandStackListener(root, this);
+		modelElement.eAdapters().add(notificationListener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected final void disconnectFromModel() {
+		T modelElement = getModelElement();
+		Adapter notificationListener = getNotificationListener();
+		modelElement.eAdapters().remove(notificationListener);
+		ITopLevelElement root = persistencyService.getTopLevelElementFor(modelElement);
+		commandStackService.removeCommandStackListener(root, this);
+		notifications.clear();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void commandStackChanged(EventObject event) {
+		if(notifications.isEmpty()) {
+			return;
+		}
+		fireUpdateComplete();
+		notifications.clear();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutModelChangeProvider.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutModelChangeProvider.java
new file mode 100644
index 0000000000000000000000000000000000000000..b5449d02eaf39086909720c43e21bd061005fc9e
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutModelChangeProvider.java
@@ -0,0 +1,127 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static org.fortiss.tooling.base.model.layout.LayoutPackage.ILAYOUTED_MODEL_ELEMENT__LAYOUT_DATA;
+
+import org.eclipse.emf.common.notify.Adapter;
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.util.EContentAdapter;
+import org.fortiss.tooling.base.model.layout.ILayoutData;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.LayoutPackage;
+
+/**
+ * A {@link KernelServiceBasedModelChangeProviderBase} for {@link ILayoutedModelElement}s.
+ * 
+ * @author hoelzl
+ */
+class LayoutModelChangeProvider
+		extends KernelServiceBasedModelChangeProviderBase<ILayoutedModelElement> {
+	/** The layouted model element. */
+	private final ILayoutedModelElement modelElement;
+	/** The layout EMF notification listener. */
+	private final LayoutModelElementAdapter notificationListener;
+
+	/** Constructor. */
+	public LayoutModelChangeProvider(ILayoutedModelElement modelElement) {
+		this.modelElement = modelElement;
+		this.notificationListener = new LayoutModelElementAdapter();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected ILayoutedModelElement getModelElement() {
+		return modelElement;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Adapter getNotificationListener() {
+		return notificationListener;
+	}
+
+	/**
+	 * Checks whether the given notification should be accepted.
+	 * 
+	 * @param notification
+	 *            the notification
+	 * @return whether the notification should be accepted
+	 */
+	protected boolean acceptNotification(Notification notification) {
+		return false;
+	}
+
+	/** Specific {@link EContentAdapter} listening to layout data changes. */
+	public class LayoutModelElementAdapter extends EContentAdapter {
+		/** {@inheritDoc} */
+		@Override
+		public void notifyChanged(Notification notification) {
+			if(acceptNotification(notification)) {
+				addNotification(notification);
+				return;
+			}
+			Object notifier = notification.getNotifier();
+			if(notifier == modelElement) {
+				Object feature = notification.getFeature();
+				if(feature == LayoutPackage.Literals.ILAYOUTED_MODEL_ELEMENT__LAYOUT_DATA) {
+					// self adapt to layout data
+					super.notifyChanged(notification);
+					addNotification(notification);
+					return;
+				}
+			} else if(notifier instanceof ILayoutData) {
+				// self adapt to layout data
+				super.notifyChanged(notification);
+				addNotification(notification);
+				return;
+			}
+			// prevent self-adapt for all other cases
+		}
+
+		/** Called when layout data of the underlying model element changed. */
+		protected void layoutChanged() {
+			// default does nothing
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		protected void selfAdapt(Notification notification) {
+			// ignore resources and resource sets
+			if(notification.getNotifier() instanceof EObject) {
+				super.selfAdapt(notification);
+			}
+		}
+
+		/** {@inheritDoc} */
+		@Override
+		protected void handleContainment(Notification notification) {
+			// only adapt to layout data
+			if(notification.getNotifier() instanceof ILayoutData) {
+				super.handleContainment(notification);
+				return;
+			}
+
+			Class<?> instanceClass =
+					LayoutPackage.Literals.ILAYOUTED_MODEL_ELEMENT.getInstanceClass();
+			// only adapt to layout data
+			if(notification.getFeatureID(instanceClass) == ILAYOUTED_MODEL_ELEMENT__LAYOUT_DATA) {
+				super.handleContainment(notification);
+			}
+		}
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedContentAnchorageController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedContentAnchorageController.java
new file mode 100644
index 0000000000000000000000000000000000000000..3794b41d76e9ce14ead0bd812cde5c1a6d348d5c
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedContentAnchorageController.java
@@ -0,0 +1,116 @@
+/*******************************************************************************
+ * Copyright (c) 2017, 2018 fortiss GmbH. 
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Florian Hoelzl (fortiss GmbH) - initial implementation
+ *
+ *******************************************************************************/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_ALLOWED_TAG;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_DENIED_TAG;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base.DelegatingContentAnchorageController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.MVCBundleTag;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+
+/**
+ * {@link DelegatingContentAnchorageController} for
+ * {@link org.fortiss.tooling.base.model.layout.ILayoutedModelElement}s.
+ * 
+ * @author hoelzl
+ */
+public class LayoutedContentAnchorageController<T extends ILayoutedModelElement>
+		extends DelegatingContentAnchorageController {
+	/** {@link IModelChangeProvider} for this controller */
+	private final LayoutModelChangeProvider layoutModelChangeProvider;
+
+	/** Constructor. */
+	public LayoutedContentAnchorageController(IContentAnchorageMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+
+		ILayoutedModelElement lme = (ILayoutedModelElement)mvcb.getModel();
+		this.layoutModelChangeProvider = new LayoutModelChangeProvider(lme);
+	}
+
+	/** Returns the model element. */
+	public ILayoutedModelElement getLayoutedME() {
+		return (ILayoutedModelElement)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IModelChangeProvider getModelChangeProvider() {
+		return layoutModelChangeProvider;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void delete() {
+		IElementCompositorService.getInstance().decompose(getLayoutedME());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean canLink(IMVCBundle startBundle, DiagramCoordinate startLocation,
+			IMVCBundle endBundle, DiagramCoordinate endLocation) {
+		IConnectionCompositorService ccs = IConnectionCompositorService.getInstance();
+		EObject start = (EObject)startBundle.getModel();
+		EObject end = (EObject)endBundle.getModel();
+		EObject root = (EObject)getViewer().getRootElement();
+		return ccs.canConnect(start, end, root, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void link(IMVCBundle startBundle, DiagramCoordinate startLocation,
+			IMVCBundle endBundle, DiagramCoordinate endLocation) {
+		EObject start = (EObject)startBundle.getModel();
+		EObject end = (EObject)endBundle.getModel();
+		EObject root = (EObject)getViewer().getRootElement();
+		IConnectionCompositorService.getInstance().connect(start, end, root, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean isPossibleLinkTarget() {
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public MVCBundleTag getLinkTargetEffectForNewLinkFrom(IMVCBundle linkSourceBundle) {
+		Object srcModel = linkSourceBundle.getModel();
+		if(srcModel instanceof ILayoutedModelElement && srcModel instanceof IConnector) {
+			EObject startModel = (EObject)srcModel;
+			ILayoutedModelElement endModel = getLayoutedME();
+			EObject root = (EObject)getViewer().getRootElement();
+			IConnectionCompositorService srv = IConnectionCompositorService.getInstance();
+			if(srv.canConnect(startModel, endModel, root, null)) {
+				return LINK_TARGET_ALLOWED_TAG;
+			}
+		}
+		return LINK_TARGET_DENIED_TAG;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedDiagramAnchorageController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedDiagramAnchorageController.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e1ac7c5fa26c632736f5023e90f05d09bc0710d
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedDiagramAnchorageController.java
@@ -0,0 +1,125 @@
+/*******************************************************************************
+ * Copyright (c) 2017, 2018 fortiss GmbH. 
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Florian Hoelzl (fortiss GmbH) - initial implementation
+ *
+ *******************************************************************************/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.util.Objects.requireNonNull;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_ALLOWED_TAG;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_DENIED_TAG;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.moveNode;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.FeedbackChange;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base.MoveControllerBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.MVCBundleTag;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
+import org.fortiss.tooling.kernel.service.IElementCompositorService;
+
+/**
+ * {@link MoveControllerBase} for {@link ILayoutedModelElement}s.
+ * 
+ * @author hoelzl
+ */
+public class LayoutedDiagramAnchorageController<T extends ILayoutedModelElement>
+		extends MoveControllerBase {
+	/** {@link IModelChangeProvider} for this controller */
+	private final LayoutModelChangeProvider layoutModelChangeProvider;
+
+	/** Constructor. */
+	public LayoutedDiagramAnchorageController(IMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+
+		ILayoutedModelElement lme = (ILayoutedModelElement)mvcb.getModel();
+		this.layoutModelChangeProvider = new LayoutModelChangeProvider(lme);
+	}
+
+	/** Returns the model element. */
+	public ILayoutedModelElement getLayoutedME() {
+		return (ILayoutedModelElement)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IModelChangeProvider getModelChangeProvider() {
+		return layoutModelChangeProvider;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void move(FeedbackChange delta) {
+		ILayoutedModelElement model = getLayoutedME();
+		int dx = (int)delta.getDeltaX();
+		int dy = (int)delta.getDeltaY();
+		moveNode(model, dx, dy);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void delete() {
+		IElementCompositorService.getInstance().decompose(getLayoutedME());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean canLink(IMVCBundle startBundle, DiagramCoordinate startLocation,
+			IMVCBundle endBundle, DiagramCoordinate endLocation) {
+		IConnectionCompositorService ccs = IConnectionCompositorService.getInstance();
+		EObject start = (EObject)startBundle.getModel();
+		EObject end = (EObject)endBundle.getModel();
+		EObject root = (EObject)getViewer().getRootElement();
+		return ccs.canConnect(start, end, root, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void link(IMVCBundle startBundle, DiagramCoordinate startLocation,
+			IMVCBundle endBundle, DiagramCoordinate endLocation) {
+		EObject start = (EObject)startBundle.getModel();
+		EObject end = (EObject)endBundle.getModel();
+		EObject root = (EObject)getViewer().getRootElement();
+		IConnectionCompositorService.getInstance().connect(start, end, root, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public boolean isPossibleLinkTarget() {
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public MVCBundleTag getLinkTargetEffectForNewLinkFrom(IMVCBundle linkSourceBundle) {
+		Object srcModel = linkSourceBundle.getModel();
+		if(srcModel instanceof ILayoutedModelElement && srcModel instanceof IConnector) {
+			EObject startModel = (EObject)srcModel;
+			ILayoutedModelElement endModel = getLayoutedME();
+			EObject root = (EObject)getViewer().getRootElement();
+			IConnectionCompositorService srv = IConnectionCompositorService.getInstance();
+			if(srv.canConnect(startModel, endModel, root, null)) {
+				return LINK_TARGET_ALLOWED_TAG;
+			}
+		}
+		return LINK_TARGET_DENIED_TAG;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedLinkBendPointController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedLinkBendPointController.java
new file mode 100644
index 0000000000000000000000000000000000000000..a8372485ae96f2abf773d1baeb1f8c7b2b25985f
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedLinkBendPointController.java
@@ -0,0 +1,142 @@
+/*******************************************************************************
+ * Copyright (c) 2017, 2018 fortiss GmbH. 
+ * 
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v2.0 which is available at
+ * http://www.eclipse.org/legal/epl-v20.html
+ * 
+ * SPDX-License-Identifier: EPL-2.0
+ * 
+ * Contributors:
+ *     Florian Hoelzl (fortiss GmbH) - initial implementation
+ *
+ *******************************************************************************/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.addConnectionPoint;
+import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.getConnectionPoints;
+import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.removeConnectionPoint;
+
+import java.util.List;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewer;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base.LinkControllerBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelChangeProvider;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.Point;
+import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
+
+/**
+ * {@link IController} for {@link ILayoutedModelElement}s representing links and connections in a
+ * {@link DiagramViewer}.
+ * 
+ * @author hoelzl
+ */
+public class LayoutedLinkBendPointController<T extends ILayoutedModelElement>
+		extends LinkControllerBase {
+	/** {@link IModelChangeProvider} for this controller */
+	private final LayoutModelChangeProvider layoutModelChangeProvider;
+
+	/** Constructor. */
+	public LayoutedLinkBendPointController(ILinkMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+
+		ILayoutedModelElement lme = (ILayoutedModelElement)mvcb.getModel();
+		this.layoutModelChangeProvider = new LayoutModelChangeProvider(lme);
+	}
+
+	/** Returns the model element. */
+	@SuppressWarnings("unchecked")
+	public T getModelElement() {
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean clampAndSnapBendPointToGridCenter() {
+		// disable default mode
+		return false;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean clampAndSnapBendPointToGrid() {
+		// enable clamping mode
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IModelChangeProvider getModelChangeProvider() {
+		return layoutModelChangeProvider;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected int getNumerOfBendPoints() {
+		return getBendPointList(getModelElement()).size();
+	}
+
+	/** Returns the list of bend-points. */
+	private EList<Point> getBendPointList(ILayoutedModelElement modelElement) {
+		return getConnectionPoints(modelElement).getPoints();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void createBendPointAt(int bpIndex, DiagramCoordinate location) {
+		int x = (int)location.getX();
+		int y = (int)location.getY();
+		addConnectionPoint(getModelElement(), bpIndex, x, y);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void updateModelAfterBendPointMove(int bpIndex, double dx, double dy) {
+		List<Point> oldPoints = getBendPointList(getModelElement());
+		Point point = oldPoints.get(bpIndex);
+		int oldX = point.getX();
+		int oldY = point.getY();
+		int newX = oldX + (int)dx;
+		int newY = oldY + (int)dy;
+		point.setX(newX);
+		point.setY(newY);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void deleteBendPoint(int bpIndex) {
+		removeConnectionPoint(getModelElement(), bpIndex);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void updateModelAfterLinkMove(ILinkMVCBundle linkBundle, IMVCBundle startBundle,
+			IMVCBundle endBundle) {
+		// ignored
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void deleteLink() {
+		IConnectionCompositorService.getInstance().disconnect(getModelElement());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void delete() {
+		deleteLink();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedRectangularResizableContentController.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedRectangularResizableContentController.java
new file mode 100644
index 0000000000000000000000000000000000000000..1e18af3ee10dd3754325ed389fed664da65a0b61
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/controller/LayoutedRectangularResizableContentController.java
@@ -0,0 +1,90 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.controller;
+
+import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.base.ui.utils.LWFXEditorUtils.convertSideToEOrientation;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.getNodeSize;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.moveNode;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.setNodeSize;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.setStickyConnectorLayoutData;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.FeedbackChange;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.layout.Dimension;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Side;
+
+/**
+ * {@link IController} for {@link ILayoutedModelElement}s that have a rectangular shape.
+ * 
+ * @author diewald
+ */
+public class LayoutedRectangularResizableContentController<T extends ILayoutedModelElement>
+		extends EObjectRectangularResizableContentControllerBase<T> {
+	/** Constructor. */
+	public LayoutedRectangularResizableContentController(IContentMVCBundle mvcb,
+			Class<T> modelType) {
+		super(mvcb, modelType);
+
+		Object model = requireNonNull(mvcb.getModel(), "The given model is null!");
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void moveAnchorageToSideOffset(IContentAnchorageMVCBundle anchorage, Side side,
+			double offset) {
+		Object connObj = anchorage.getModel();
+		if(connObj instanceof IConnector && connObj instanceof ILayoutedModelElement) {
+			ILayoutedModelElement conn = (ILayoutedModelElement)connObj;
+
+			Dimension2D portDim = anchorage.getVisual().getDimensions();
+			int correction;
+			if(side == Side.TOP || side == Side.BOTTOM) {
+				correction = (int)portDim.getWidth() / 2;
+			} else {
+				correction = (int)portDim.getHeight() / 2;
+			}
+			int corrected = (int)offset + correction;
+			setStickyConnectorLayoutData(conn, convertSideToEOrientation(side), corrected);
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void move(FeedbackChange deltaChange) {
+		moveNode(getModelElement(), (int)deltaChange.getDeltaX(), (int)deltaChange.getDeltaY());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected void resize(FeedbackChange delta) {
+		T element = getModelElement();
+		Dimension d = getNodeSize(element);
+		int w = d.getWidth() + (int)delta.getDeltaW();
+		int h = d.getHeight() + (int)delta.getDeltaH();
+		setNodeSize(element, w, h);
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..1f94f2987b843eba33765b057f6d210e4bbbcbb4
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/.ratings
@@ -0,0 +1 @@
+HierarchicElementModelFactoryBase.java 9996bfc1402c27424f0ae69e64560acce0ef81f4 GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/HierarchicElementModelFactoryBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/HierarchicElementModelFactoryBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..9996bfc1402c27424f0ae69e64560acce0ef81f4
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/model/HierarchicElementModelFactoryBase.java
@@ -0,0 +1,106 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.model;
+
+import static java.util.Collections.emptyList;
+import static java.util.Objects.requireNonNull;
+import static org.fortiss.tooling.common.util.LambdaUtils.filterList;
+
+import java.util.List;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
+import org.fortiss.tooling.base.model.element.IConnection;
+import org.fortiss.tooling.base.model.element.IHierarchicElement;
+
+/**
+ * {@link IModelFactory} for {@link IHierarchicElement}s of editors.
+ * 
+ * @author diewald
+ */
+public abstract class HierarchicElementModelFactoryBase<T extends IHierarchicElement>
+		implements IModelFactory {
+	/** The currently edited element. */
+	private final T rootElement;
+
+	/** Constructor. */
+	public HierarchicElementModelFactoryBase(T root) {
+		this.rootElement = requireNonNull(root);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public T getRootModel() {
+		return rootElement;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getDiagramAnchorageModels() {
+		return rootElement.getConnectors();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getContentAnchorageModels(Object parent) {
+		if(parent instanceof IHierarchicElement) {
+			return ((IHierarchicElement)parent).getConnectors();
+		}
+		return emptyList();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getLinkModels() {
+		return filterList(rootElement.getConnections(),
+				c -> filterPartiallyInitializedConnections(c));
+	}
+
+	/** Checks whether the given connection is only partially initialized. */
+	private boolean filterPartiallyInitializedConnections(IConnection c) {
+		return c.getSource() != null && c.getTarget() != null && c.eContainer() != null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getLinkStart(Object link) {
+		if(link instanceof IConnection) {
+			return ((IConnection)link).getSource();
+		}
+		return null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getLinkEnd(Object link) {
+		if(link instanceof IConnection) {
+			return ((IConnection)link).getTarget();
+		}
+		return null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getParent(Object element) {
+		// Not used at the moment, so return null.
+		return null;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void update() {
+		// Not used at the moment.
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..5a82836cd656dbc37a323c788161b6ffab643988
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/.ratings
@@ -0,0 +1,9 @@
+CoordinateCorrections.java c5cc475b45de38c56fc2e888a2d3093cd2efb52a GREEN
+LayoutedCircularAnchorageContentVisualBase.java 2aa292444671bf644e37bc923b877c92de0235b1 GREEN
+LayoutedCircularAnchorageDiagramVisualBase.java f06e3b908020408e3cd268a3c63edcd75ef74f8b GREEN
+LayoutedLineLinkVisual.java feea85e0bd288590fbe06c152a8a8b138ea85ca2 GREEN
+LayoutedRectangularContentVisualBase.java c2a3937b99284713e0bbcd3ce458874567b25ac5 GREEN
+NamedLayoutedCircularAnchorageContentVisual.java c680002469ce897679fa5a3f4af51d1b19cb53d6 GREEN
+NamedLayoutedCircularAnchorageDiagramVisual.java 714a176a0569a2049efb4009f710ca66bf3a57fb GREEN
+NamedLayoutedLineLinkVisual.java e66e5b2aaa40fe8b22a292e175bb8f3af4539b9d GREEN
+NamedLayoutedRectangularContentVisual.java 122e193ac587857d1dad23b42583a0bcf465f0d0 GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/CoordinateCorrections.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/CoordinateCorrections.java
new file mode 100644
index 0000000000000000000000000000000000000000..c5cc475b45de38c56fc2e888a2d3093cd2efb52a
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/CoordinateCorrections.java
@@ -0,0 +1,41 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import static org.fortiss.tooling.base.layout.DefaultLayoutConstants.DEFAULT_CONNECTOR_SIZE;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.base.ContentAnchorageVisualBase;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.rectangular.RectangularContentVisualBase;
+import org.fortiss.tooling.base.layout.DefaultLayoutConstants;
+
+import javafx.geometry.Dimension2D;
+
+/**
+ * This class contains corrections of {@link DefaultLayoutConstants}.
+ * 
+ * @author hoelzl
+ * @author diewald
+ */
+public class CoordinateCorrections {
+	/** The insets of the {@link RectangularContentVisualBase}s. */
+	public static final Dimension2D RECTANGLE_INSETS =
+			new Dimension2D(DEFAULT_CONNECTOR_SIZE / 2, DEFAULT_CONNECTOR_SIZE / 2);
+	/** The default size of {@link ContentAnchorageVisualBase}s. */
+	public static final Dimension2D ANCHOR_DIMENSION =
+			new Dimension2D(DEFAULT_CONNECTOR_SIZE, DEFAULT_CONNECTOR_SIZE);
+	/** The insets of the {@link ContentAnchorageVisualBase}s. */
+	public static final double ANCHOR_INSET = DEFAULT_CONNECTOR_SIZE / 4.5;
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageContentVisualBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageContentVisualBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..2aa292444671bf644e37bc923b877c92de0235b1
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageContentVisualBase.java
@@ -0,0 +1,152 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import static javafx.scene.paint.Color.BLACK;
+import static javafx.scene.paint.Color.rgb;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_ALLOWED_TAG;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_DENIED_TAG;
+import static org.fortiss.tooling.base.ui.editor.fx.visual.CoordinateCorrections.ANCHOR_DIMENSION;
+import static org.fortiss.tooling.base.ui.editor.fx.visual.CoordinateCorrections.ANCHOR_INSET;
+import static org.fortiss.tooling.base.ui.utils.LWFXEditorUtils.convertEOrientationToSide;
+import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.getConnectorOffsetOrientation;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout.ILayout;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout.IOffsetLayout;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout.ISideLayout;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.elliptic.CircularContentAnchorageVisualBase;
+import org.fortiss.tooling.base.model.layout.EOrientation;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.OffsetOrientation;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Point2D;
+import javafx.geometry.Rectangle2D;
+import javafx.geometry.Side;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.Paint;
+
+/**
+ * {@link CircularContentAnchorageVisualBase} providing a default visual for ports attached to boxes
+ * in standard boxes-and-wires diagrams based on {@link ILayoutedModelElement}s.
+ * 
+ * @author munaro
+ */
+public abstract class LayoutedCircularAnchorageContentVisualBase<T extends ILayoutedModelElement>
+		extends CircularContentAnchorageVisualBase implements ISideLayout, IOffsetLayout {
+
+	/** Constructor. */
+	public LayoutedCircularAnchorageContentVisualBase(IContentAnchorageMVCBundle mvcb,
+			Class<T> modelType) {
+		super(mvcb);
+
+		// TODO(#3877): Move type checks to a common base class.
+		Object model = mvcb.getModel();
+		if(model == null) {
+			throw new IllegalArgumentException("The given model is null!");
+		}
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+	}
+
+	/** Returns the model element in the correct type. */
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
+	@Override
+	public <S extends ILayout> S getLayout(Class<S> type) {
+		return (S)this;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Rectangle2D getModelBounds() {
+		Point2D locOnParent = getLocationOnParent();
+		Dimension2D dim = getDimensions();
+		return new Rectangle2D(locOnParent.getX(), locOnParent.getY(), dim.getWidth(),
+				dim.getHeight());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Dimension2D getDimensions() {
+		return ANCHOR_DIMENSION;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getInset() {
+		return ANCHOR_INSET;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public double getOffset() {
+		OffsetOrientation offsetOrientation = getConnectorOffsetOrientation(getModelElement());
+		double inset = getDimensions().getWidth() / 2;
+		return offsetOrientation.getOffset() - inset;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Side getSide() {
+		// TODO (#3868): Remove null check.
+		OffsetOrientation offsetOrientation = getConnectorOffsetOrientation(getModelElement());
+		EOrientation orientation = EOrientation.NORTH;
+		if(offsetOrientation != null) {
+			orientation = offsetOrientation.getOrientation();
+		}
+		return convertEOrientationToSide(orientation);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Paint getBorderColor() {
+		return BLACK;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getOpacity() {
+		return 1.0;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getBorderWidth() {
+		return 1.0;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Color getInteractionColor() {
+		IContentAnchorageMVCBundle mvcBundle = getMVCBundle();
+		if(mvcBundle.hasTag(LINK_TARGET_DENIED_TAG)) {
+			return rgb(255, 0, 0, .25);
+		}
+		if(mvcBundle.hasTag(LINK_TARGET_ALLOWED_TAG)) {
+			return rgb(0, 255, 0, .25);
+		}
+		return super.getInteractionColor();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageDiagramVisualBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageDiagramVisualBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..f06e3b908020408e3cd268a3c63edcd75ef74f8b
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedCircularAnchorageDiagramVisualBase.java
@@ -0,0 +1,117 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import static javafx.scene.paint.Color.BLACK;
+import static javafx.scene.paint.Color.rgb;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_ALLOWED_TAG;
+import static org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerDefaultTags.LINK_TARGET_DENIED_TAG;
+import static org.fortiss.tooling.base.ui.editor.fx.visual.CoordinateCorrections.ANCHOR_DIMENSION;
+import static org.fortiss.tooling.base.ui.editor.fx.visual.CoordinateCorrections.ANCHOR_INSET;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.getNodePosition;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.elliptic.CircularDiagramAnchorageVisualBase;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.Point;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Rectangle2D;
+import javafx.scene.paint.Color;
+import javafx.scene.paint.Paint;
+
+/**
+ * {@link CircularDiagramAnchorageVisualBase} providing a default visual for diagram ports in
+ * standard boxes-and-wires diagrams based on {@link ILayoutedModelElement}s.
+ * 
+ * @author munaro
+ */
+public abstract class LayoutedCircularAnchorageDiagramVisualBase<T extends ILayoutedModelElement>
+		extends CircularDiagramAnchorageVisualBase {
+
+	/** Constructor. */
+	public LayoutedCircularAnchorageDiagramVisualBase(IDiagramAnchorageMVCBundle mvcb,
+			Class<T> modelType) {
+		super(mvcb);
+
+		// TODO(#3877): Move type checks to a common base class.
+		Object model = mvcb.getModel();
+		if(model == null) {
+			throw new IllegalArgumentException("The given model is null!");
+		}
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+	}
+
+	/** Returns the wrapped model as the expected type. */
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Rectangle2D getModelBounds() {
+		Point p = getNodePosition(getModelElement());
+		Dimension2D dim = getDimensions();
+		return new Rectangle2D(p.getX(), p.getY(), dim.getWidth(), dim.getHeight());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Dimension2D getDimensions() {
+		return ANCHOR_DIMENSION;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getInset() {
+		return ANCHOR_INSET;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Paint getBorderColor() {
+		return BLACK;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getOpacity() {
+		return 1.0;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getBorderWidth() {
+		return 1.0;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Color getInteractionColor() {
+		IDiagramAnchorageMVCBundle mvcBundle = getMVCBundle();
+		if(mvcBundle.hasTag(LINK_TARGET_DENIED_TAG)) {
+			return rgb(255, 0, 0, .25);
+		}
+		if(mvcBundle.hasTag(LINK_TARGET_ALLOWED_TAG)) {
+			return rgb(0, 255, 0, .25);
+		}
+		return super.getInteractionColor();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedLineLinkVisual.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedLineLinkVisual.java
new file mode 100644
index 0000000000000000000000000000000000000000..feea85e0bd288590fbe06c152a8a8b138ea85ca2
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedLineLinkVisual.java
@@ -0,0 +1,123 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import static java.util.Collections.emptyList;
+import static org.fortiss.tooling.base.ui.utils.LWFXEditorUtils.computeLinkToCircleLocation;
+import static org.fortiss.tooling.base.ui.utils.LayoutDataUIUtils.getConnectionPoints;
+
+import java.util.List;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.rectangular.LineLinkVisualBase;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.Point;
+import org.fortiss.tooling.base.model.layout.Points;
+
+import javafx.geometry.Rectangle2D;
+
+/**
+ * {@link LineLinkVisualBase} providing a default visual for wires in standard
+ * boxes-and-wires diagrams based on {@link ILayoutedModelElement}s.
+ * 
+ * @author munaro
+ */
+// TODO (TM): As this class already requires the generic type to implement INamedElement
+// NamedLayoutedLineLinkVisual becomes useless. Remove INamedElement here and make class
+// abstract (consistent with the other Layouted*VisualBase classes)
+public abstract class LayoutedLineLinkVisual<T extends ILayoutedModelElement>
+		extends LineLinkVisualBase {
+
+	/** Constructor. */
+	public LayoutedLineLinkVisual(ILinkMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+
+		// TODO(#3877): Move type checks to a common base class.
+		Object model = mvcb.getModel();
+		if(model == null) {
+			throw new IllegalArgumentException("The given model is null!");
+		}
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+	}
+
+	/** Returns the model element with the expected type. */
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public DiagramCoordinate getBendPointLocation(int bpIndex) {
+		Point point = getBendPointList().get(bpIndex);
+		return new DiagramCoordinate(point.getX(), point.getY());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected DiagramCoordinate getStartAnchorLocation(Rectangle2D anchorBounds,
+			DiagramCoordinate target) {
+		return computeLinkToCircleLocation(anchorBounds, target);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected DiagramCoordinate getEndAnchorLocation(Rectangle2D anchorBounds,
+			DiagramCoordinate target) {
+		return computeLinkToCircleLocation(anchorBounds, target);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Object getBendPointModel(int i) {
+		return getBendPointList().get(i);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected int getNumberOfBendPoints() {
+		return getBendPointList().size();
+	}
+
+	/** Returns the list of bend-points. */
+	private List<Point> getBendPointList() {
+		Points connectionPoints = getConnectionPoints(getModelElement());
+		if(connectionPoints == null) {
+			return emptyList();
+		}
+		List<Point> pointList = connectionPoints.getPoints();
+		if(pointList == null) {
+			return emptyList();
+		}
+		return pointList;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean showArrowOnLastSegment() {
+		return true;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getInvisibleSelectionLineWidth() {
+		return 3;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedRectangularContentVisualBase.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedRectangularContentVisualBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..c2a3937b99284713e0bbcd3ce458874567b25ac5
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/LayoutedRectangularContentVisualBase.java
@@ -0,0 +1,117 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import static java.lang.Math.min;
+import static org.fortiss.tooling.base.ui.editor.fx.visual.CoordinateCorrections.RECTANGLE_INSETS;
+import static org.fortiss.tooling.base.utils.LayoutDataUtils.getNodeBounds;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout.IOffsetLayout;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout.ISideLayout;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.rectangular.RectangularBorderLocation;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.rectangular.RectangularContentVisualBase;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.base.model.layout.Rectangle;
+
+import javafx.geometry.Dimension2D;
+import javafx.geometry.Rectangle2D;
+import javafx.geometry.Side;
+
+/**
+ * {@link RectangularContentVisualBase} providing a default visual for boxes in standard
+ * boxes-and-wires diagrams based on {@link ILayoutedModelElement}s.
+ * 
+ * @author munaro
+ */
+public abstract class LayoutedRectangularContentVisualBase<T extends ILayoutedModelElement>
+		extends RectangularContentVisualBase {
+
+	/** Constructor. */
+	public LayoutedRectangularContentVisualBase(IContentMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb);
+
+		// TODO(#3877): Move type checks to a common base class.
+		Object model = mvcb.getModel();
+		if(model == null) {
+			throw new IllegalArgumentException("The given model is null!");
+		}
+		if(!modelType.isAssignableFrom(model.getClass())) {
+			throw new IllegalArgumentException("Expected model of type " +
+					modelType.getSimpleName() + ", but was " + model.getClass().getSimpleName());
+		}
+	}
+
+	/** Returns the model element with the specified type. */
+	// TODO(#3877): Move type checks to a common base class.
+	@SuppressWarnings("unchecked")
+	protected T getModelElement() {
+		// Safe wild cast due to type check in constructor
+		return (T)getModel();
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Rectangle2D getModelBounds() {
+		Rectangle rectangle = getNodeBounds(getModelElement());
+		double insetRadius = RECTANGLE_INSETS.getWidth();
+		double insetDiameter = insetRadius * 2;
+		return new Rectangle2D(rectangle.getX() + insetRadius, rectangle.getY() + insetRadius,
+				rectangle.getWidth() - insetDiameter, rectangle.getHeight() - insetDiameter);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public DiagramCoordinate getAnchorageLocation(IContentAnchorageVisual visual) {
+		Rectangle2D contentRectangle = getCurrentBounds();
+		Side rectangleSide = visual.getLayout(ISideLayout.class).getSide();
+		double sideOffset = visual.getLayout(IOffsetLayout.class).getOffset();
+		Dimension2D anchorageDimensions = visual.getDimensions();
+		DiagramCoordinate location = new RectangularBorderLocation(rectangleSide, sideOffset,
+				contentRectangle, anchorageDimensions).getLocation();
+		double x = min(location.getX(),
+				contentRectangle.getWidth() - anchorageDimensions.getWidth() / 2);
+		double y = min(location.getY(),
+				contentRectangle.getHeight() - anchorageDimensions.getHeight() / 2);
+		return new DiagramCoordinate(x, y);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getBorderWidth() {
+		return 1;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected double getOpacity() {
+		return 1.0;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean requireSelectionForMoveGesture() {
+		return false;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected boolean requireSelectionForResizeGesture() {
+		return false;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageContentVisual.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageContentVisual.java
new file mode 100644
index 0000000000000000000000000000000000000000..c680002469ce897679fa5a3f4af51d1b19cb53d6
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageContentVisual.java
@@ -0,0 +1,43 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisual;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
+
+/**
+ * {@link IVisual} for layouted and named {@link IConnector}s of some content element within a
+ * diagram (sticky connectors).
+ * 
+ * @author diewald
+ */
+public class NamedLayoutedCircularAnchorageContentVisual<T extends ILayoutedModelElement & INamedElement>
+		extends LayoutedCircularAnchorageContentVisualBase<T> {
+
+	/** Constructor. */
+	public NamedLayoutedCircularAnchorageContentVisual(IContentAnchorageMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb, modelType);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getHoverText() {
+		return getModelElement().getName();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageDiagramVisual.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageDiagramVisual.java
new file mode 100644
index 0000000000000000000000000000000000000000..714a176a0569a2049efb4009f710ca66bf3a57fb
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedCircularAnchorageDiagramVisual.java
@@ -0,0 +1,42 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisual;
+import org.fortiss.tooling.base.model.element.IConnector;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
+
+/**
+ * {@link IVisual} for layouted and named {@link IConnector}s within a diagram (free connectors).
+ * 
+ * @author diewald
+ */
+public class NamedLayoutedCircularAnchorageDiagramVisual<T extends ILayoutedModelElement & INamedElement>
+		extends LayoutedCircularAnchorageDiagramVisualBase<T> {
+
+	/** Constructor. */
+	public NamedLayoutedCircularAnchorageDiagramVisual(IDiagramAnchorageMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb, modelType);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getHoverText() {
+		return getModelElement().getName();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedLineLinkVisual.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedLineLinkVisual.java
new file mode 100644
index 0000000000000000000000000000000000000000..e66e5b2aaa40fe8b22a292e175bb8f3af4539b9d
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedLineLinkVisual.java
@@ -0,0 +1,47 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisual;
+import org.fortiss.tooling.base.model.element.IConnection;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
+
+/**
+ * {@link IVisual} for layouted and named links within a diagram. Typically, those are
+ * {@link IConnection}s.
+ * 
+ * @author diewald
+ */
+// TODO (TM): See comment in LayoutedLineLinkVisual
+public class NamedLayoutedLineLinkVisual<T extends INamedElement & ILayoutedModelElement>
+		extends LayoutedLineLinkVisual<T> {
+
+	/** Constructor. */
+	public NamedLayoutedLineLinkVisual(ILinkMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb, modelType);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getLabelText(int currentSegment, int lastSegment) {
+		if(currentSegment == 0) {
+			return getModelElement().getName();
+		}
+		return null;
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedRectangularContentVisual.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedRectangularContentVisual.java
new file mode 100644
index 0000000000000000000000000000000000000000..122e193ac587857d1dad23b42583a0bcf465f0d0
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/editor/fx/visual/NamedLayoutedRectangularContentVisual.java
@@ -0,0 +1,40 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.editor.fx.visual;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.fortiss.tooling.base.model.layout.ILayoutedModelElement;
+import org.fortiss.tooling.kernel.model.INamedElement;
+
+/**
+ * {@link LayoutedRectangularContentVisualBase} that defines its name.
+ * 
+ * @author diewald
+ */
+public class NamedLayoutedRectangularContentVisual<T extends INamedElement & ILayoutedModelElement>
+		extends LayoutedRectangularContentVisualBase<T> {
+
+	/** Constructor. */
+	public NamedLayoutedRectangularContentVisual(IContentMVCBundle mvcb, Class<T> modelType) {
+		super(mvcb, modelType);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected String getName() {
+		return getModelElement().getName();
+	}
+}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings
index ab3f586d361cb743224e07bc27672ca45bdef584..27fbc6fb9f974296b2e91d4738b5ba7289852c08 100644
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/.ratings
@@ -5,6 +5,7 @@ DragAndDropBaseUtils.java d375377f9124f6113b2a295e6b0e09ac8966e564 GREEN
 EllipseLayoutUIUtils.java 4dd9dbd96a45e8c455c019caa19e4a50f18336af GREEN
 FontUtils.java a167a05bdaa8da9853705cc5134f30f6d81bc9f2 GREEN
 GCStateManager.java 983973a92376b5c757c1253b32e33d0666ccdf7b GREEN
+LWFXEditorUtils.java c628e79fa43c1be8a7b87ee90db6e7264904eafc GREEN
 LayoutDataUIUtils.java c85886ac313a6efb122532218eb134047ffd6631 GREEN
 PropertiesViewUtils.java d345b4501c4092228edf1c98e0189317d53aaf22 GREEN
 RectangleLayoutUIUtils.java ef4b872bb5b4a51174e9a29d9ef05e7cb3bff3a1 GREEN
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ConstraintsBaseUIUtils.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ConstraintsBaseUIUtils.java
deleted file mode 100644
index 713512da44cc0ebd9bcd5c11abee87c86c94088d..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/ConstraintsBaseUIUtils.java
+++ /dev/null
@@ -1,273 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.ui.utils;
-
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.getActiveConstraintsTransitively;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.removeFromConstraintInstanceContainer;
-
-import java.util.ArrayList;
-import java.util.List;
-import java.util.function.Function;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.fortiss.tooling.base.model.base.ConstraintBasedProcess;
-import org.fortiss.tooling.base.model.element.ConstraintConfiguration;
-import org.fortiss.tooling.base.model.element.IConstraintBasedProcess;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.service.IPersistencyService;
-import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.utils.EcoreUtils;
-
-/**
- * Utility methods related to constraints.
- * 
- * @author aravantinos
- */
-public class ConstraintsBaseUIUtils {
-
-	/** Factorized behaviour. */
-	public static void doActivateAll(IConstraintInstanceContainer cstrContainer,
-			IConstraintBasedProcess cbdProcess) {
-		// First activate the constraints which should always be activated
-		for(Class<? extends IConstraint> cstrClass : IConstraintUIService.getInstance()
-				.getAlwaysActivatedConstraints()) {
-			IConstraintUIService.getInstance().activate(cstrClass, cstrContainer);
-		}
-		// Then activate the constraints of the current objective
-		ConstraintConfiguration currentObj = cbdProcess.getCurrentObjective();
-		if(currentObj != null) {
-			List<Class<? extends IConstraint>> activeCstrs =
-					getActiveConstraintsTransitively(currentObj, null);
-			for(Class<? extends IConstraint> cstrClass : activeCstrs) {
-				IConstraintUIService.getInstance().activate(cstrClass, cstrContainer);
-			}
-		}
-	}
-
-	/**
-	 * Activates all constraints which are active in the given configuration, potentially adding new
-	 * constraint instances to the provided container.
-	 */
-	public static void activateConfiguration(ConstraintConfiguration config,
-			IConstraintInstanceContainer cstrContainer) {
-		for(Class<? extends IConstraint> cstr : getActiveConstraintsTransitively(config, null)) {
-			IConstraintUIService.getInstance().activate(cstr, cstrContainer);
-		}
-	}
-
-	/**
-	 * Activates all constraints which are active in the given configuration
-	 * (non-transitively).
-	 */
-	public static void activateOneConfiguration(ConstraintConfiguration config,
-			IConstraintInstanceContainer cstrContainer) {
-		List<Class<? extends IConstraint>> configConstraints = new ArrayList<>();
-		for(String name : config.getActiveConstraints()) {
-			configConstraints.add(IConstraintService.getInstance().getConstraintByName(name));
-		}
-		for(Class<? extends IConstraint> cstr : configConstraints) {
-			IConstraintUIService.getInstance().activate(cstr, cstrContainer);
-		}
-	}
-
-	/**
-	 * Deactivates all constraints which are active in the given configuration, if they are not
-	 * still active in the provided context.
-	 */
-	public static void deactivateConfiguration(ConstraintConfiguration config,
-			IConstraintInstanceContainer cstrContainer, ConstraintConfiguration context) {
-		List<Class<? extends IConstraint>> stillActiveConstraints =
-				getActiveConstraintsTransitively(context, config);
-		for(Class<? extends IConstraint> cstr : getActiveConstraintsTransitively(config, null)) {
-			if(!stillActiveConstraints.contains(cstr)) {
-				IConstraintUIService.getInstance().deactivate(cstr, cstrContainer);
-			}
-		}
-	}
-
-	/**
-	 * Deactivates all constraints which are active in the given configuration
-	 */
-	public static void deactivateConfiguration(ConstraintConfiguration config,
-			IConstraintInstanceContainer cstrContainer) {
-		for(Class<? extends IConstraint> cstr : getActiveConstraintsTransitively(config, null)) {
-			IConstraintUIService.getInstance().deactivate(cstr, cstrContainer);
-		}
-	}
-
-	/**
-	 * Deactivates all constraints which are active in the given configuration
-	 * (non-transitively).
-	 */
-	public static void deactivateOneConfiguration(ConstraintConfiguration config,
-			IConstraintInstanceContainer cstrContainer) {
-		List<Class<? extends IConstraint>> configConstraints = new ArrayList<>();
-		for(String name : config.getActiveConstraints()) {
-			configConstraints.add(IConstraintService.getInstance().getConstraintByName(name));
-		}
-		for(Class<? extends IConstraint> cstr : configConstraints) {
-			IConstraintUIService.getInstance().deactivate(cstr, cstrContainer);
-		}
-	}
-
-	/**
-	 * Factorized behavior to install the various listeners necessary for constraints.
-	 * This made in a generic manner so that the client only needs to give a function providing
-	 * access to a {@link ConstraintBasedProcess} given a {@link ITopLevelElement}. The rest is for
-	 * free.
-	 */
-	public static class ConstraintBasedProcessAwareActivator {
-		/**
-		 * Function to access a {@link ConstraintBasedProcess} given a {@link ITopLevelElement}.
-		 * Project-dependent.
-		 */
-		private Function<ITopLevelElement, ConstraintBasedProcess> getConstraintBasedProcess;
-
-		/** Constructor. */
-		public ConstraintBasedProcessAwareActivator(
-				Function<ITopLevelElement, ConstraintBasedProcess> getConstraintBasedProcess) {
-			this.getConstraintBasedProcess = getConstraintBasedProcess;
-		}
-
-		/** Start the kernel. */
-		public void start() {
-			for(ITopLevelElement top : IPersistencyService.getInstance().getTopLevelElements()) {
-				installListener(top);
-				activateAllConstraints(top);
-			}
-			IPersistencyService.getInstance()
-					.addTopLevelElementListener(new ConstraintBasedDevelopmentProcessListener());
-		}
-
-		/** Go through all constraints in <code>top</code> and (re-)activates them. */
-		private void activateAllConstraints(ITopLevelElement top) {
-			ConstraintBasedProcess cbp = getConstraintBasedProcess.apply(top);
-			if(cbp != null) {
-				IConstraintInstanceContainer cic = cbp.getConstraintInstanceContainer();
-				try {
-					doActivateAll(cic, cbp);
-					// The only case where the activation above can trigger a model change is if it
-					// is discovered that constraints shall be added.
-					// This should not happen in most cases: the constraint was normally active when
-					// the project was left and therefore the constraint should already be present.
-					// However there is a case where this is not the case: when AF3 developers added
-					// a new constraint and start then AF3 for the first time; then the constraint
-					// has to be added (sort of migration of the model actually). In such a case the
-					// line above will trigger an exception because not run in a command. That is
-					// the whole reason for the catch block thereafter.
-					// Note that we do not run the activation directly in a command because we do
-					// not want to mark the model as dirty for nothing.
-				} catch(IllegalStateException e) {
-					top.runAsCommand(() -> doActivateAll(cic, cbp));
-				}
-			}
-		}
-
-		/**
-		 * Install the listener triggering activation of constraints for the given top level
-		 * element.
-		 * Returns the installed listener.
-		 */
-		private void installListener(ITopLevelElement top) {
-			ConstraintBasedProcess cbp = getConstraintBasedProcess.apply(top);
-			if(cbp == null) {
-				return;
-			}
-			IConstraintInstanceContainer cic = cbp.getConstraintInstanceContainer();
-			EContentAdapter listener = new EContentAdapter() {
-
-				private boolean isAlreadyAddingMissingConstraints = false;
-
-				/** {@inheritDoc} */
-				@Override
-				public void notifyChanged(Notification notification) {
-					super.notifyChanged(notification);
-					if(isTouch(notification) || isAlreadyAddingMissingConstraints) {
-						return;
-					}
-					// Do not react to change of status.
-					if(notification.getNewValue() instanceof IConstraintInstanceStatus) {
-						return;
-					}
-					if(notification.getEventType() == Notification.REMOVE &&
-							notification.getOldValue() instanceof IConstrained) {
-						IConstrained constrained = (IConstrained)notification.getOldValue();
-						removeFromConstraintInstanceContainer(constrained);
-					}
-					isAlreadyAddingMissingConstraints = true;
-					IConstraintUIService.getInstance().addMissingConstraintInstances(cic);
-					isAlreadyAddingMissingConstraints = false;
-				}
-			};
-			top.getRootModelElement().eAdapters().add(listener);
-		}
-
-		/**
-		 * Listener to (re)activate constraints when the project changes.
-		 * Typically to install adequate constraints when a new element was added to the project.
-		 */
-		private class ConstraintBasedDevelopmentProcessListener
-				implements IPersistencyServiceListener {
-
-			/** {@inheritDoc} */
-			@Override
-			public void topLevelElementLoaded(ITopLevelElement element) {
-				// ignore
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public void topLevelElementAdded(ITopLevelElement element) {
-				installListener(element);
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public void topLevelElementContentChanged(ITopLevelElement element) {
-				// Not our concern.
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public void topLevelElementRemoved(ITopLevelElement element) {
-				// Not our concern
-			}
-		}
-
-		/**
-		 * @param notification
-		 * @return true if <code>notification</code> is not relevant and should be skipped
-		 */
-		private static boolean isTouch(Notification notification) {
-			// Notifications which do not notify about a model change.
-			if(notification.isTouch()) {
-				return true;
-			}
-			// Notifications initiated by the the AF3 kernel which are only GUI related.
-			if(notification.getEventType() == EcoreUtils.KERNEL_EMF_EVENT_TYPE_COUNT) {
-				return true;
-			}
-			return false;
-		}
-	}
-}
diff --git a/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/LWFXEditorUtils.java b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/LWFXEditorUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..c628e79fa43c1be8a7b87ee90db6e7264904eafc
--- /dev/null
+++ b/org.fortiss.tooling.base.ui/src/org/fortiss/tooling/base/ui/utils/LWFXEditorUtils.java
@@ -0,0 +1,106 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.base.ui.utils;
+
+import static java.lang.Math.atan2;
+import static java.lang.Math.cos;
+import static java.lang.Math.sin;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramCoordinate;
+import org.fortiss.tooling.base.model.layout.EOrientation;
+
+import javafx.geometry.Point2D;
+import javafx.geometry.Rectangle2D;
+import javafx.geometry.Side;
+
+/**
+ * Utility methods for the JavaFX-based graphical LWFXEF editors.
+ * 
+ * @author hoelzl
+ */
+public final class LWFXEditorUtils {
+	/** Computes the location of the link w.r.t. the given anchor bounds and target position. */
+	public static DiagramCoordinate computeLinkToAnchorLocation(Rectangle2D anchorBounds,
+			DiagramCoordinate target) {
+		double x = 0;
+		if(target.getX() < anchorBounds.getMinX()) {
+			x = -1.0;
+		} else if(target.getX() > anchorBounds.getMaxX()) {
+			x = 1.0;
+		}
+		double y = 0;
+		if(target.getY() < anchorBounds.getMinY()) {
+			y = -1.0;
+		} else if(target.getY() > anchorBounds.getMaxY()) {
+			y = 1.0;
+		}
+		double w2 = anchorBounds.getWidth() / 2;
+		double h2 = anchorBounds.getHeight() / 2;
+		x = anchorBounds.getMinX() + w2 + x * w2;
+		y = anchorBounds.getMinY() + h2 + y * h2;
+		return new DiagramCoordinate(x, y);
+	}
+
+	/** Returns the {@link EOrientation} for the given {@link Side}. */
+	public static EOrientation convertSideToEOrientation(Side s) {
+		switch(s) {
+			case TOP:
+				return EOrientation.NORTH;
+			case BOTTOM:
+				return EOrientation.SOUTH;
+			case LEFT:
+				return EOrientation.WEST;
+			case RIGHT:
+				return EOrientation.EAST;
+		}
+		return null;
+	}
+
+	/** Returns the {@link Side} for the given {@link EOrientation}. */
+	public static Side convertEOrientationToSide(EOrientation eo) {
+		switch(eo) {
+			case NORTH:
+				return Side.TOP;
+			case SOUTH:
+				return Side.BOTTOM;
+			case WEST:
+				return Side.LEFT;
+			case EAST:
+				return Side.RIGHT;
+		}
+		return null;
+	}
+
+	/**
+	 * Returns the point on a circle centered in the current bounds intersecting with a line between
+	 * the center point and the given point.
+	 */
+	public static DiagramCoordinate computeLinkToCircleLocation(Rectangle2D bounds,
+			Point2D target) {
+		double sx = bounds.getMinX() + bounds.getWidth() / 2;
+		double sy = bounds.getMinY() + bounds.getHeight() / 2;
+
+		double a = atan2(target.getY() - sy, target.getX() - sx);
+		double nx = sx + cos(a) * (bounds.getWidth() / 2 - 1);
+		double ny = sy + sin(a) * (bounds.getHeight() / 2 - 1);
+		return new DiagramCoordinate(nx, ny);
+	}
+
+	/** Constructor. */
+	private LWFXEditorUtils() {
+		// prevent instantiation
+	}
+}
diff --git a/org.fortiss.tooling.base/.settings b/org.fortiss.tooling.base/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.base/.settings
+++ b/org.fortiss.tooling.base/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.base/model/.ratings b/org.fortiss.tooling.base/model/.ratings
index 8f58ba1ffdf1ae83053ebe17d4e5b7e85db128e1..a14484332c6f194fa6e1e2dc001bc8a240b3aa5b 100644
--- a/org.fortiss.tooling.base/model/.ratings
+++ b/org.fortiss.tooling.base/model/.ratings
@@ -1 +1 @@
-base.ecore 598ac2f27293be7344b762471a3570f45e63950d GREEN
+base.ecore 6ba521f3458eaf64fc3ee0359e236c9a1201d259 YELLOW
diff --git a/org.fortiss.tooling.base/model/base.ecore b/org.fortiss.tooling.base/model/base.ecore
index 598ac2f27293be7344b762471a3570f45e63950d..6ba521f3458eaf64fc3ee0359e236c9a1201d259 100644
--- a/org.fortiss.tooling.base/model/base.ecore
+++ b/org.fortiss.tooling.base/model/base.ecore
@@ -181,26 +181,6 @@
         <eGenericType eTypeParameter="#//element/IDerivedAnnotation/T"/>
       </eOperations>
     </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="IConstraintBasedProcess" abstract="true"
-        interface="true">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Marker interface for metaclasses to describe constraint-based development processes.&#xD;&#xA;&#xD;&#xA;TODO (refs #3469) Clarify relation to constraint metaclasses in tooling.kernel."/>
-      </eAnnotations>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="currentObjective" eType="#//element/ConstraintConfiguration"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="constraintInstanceContainer"
-          eType="ecore:EClass platform:/resource/org.fortiss.tooling.kernel/model/kernel.ecore#//constraints/IConstraintInstanceContainer"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="configurations" upperBound="-1"
-          eType="#//element/ConstraintConfiguration" containment="true"/>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="ConstraintConfiguration" eSuperTypes="platform:/resource/org.fortiss.tooling.kernel/model/kernel.ecore#//INamedElement">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Hierarchical description of constraint configuration.&#xD;&#xA;&#xD;&#xA;TODO (refs #3469): Clarify relation to constraint metaclasses in tooling.kernel."/>
-      </eAnnotations>
-      <eStructuralFeatures xsi:type="ecore:EAttribute" name="activeConstraints" upperBound="-1"
-          eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-      <eStructuralFeatures xsi:type="ecore:EReference" name="includedConfigurations"
-          upperBound="-1" eType="#//element/ConstraintConfiguration"/>
-    </eClassifiers>
   </eSubpackages>
   <eSubpackages name="layout" nsURI="http://www.fortiss.org/tooling/base/model/layout"
       nsPrefix="org-fortiss-tooling-base-model-layout">
@@ -478,16 +458,6 @@
         <eTypeArguments eTypeParameter="#//base/DerivedAnnotationBase/T"/>
       </eGenericSuperTypes>
     </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="ConstraintInstanceContainer" eSuperTypes="platform:/resource/org.fortiss.tooling.kernel/model/kernel.ecore#//constraints/IConstraintInstanceContainer">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="@deprecated Currently unused. TODO (refs #3469) Caveat: Base class is defined in tooling.kernel."/>
-      </eAnnotations>
-    </eClassifiers>
-    <eClassifiers xsi:type="ecore:EClass" name="ConstraintBasedProcess" eSuperTypes="#//element/IConstraintBasedProcess">
-      <eAnnotations source="http://www.eclipse.org/emf/2002/GenModel">
-        <details key="documentation" value="Base class for {@link IConstraintBasedProcess}es.&#xD;&#xA;&#xD;&#xA;TODO (refs #3469): Clarify relation to constraint metaclasses in tooling.kernel."/>
-      </eAnnotations>
-    </eClassifiers>
   </eSubpackages>
   <eSubpackages name="visualization" nsURI="http://www.fortiss.org/tooling/base/model/visualization"
       nsPrefix="org-fortiss-tooling-base-model-visualization">
diff --git a/org.fortiss.tooling.base/model/base.genmodel b/org.fortiss.tooling.base/model/base.genmodel
index fde899af767217ec4ed05483e87703bb3c21cbce..bad9184d77c98d6e78195c936dc9172436d47b6e 100644
--- a/org.fortiss.tooling.base/model/base.genmodel
+++ b/org.fortiss.tooling.base/model/base.genmodel
@@ -58,18 +58,6 @@
         <genOperations ecoreOperation="base.ecore#//element/IDerivedAnnotation/isUserAnnotatedValuePreferred"/>
         <genOperations ecoreOperation="base.ecore#//element/IDerivedAnnotation/getUserAnnotatedValue"/>
       </genClasses>
-      <genClasses image="false" ecoreClass="base.ecore#//element/IConstraintBasedProcess">
-        <genFeatures notify="false" createChild="false" propertySortChoices="true"
-            ecoreFeature="ecore:EReference base.ecore#//element/IConstraintBasedProcess/currentObjective"/>
-        <genFeatures notify="false" createChild="false" propertySortChoices="true"
-            ecoreFeature="ecore:EReference base.ecore#//element/IConstraintBasedProcess/constraintInstanceContainer"/>
-        <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference base.ecore#//element/IConstraintBasedProcess/configurations"/>
-      </genClasses>
-      <genClasses image="false" ecoreClass="base.ecore#//element/ConstraintConfiguration">
-        <genFeatures createChild="false" ecoreFeature="ecore:EAttribute base.ecore#//element/ConstraintConfiguration/activeConstraints"/>
-        <genFeatures notify="false" createChild="false" propertySortChoices="true"
-            ecoreFeature="ecore:EReference base.ecore#//element/ConstraintConfiguration/includedConfigurations"/>
-      </genClasses>
     </nestedGenPackages>
     <nestedGenPackages prefix="Layout" basePackage="org.fortiss.tooling.base.model"
         disposableProviderFactory="true" ecorePackage="base.ecore#//layout">
@@ -172,8 +160,6 @@
         <genOperations ecoreOperation="base.ecore#//base/DerivedAnnotationBase/getUserAnnotatedValue"
             body="return null;"/>
       </genClasses>
-      <genClasses ecoreClass="base.ecore#//base/ConstraintInstanceContainer"/>
-      <genClasses ecoreClass="base.ecore#//base/ConstraintBasedProcess"/>
     </nestedGenPackages>
     <nestedGenPackages prefix="Visualization" basePackage="org.fortiss.tooling.base.model"
         disposableProviderFactory="true" ecorePackage="base.ecore#//visualization">
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConstraintInstanceContainerCompositor.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConstraintInstanceContainerCompositor.java
deleted file mode 100644
index 9cb23f13c6cddba18ac7f9dcfd1afd9e7bce4d77..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/compose/ConstraintInstanceContainerCompositor.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2011 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.compose;
-
-import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
-import static org.fortiss.tooling.base.utils.ConstraintsBaseUtils.removeFromConstraintInstanceContainer;
-
-import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.kernel.extension.IElementCompositor;
-import org.fortiss.tooling.kernel.extension.data.IElementCompositionContext;
-import org.fortiss.tooling.kernel.extension.data.Prototype;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-
-/**
- * {@link IElementCompositor} implementation for {@link IConstraintInstanceContainer}s.
- * 
- * @author hoelzl
- */
-public class ConstraintInstanceContainerCompositor<CIC extends IConstraintInstanceContainer>
-		implements IElementCompositor<CIC> {
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canCompose(CIC container, EObject contained,
-			IElementCompositionContext context) {
-		return contained instanceof ConstraintInstance;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean compose(CIC container, EObject contained, IElementCompositionContext context) {
-		ConstraintInstance c = (ConstraintInstance)contained;
-		container.getConstraintInstances().add(c);
-		return true;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canComposePrototype(Prototype prototype) {
-		// As of now constraints should never be added by prototype.
-		return false;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canDecompose(EObject contained) {
-		return contained instanceof ConstraintInstance;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean decompose(EObject contained) {
-		removeFromConstraintInstanceContainer((ConstraintInstance)contained);
-		delete(contained);
-		return true;
-	}
-}
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
index 5633daf969db8251bbf77fd7418a1c19bf30868a..9d0d7f8df1b322b3005d555d7552e4aa62d05156 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/.ratings
@@ -1,3 +1,3 @@
-AddMissingAnnotationsMigrationProvider.java a3f2b3cbcd39f85e15bc998650f899f55d9f563e GREEN
-RemoveDuplicatedAnnotationsMigrationProvider.java f1bdb4733d5b9c6003a2b7fee59b89240a0a3b61 GREEN
-RemoveOutdatedAnnotationInstanceMigrationProvider.java 29c29f2bb7515cad1de45a30ffc185001b47a016 GREEN
+AddMissingAnnotationsMigrationProvider.java ebc5b9348b61ffb23493942949ecccf1c1fa2ae1 GREEN
+RemoveDuplicatedAnnotationsMigrationProvider.java 6920909f8f211b9c5b5990644b5abcd8c4abaa3a GREEN
+RemoveOutdatedAnnotationInstanceMigrationProvider.java 245530d6026f9ff29ffc577983d9de03ae5e75e5 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
index a3f2b3cbcd39f85e15bc998650f899f55d9f563e..ebc5b9348b61ffb23493942949ecccf1c1fa2ae1 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/AddMissingAnnotationsMigrationProvider.java
@@ -15,6 +15,7 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.migration;
 
+import static java.util.Collections.emptyMap;
 import static org.fortiss.tooling.base.utils.AnnotationUtils.instantiateAnnotationsRecursive;
 
 import java.util.ArrayList;
@@ -49,9 +50,11 @@ public class AddMissingAnnotationsMigrationProvider implements IMigrationProvide
 
 	/** {@inheritDoc} */
 	@Override
-	public void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures) {
+	public Map<EObject, AnyType> migrate(ITopLevelElement modelElement,
+			Map<EObject, AnyType> unknownFeatures) {
 		EObject rootElement = modelElement.getRootModelElement();
 		instantiateAnnotationsRecursive(rootElement);
 		migratedProjects.add(modelElement);
+		return emptyMap();
 	}
 }
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveDuplicatedAnnotationsMigrationProvider.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveDuplicatedAnnotationsMigrationProvider.java
index f1bdb4733d5b9c6003a2b7fee59b89240a0a3b61..6920909f8f211b9c5b5990644b5abcd8c4abaa3a 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveDuplicatedAnnotationsMigrationProvider.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveDuplicatedAnnotationsMigrationProvider.java
@@ -15,6 +15,7 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.migration;
 
+import static java.util.Collections.emptyMap;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.pickInstanceOf;
 import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
@@ -87,7 +88,8 @@ public class RemoveDuplicatedAnnotationsMigrationProvider implements IMigrationP
 
 	/** {@inheritDoc} */
 	@Override
-	public void migrate(ITopLevelElement topLevelElement, Map<EObject, AnyType> unknownFeatures) {
+	public Map<EObject, AnyType> migrate(ITopLevelElement topLevelElement,
+			Map<EObject, AnyType> unknownFeatures) {
 
 		doInternal(topLevelElement, true);
 
@@ -95,5 +97,6 @@ public class RemoveDuplicatedAnnotationsMigrationProvider implements IMigrationP
 		error(ToolingBaseActivator.getDefault(),
 				"Duplicate annotations have been removed from \"" + uri.lastSegment() +
 						"\". Please report this incident since it indicates an internal problem.");
+		return emptyMap();
 	}
 }
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveOutdatedAnnotationInstanceMigrationProvider.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveOutdatedAnnotationInstanceMigrationProvider.java
index 29c29f2bb7515cad1de45a30ffc185001b47a016..245530d6026f9ff29ffc577983d9de03ae5e75e5 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveOutdatedAnnotationInstanceMigrationProvider.java
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/migration/RemoveOutdatedAnnotationInstanceMigrationProvider.java
@@ -15,6 +15,7 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.base.migration;
 
+import static java.util.Collections.emptyMap;
 import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
 import static org.fortiss.tooling.common.util.LambdaUtils.isAssignableFromAny;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getChildrenWithType;
@@ -67,12 +68,14 @@ public abstract class RemoveOutdatedAnnotationInstanceMigrationProvider<T extend
 
 	/** {@inheritDoc} */
 	@Override
-	public void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures) {
+	public Map<EObject, AnyType> migrate(ITopLevelElement modelElement,
+			Map<EObject, AnyType> unknownFeatures) {
 		EObject rootModelElement = modelElement.getRootModelElement();
 		for(T annotation : getChildrenWithType(rootModelElement, annotationType)) {
 			if(!isAssignableFromAny(modelElementTypes, annotation.getSpecificationOf())) {
 				delete(annotation);
 			}
 		}
+		return emptyMap();
 	}
 }
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
index b628d001a439891e6b134468fc023f1bda0d0f2a..cb56cc2420509be5d99ef48a902127aa8fbb84b5 100644
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
+++ b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/.ratings
@@ -6,6 +6,7 @@ ConstraintsBaseUtils.java bba938b43756ce6f35c338f6cef21c3ab5d49a9d GREEN
 DimensionUtils.java 0dc67f9de11a84e6e4c6e1eb627817dee91ff30a GREEN
 EllipseLayoutUtils.java 5c3a0126fdca5d5b4fb441694747e1cb0f49cd9f GREEN
 LayoutDataUtils.java 5739dd16f0212e8f94927c0a0f51503390f2be69 GREEN
+LayoutModelElementAdapter.java d81dfc551baa832f2761b4804760dcd8f57b7c5b YELLOW
 LayoutModelElementFactory.java c49fca2de5a8cb7502fb28cc2b7e64a272df11b0 GREEN
 MigrationUtils.java ab9d8682233313c21c6a52b8b03e1c796aacd29c GREEN
 OffsetOrientationUtils.java 913cebbac2a5628bdd08b4df669b9412d6e07d94 GREEN
diff --git a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/ConstraintsBaseUtils.java b/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/ConstraintsBaseUtils.java
deleted file mode 100644
index bba938b43756ce6f35c338f6cef21c3ab5d49a9d..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.base/src/org/fortiss/tooling/base/utils/ConstraintsBaseUtils.java
+++ /dev/null
@@ -1,191 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.base.utils;
-
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.getConstraintInstanceContainer;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EList;
-import org.fortiss.tooling.base.model.element.ConstraintConfiguration;
-import org.fortiss.tooling.base.model.element.ElementFactory;
-import org.fortiss.tooling.base.model.element.IConstraintBasedProcess;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.service.IPersistencyService;
-
-/**
- * Utils for constraints.
- * 
- * @author aravantinos
- */
-public class ConstraintsBaseUtils {
-
-	/** Name of the default configuration. */
-	public static final String DEFAULT_CONFIGURATION_NAME = "Default configuration";
-
-	/** Removes constraints on <code>c</code> from <code>container</code>. */
-	public static void removeFromConstraintInstanceContainer(IConstrained c) {
-		EList<ConstraintInstance> toRemove = c.getConstraintInstances();
-		if(toRemove.isEmpty()) {
-			// Then there is nothing to do
-			return;
-		}
-		// get(0) because we just checked that the list is not empty, and because the assumption is
-		// made that the constraint instance container is the same for all the instances in the
-		// list.
-		IConstraintInstanceContainer container = getConstraintInstanceContainer(toRemove.get(0));
-		container.getConstraintInstances().removeAll(toRemove);
-		for(ConstraintInstance constraint : toRemove) {
-			for(IConstrained constrained : constraint.getConstraineds()) {
-				// c needs to be treated separately to avoid concurrent modifications
-				if(constrained != null && !constrained.equals(c)) {
-					constrained.getConstraintInstances().remove(constraint);
-				}
-			}
-		}
-		c.getConstraintInstances().clear();
-	}
-
-	/**
-	 * Removes the constraint instance from its container. Also removes it from its constrained
-	 * elements.
-	 */
-	public static void removeFromConstraintInstanceContainer(ConstraintInstance ci) {
-		IConstraintInstanceContainer container = getConstraintInstanceContainer(ci);
-		if(container != null) {
-			container.getConstraintInstances().remove(ci);
-		}
-		for(IConstrained cstrd : ci.getConstraineds()) {
-			cstrd.getConstraintInstances().remove(ci);
-		}
-	}
-
-	/**
-	 * If <code>config</code> is not already in <code>configList</code>, adds it and its included
-	 * configurations.
-	 * 
-	 * <code>exception</code> allows to avoid considering one particular configuration.
-	 * Leave <code>null</code> if irrelevant.
-	 */
-	public static void addConfigurationTransitively(List<ConstraintConfiguration> configList,
-			ConstraintConfiguration config, ConstraintConfiguration exception) {
-		if(!configList.contains(config) && !config.equals(exception)) {
-			configList.add(config);
-			for(ConstraintConfiguration subConfig : config.getIncludedConfigurations()) {
-				addConfigurationTransitively(configList, subConfig, exception);
-			}
-		}
-	}
-
-	/**
-	 * Returns all the configurations included in <code>config</code> transitively, including
-	 * <code>config</code> itself.
-	 * 
-	 * <code>exception</code> allows to avoid considering one particular configuration.
-	 * Leave <code>null</code> if irrelevant.
-	 */
-	public static List<ConstraintConfiguration> getActiveConfigurationsTransitively(
-			ConstraintConfiguration config, ConstraintConfiguration exception) {
-		List<ConstraintConfiguration> res = new ArrayList<>();
-		addConfigurationTransitively(res, config, exception);
-		return res;
-	}
-
-	/**
-	 * Returns the names of all the constraints active in the given configuration.
-	 * 
-	 * <code>exception</code> allows to avoid considering one particular configuration.
-	 * Leave <code>null</code> if irrelevant.
-	 */
-	public static List<String> getActiveConstraintNamesTransitively(ConstraintConfiguration config,
-			ConstraintConfiguration exception) {
-		List<ConstraintConfiguration> configs =
-				getActiveConfigurationsTransitively(config, exception);
-		List<String> res = new ArrayList<>();
-		for(ConstraintConfiguration subConfig : configs) {
-			res.addAll(subConfig.getActiveConstraints());
-		}
-		return res;
-	}
-
-	/**
-	 * Returns all the constraints active in the given configuration.
-	 * 
-	 * <code>exception</code> allows to avoid considering one particular configuration.
-	 * Leave <code>null</code> if irrelevant.
-	 */
-	public static List<Class<? extends IConstraint>> getActiveConstraintsTransitively(
-			ConstraintConfiguration config, ConstraintConfiguration exception) {
-		List<String> names = getActiveConstraintNamesTransitively(config, exception);
-		List<Class<? extends IConstraint>> res = new ArrayList<>();
-		for(String name : names) {
-			res.add(IConstraintService.getInstance().getConstraintByName(name));
-		}
-		return res;
-	}
-
-	/** True if the given configuration is the default one. */
-	public static boolean isDefaultConfiguration(ConstraintConfiguration c) {
-		return c.getName().equals(DEFAULT_CONFIGURATION_NAME);
-	}
-
-	/** Gets the default configuration of the given constraint-based development process. */
-	public static ConstraintConfiguration getDefaultConfig(IConstraintBasedProcess cbp) {
-		EList<ConstraintConfiguration> configs = cbp.getConfigurations();
-		for(ConstraintConfiguration config : configs) {
-			if(isDefaultConfiguration(config)) {
-				return config;
-			}
-		}
-		return null;
-	}
-
-	/** Adds a default configuration to the given process and returns it for information. */
-	public static ConstraintConfiguration addDefaultConfig(IConstraintBasedProcess cbp) {
-		ConstraintConfiguration newDefaultConfig =
-				ElementFactory.eINSTANCE.createConstraintConfiguration();
-		newDefaultConfig.setName(DEFAULT_CONFIGURATION_NAME);
-		cbp.getConfigurations().add(newDefaultConfig);
-		return newDefaultConfig;
-	}
-
-	/** Gets the default configuration if existing, or creates one otherwise. */
-	public static ConstraintConfiguration retrieveDefaultConfig(IConstraintBasedProcess cbp) {
-		ConstraintConfiguration defaultConfig = getDefaultConfig(cbp);
-		if(defaultConfig != null) {
-			return defaultConfig;
-		}
-		ITopLevelElement top = IPersistencyService.getInstance().getTopLevelElementFor(cbp);
-		top.runAsCommand(() -> addDefaultConfig(cbp));
-		return getDefaultConfig(cbp);
-	}
-
-	/**
-	 * Initializes a {@link IConstraintBasedProcess}. Needs a {@link IConstraintInstanceContainer}.
-	 */
-	public static void initializeConstraintBasedProcess(IConstraintBasedProcess cbp,
-			IConstraintInstanceContainer cic) {
-		ConstraintConfiguration defaultConfig = addDefaultConfig(cbp);
-		cbp.setCurrentObjective(defaultConfig);
-		cbp.setConstraintInstanceContainer(cic);
-	}
-}
diff --git a/org.fortiss.tooling.common.ui/.classpath b/org.fortiss.tooling.common.ui/.classpath
index 0920a6fed0bb5a3313c4f46b95ea1fcb99101429..d9ed18f5cea4deb235213896eef764feded19dee 100644
--- a/org.fortiss.tooling.common.ui/.classpath
+++ b/org.fortiss.tooling.common.ui/.classpath
@@ -3,6 +3,8 @@
 	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="src" path="external-src"/>
 	<classpathentry kind="src" path="res"/>
+	<classpathentry exported="true" kind="lib" path="lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar"/>
+	<classpathentry exported="true" kind="lib" path="lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar"/>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-11">
 		<attributes>
 			<attribute name="module" value="true"/>
diff --git a/org.fortiss.tooling.common.ui/.settings b/org.fortiss.tooling.common.ui/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.common.ui/.settings
+++ b/org.fortiss.tooling.common.ui/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
index 29bd35bf32e273d596805c9678143695f75c6fbf..f158eb873beefe27aacb70e4e70c12c3efcf333b 100644
--- a/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.common.ui/META-INF/MANIFEST.MF
@@ -17,14 +17,16 @@ Require-Bundle: org.fortiss.tooling.common;visibility:=reexport,
  org.eclipse.ui.views.properties.tabbed;visibility:=reexport,
  org.eclipse.ui.ide;visibility:=reexport,
  org.eclipse.jface.text;visibility:=reexport,
- org.openjfx.controls;bundle-version="13.0.1";visibility:=reexport,
- org.openjfx.base;bundle-version="13.0.1";visibility:=reexport,
- org.openjfx.fxml;bundle-version="13.0.1";visibility:=reexport,
+ org.openjfx.controls;bundle-version="11.0.2";visibility:=reexport,
+ org.openjfx.base;bundle-version="11.0.2";visibility:=reexport,
+ org.openjfx.fxml;bundle-version="11.0.2";visibility:=reexport,
  org.eclipse.fx.ui.workbench3;bundle-version="3.5.0";visibility:=reexport
 Bundle-ClassPath: .,
  lib/org.conqat.ide.commons.gef.jar,
  lib/org.conqat.ide.commons.ui.jar,
- lib/swt-grouplayout.jar
+ lib/swt-grouplayout.jar,
+ lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar,
+ lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar
 Export-Package: aerofx,
  aquafx,
  jfxtras,
@@ -72,6 +74,25 @@ Export-Package: aerofx,
  org.eclipse.gmf.runtime.draw2d.ui.figures,
  org.eclipse.gmf.runtime.draw2d.ui.geometry,
  org.eclipse.jface.viewers,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.control.treetableview,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.change,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.base,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.elliptic,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.rectangular,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.layout,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.impl,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.base,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.elliptic,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.rectangular,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.widgets,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.mesh,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.style,
+ org.eclipse.systemfocus.kernel.common.ui.javafx.util,
  org.eclipse.ui.actions,
  org.eclipse.wb.swt,
  org.eclipse.wb.swt.layout.grouplayout,
@@ -79,6 +100,7 @@ Export-Package: aerofx,
  org.fortiss.tooling.common.ui,
  org.fortiss.tooling.common.ui.javafx,
  org.fortiss.tooling.common.ui.javafx.control.treetableview,
+ org.fortiss.tooling.common.ui.javafx.layout,
  org.fortiss.tooling.common.ui.javafx.util
 Bundle-Vendor: fortiss GmbH
 Bundle-Activator: org.fortiss.tooling.common.ui.ToolingCommonUIActivator
diff --git a/org.fortiss.tooling.common.ui/build.properties b/org.fortiss.tooling.common.ui/build.properties
index ab1e37fb1bbf7fdb879ccf70079b428aacb1e8ff..047e606ce9d79664f75aab85d5fb16ee0ae09b08 100644
--- a/org.fortiss.tooling.common.ui/build.properties
+++ b/org.fortiss.tooling.common.ui/build.properties
@@ -5,7 +5,9 @@ bin.includes = .,\
                lib/org.conqat.ide.commons.gef.jar,\
                lib/org.conqat.ide.commons.ui.jar,\
                lib/swt-grouplayout.jar,\
-               res/
+               res/,\
+               lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar,\
+               lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar
 jars.compile.order = .
 source.. = src/,\
            res/,\
diff --git a/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar b/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar
new file mode 100644
index 0000000000000000000000000000000000000000..395895b74e4f88edcd5118c917fd2ab6b413e057
Binary files /dev/null and b/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common.ui_0.0.5.20191219.jar differ
diff --git a/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar b/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar
new file mode 100644
index 0000000000000000000000000000000000000000..b27db9f8c0e0c56fd798ea2b54927bc768b5ce64
Binary files /dev/null and b/org.fortiss.tooling.common.ui/lib/org.eclipse.systemfocus.kernel.common_0.0.5.20191219.jar differ
diff --git a/org.fortiss.tooling.common.ui/res/jfxtras/JMetroLightTheme.css b/org.fortiss.tooling.common.ui/res/jfxtras/JMetroLightTheme.css
index 28781b32ee33615ca674b44a70037362a2e218c9..430a4aea38df1b53eda7d6fe9eb881908092d621 100644
--- a/org.fortiss.tooling.common.ui/res/jfxtras/JMetroLightTheme.css
+++ b/org.fortiss.tooling.common.ui/res/jfxtras/JMetroLightTheme.css
@@ -595,10 +595,6 @@
  * TextBox (and PasswordBox)                                                   *
  *                                                                             *
  ******************************************************************************/
-.text-field{
-    -fx-skin: "jfxtras.styles.jmetro8.MetroTextFieldSkin";
-}
-
 .text-input{
     -fx-background-radius: 0, 0;
 
@@ -666,11 +662,6 @@
  * PasswordBox                                                                 *
  *                                                                             *
  ******************************************************************************/
-
-.password-field {
-    -fx-skin: "jfxtras.styles.jmetro8.MetroPasswordFieldSkin";
-}
-
 .password-field > .right-button > .right-button-graphic {
     -fx-shape            : "M307.688,399.564c0,1.484-1.203,2.688-2.688,2.688c-1.484,0-2.688-1.203-2.688-2.688s1.203-2.688,2.688-2.688C306.484,396.876,307.688,398.08,307.688,399.564z M297.5,399h2.5c0,0,1.063-4,5-4c3.688,0,5,4,5,4h2.5c0,0-2.063-6.5-7.5-6.5C299,392.5,297.5,399,297.5,399z";
     -fx-scale-shape: false;
@@ -699,11 +690,6 @@
  * Slider                                                                      *
  *                                                                             *
  ******************************************************************************/
-
-.slider {
-    -fx-skin: "jfxtras.styles.jmetro8.FilledSliderSkin";
-}
-
 .slider .thumb {
     -fx-background-color: black;
     -fx-background-insets: 0;
@@ -785,7 +771,6 @@
  ******************************************************************************/
 
 .ListSpinner {
-    -fx-skin: "jfxtras.labs.internal.scene.control.skin.ListSpinnerCaspianSkin";
     -fx-background-color: #f0f0f0;
     -fx-background-insets: 0 0 0 0;
     -fx-background-radius: 0;
@@ -843,10 +828,6 @@
     -fx-background-radius: 0;
 }
 
-.spinner > .text-field{
-    -fx-skin: "com.sun.javafx.scene.control.skin.TextFieldSkin";
-}
-
 .spinner > .text-field {
     -fx-background-color: #f0f0f0;
     -fx-background-insets: 0;
@@ -903,10 +884,6 @@
     -fx-scale-shape: true;
 }
 
-.date-picker .text-field{
-    -fx-skin: "com.sun.javafx.scene.control.skin.TextFieldSkin";
-}
-
 .date-picker .text-input{
     -fx-background-radius: 0, 0;
 
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/.ratings
index 28344a4e46cafbef22ebacf8e5502f613563230f..925a4859f625d2879fb2a81017f7e7649f75f97d 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/.ratings
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/.ratings
@@ -1 +1 @@
-AF3FXViewPart.java 865b996b5eb092bb30c161d026163a0f8fc66c41 GREEN
+AF3FXViewPart.java 3e4510f9e9f86ecf5ba29432342acd50e030aaaa GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/AF3FXViewPart.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/AF3FXViewPart.java
index 865b996b5eb092bb30c161d026163a0f8fc66c41..3e4510f9e9f86ecf5ba29432342acd50e030aaaa 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/AF3FXViewPart.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/AF3FXViewPart.java
@@ -15,76 +15,48 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.common.ui.javafx;
 
-import java.io.IOException;
-import java.lang.reflect.InvocationTargetException;
+import static javafx.scene.layout.AnchorPane.setBottomAnchor;
+import static javafx.scene.layout.AnchorPane.setLeftAnchor;
+import static javafx.scene.layout.AnchorPane.setRightAnchor;
+import static javafx.scene.layout.AnchorPane.setTopAnchor;
+
 import java.net.URL;
-import java.util.ResourceBundle;
 
 import org.apache.commons.lang3.SystemUtils;
 import org.eclipse.fx.ui.workbench3.FXViewPart;
-import org.eclipse.ui.part.ViewPart;
+import org.fortiss.tooling.common.ui.javafx.layout.ICompositeFXController;
 
 import javafx.application.Platform;
-import javafx.fxml.FXMLLoader;
-import javafx.fxml.Initializable;
 import javafx.scene.Node;
 import javafx.scene.Scene;
 import javafx.scene.layout.AnchorPane;
 import javafx.scene.layout.Pane;
 
 /**
- * Base class to create eclipse (SWT-based) views using JavaFX GUI elements. This class requires
- * FXML file that defines the GUI elements of the view.
+ * Base class to create eclipse (SWT-based) views using JavaFX GUI elements.
  * 
- * @author diewald
+ * @author munaro
  */
-public abstract class AF3FXViewPart extends FXViewPart implements Initializable {
+public abstract class AF3FXViewPart extends FXViewPart {
+
 	/** For later use, if we need to define different styles. */
 	private String cssLocation;
 
 	/** Flag that indicates if a custom style sheet has been applied. */
 	private boolean isCustomStyleSheetApplied;
 
-	/**
-	 * Holds the relative location of the FXML JavaXML files. Roots are the source folders of the
-	 * (plugin) project.
-	 */
-	private final String fXMLLocation;
-
-	/** References the stub that defines the FXML file defining the layout and controller. */
-	private Class<? extends AF3FXViewPart> viewerClass;
-
 	/** References the root {@link Pane} to which GUI elements must be added to be displayed. */
 	private Pane root;
 
-	/**
-	 * Constructor that is intended for {@link ViewPart}s which host a single view/node/control.
-	 * 
-	 * @param viewerClass
-	 *            Class implementing the {@link AF3FXViewPart} to load resources from its containing
-	 *            bundle.
-	 * @param cssLocation
-	 *            style sheet file path for the appearance settings relative to the source
-	 *            (resource) folders. Pass {@code null} if the OS-native look shall be used.
-	 * @throws Exception
-	 *             if the given FXML file path is not given or if it cannot be found in any of the
-	 *             source (resource) folders.
-	 */
-	public AF3FXViewPart(Class<? extends AF3FXViewPart> viewerClass, String cssLocation)
-			throws Exception {
-		// Initializing the base constructor with "null" for the FXML file indicates a
-		// single-view/node/control usecase.
-		this(viewerClass, null, cssLocation);
-	}
+	/** Specifies the view part's layout and logic. */
+	private ICompositeFXController<? extends Node, ? extends Node> controller;
 
 	/**
 	 * Constructor. Allows to pass the view's FXML definition file.
 	 * 
-	 * @param viewerClass
-	 *            Class implementing the {@link AF3FXViewPart} to load resources from its containing
-	 *            bundle.
-	 * @param fXMLLocation
-	 *            location of the fXML file relative to the source (resource) folders.
+	 * @param controller
+	 *            {@link ICompositeFXController} specifying the layout of the view part as well as
+	 *            its logic.
 	 * @param cssLocation
 	 *            style sheet file path for the appearance settings relative to the source
 	 *            (resource) folders. Pass {@code null} if the OS-native look shall be used.
@@ -92,51 +64,31 @@ public abstract class AF3FXViewPart extends FXViewPart implements Initializable
 	 *             if the given FXML file path is not given or if it cannot be found in any of the
 	 *             source (resource) folders.
 	 */
-	public AF3FXViewPart(Class<? extends AF3FXViewPart> viewerClass, String fXMLLocation,
+	public AF3FXViewPart(ICompositeFXController<? extends Node, ? extends Node> controller,
 			String cssLocation) throws Exception {
 		Platform.setImplicitExit(false);
-		this.viewerClass = viewerClass;
-		this.fXMLLocation = fXMLLocation;
 		this.cssLocation = cssLocation;
+		this.controller = controller;
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	protected Scene createFxScene() {
-		FXMLLoader loader = new FXMLLoader();
-		loader.setClassLoader(viewerClass.getClassLoader());
-		loader.setController(this);
-		if(fXMLLocation != null) {
-			loader.setLocation(viewerClass.getResource(fXMLLocation));
-			try {
-				root = (Pane)loader.load();
-			} catch(IOException e) {
-				throw new RuntimeException("Cannot load the resource located at " + fXMLLocation,
-						e);
-			}
-		} else {
-			root = new AnchorPane();
-			try {
-				viewerClass.getMethod("initialize", URL.class, ResourceBundle.class).invoke(this,
-						null, null);
-			} catch(IllegalAccessException | IllegalArgumentException | InvocationTargetException |
-					SecurityException e) {
-				throw new RuntimeException("The initialize method of the View " +
-						viewerClass.getSimpleName() + " threw an exception!", e);
-			} catch(NoSuchMethodException e) {
-				throw new RuntimeException("For single Controller views, an initialize method is " +
-						"required that creates the control! This cannot be done in constructors " +
-						"since the JavaFX toolkit is not initialized in that stage.", e);
-			}
-		}
+		controller.loadLayout();
+		Node layout = controller.getLayout();
 
+		setTopAnchor(layout, 0.0);
+		setRightAnchor(layout, 0.0);
+		setBottomAnchor(layout, 0.0);
+		setLeftAnchor(layout, 0.0);
+
+		root = new AnchorPane(layout);
 		if(cssLocation != null) {
 			isCustomStyleSheetApplied = applyStyleSheet(root, getClass(), cssLocation);
 		}
 		if(!isCustomStyleSheetApplied) {
 			setNativeLook(root);
 		}
-
 		Scene scene = new Scene(root);
 		return scene;
 	}
@@ -147,36 +99,6 @@ public abstract class AF3FXViewPart extends FXViewPart implements Initializable
 		// Not needed.
 	}
 
-	/**
-	 * Adds a single {@link Node} to this view. It embeds the given {@link Node} to the
-	 * {@link AnchorPane} of this view and stretches it to the borders of the view.
-	 * <p>
-	 * NOTE: This method may only be used for single-control views, not FXML-based ones.
-	 * 
-	 * @param fxNode
-	 *            {@link Node} to be added to the view.
-	 */
-	protected void setChildNodeFinal(Node fxNode) {
-		if(fXMLLocation != null) {
-			throw new RuntimeException("This method is intended for single-control views. It may" +
-					" not be used for FXML-based views.");
-		}
-		if(!root.getChildren().isEmpty()) {
-			throw new RuntimeException("The method setChildNodeFinal was invoked more than once." +
-					" This method is intended for single-control views. If more controls" +
-					"shall be added, please define an FXML layout file and call the appropriate" +
-					" constructors.");
-		}
-
-		root.getChildren().add(fxNode);
-		// Stretch the node to the borders of the view. In the createScene method, we a create a
-		// root pane that is an AnchorPane, so we can safely use these calls here.
-		AnchorPane.setTopAnchor(fxNode, 0.0);
-		AnchorPane.setRightAnchor(fxNode, 0.0);
-		AnchorPane.setBottomAnchor(fxNode, 0.0);
-		AnchorPane.setLeftAnchor(fxNode, 0.0);
-	}
-
 	/**
 	 * Sets the native look of the target platform to not break the UI experience. Most of the UI
 	 * code is based on SWT which uses a platform native look. Currently, Windows 8&10, Windows 7,
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
index 9c69b3c86ff15fcdca4d7e7bf226ddd7dd1d7ee3..1d719596aadb4771c489581b90bd5a6dcde4f410 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/.ratings
@@ -1,7 +1,7 @@
 DynamicTreeContentProviderBase.java dff437afeaf7486af05460fa54eca4fa61d7eae6 GREEN
 DynamicTreeItem.java afc105cf5acf3d2506d89e0892555100c234ce5b GREEN
 DynamicTreeTableUIProviderBase.java fd9fce19a65eb1006ceacb0d869bbe90a8c578b3 GREEN
-DynamicTreeTableViewer.java e474f3a890fd6525db7de8e299d7fbe67f932a15 GREEN
+DynamicTreeTableViewer.java 4f278387dd90542adc07bf0da12e92d4eaad79c4 GREEN
 DynamicTreeUIProviderBase.java 56fe4df4577b35f1e5e6e4c4be189b706c852d52 GREEN
 DynamicTreeViewer.java da5e24ae57777a482d8e12c8262513d8143bfa93 GREEN
 DynamicTreeViewerBase.java 47124c847de322a0ae26eb7a114f85ce4bd02d7e GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
index e474f3a890fd6525db7de8e299d7fbe67f932a15..4f278387dd90542adc07bf0da12e92d4eaad79c4 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/control/treetableview/DynamicTreeTableViewer.java
@@ -15,13 +15,17 @@
  *******************************************************************************/
 package org.fortiss.tooling.common.ui.javafx.control.treetableview;
 
-import javafx.beans.property.ReadOnlyStringWrapper;
+import static javafx.scene.control.cell.TextFieldTreeTableCell.forTreeTableColumn;
+
+import javafx.beans.property.SimpleObjectProperty;
 import javafx.scene.Node;
 import javafx.scene.control.ContextMenu;
+import javafx.scene.control.SelectionMode;
 import javafx.scene.control.TreeItem;
 import javafx.scene.control.TreeTableCell;
 import javafx.scene.control.TreeTableColumn;
 import javafx.scene.control.TreeTableView;
+import javafx.util.Callback;
 
 /**
  * A JavaFX {@link TreeTableView} based on an {@link DynamicTreeContentProviderBase} and
@@ -51,6 +55,8 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 		DynamicTreeItem<T> rootItem = new DynamicTreeItem<T>(root, this);
 		view.setRoot(rootItem);
 		view.setShowRoot(showRoot);
+		view.setEditable(true);
+		view.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
 		rootItem.update();
 		// expand to reveal (+1 if root node is not shown
 		expandItem(rootItem, showRoot ? revealLevel : revealLevel + 1);
@@ -82,35 +88,53 @@ public final class DynamicTreeTableViewer<T> extends DynamicTreeViewerBase<T> {
 		}
 	}
 
-	/** Adds a column to the table part of the view. */
-	public void addColumn(String headerLabel, int prefWidth) {
-		final int num = view.getColumns().size();
-		TreeTableColumn<T, String> col = new TreeTableColumn<>(headerLabel);
-		col.setPrefWidth(prefWidth);
-		col.setCellValueFactory(param -> {
+	/**
+	 * Adds a column to the table part of the view. The labels, context menus and icons are shown as
+	 * defined in the {@link DynamicTreeTableUIProviderBase}.
+	 */
+	public TreeTableColumn<T, String> addColumn(String headerLabel, int prefWidth,
+			boolean readOnly) {
+		int num = view.getColumns().size();
+		TreeTableColumn<T, String> column = new TreeTableColumn<>(headerLabel);
+
+		column.setPrefWidth(prefWidth);
+		column.setCellValueFactory(param -> {
 			Object data = param.getValue().getValue();
-			return new ReadOnlyStringWrapper(uiProvider.getLabel(data, num));
+			return new SimpleObjectProperty<String>(uiProvider.getLabel(data, num));
 		});
-		col.setCellFactory(param -> {
-			TreeTableCell<T, String> cell = new TreeTableCell<T, String>() {
-				@Override
-				protected void updateItem(String item, boolean empty) {
-					super.updateItem(item, empty);
-					ContextMenu menu = null;
-					Node icon = null;
-					if(!empty && item != null) {
-						T data = this.getTreeTableRow().getItem();
-						menu = uiProvider.createContextMenu(data, num);
-						icon = uiProvider.getIconNode(data, num);
+
+		Callback<TreeTableColumn<T, String>, TreeTableCell<T, String>> cellFactory;
+		if(readOnly) {
+			// Read only cell with the icon and context menu as specified in the UI provider
+			cellFactory = param -> {
+				TreeTableCell<T, String> cell = new TreeTableCell<T, String>() {
+					@Override
+					protected void updateItem(String item, boolean empty) {
+						super.updateItem(item, empty);
+						ContextMenu menu = null;
+						Node icon = null;
+						int index = view.getColumns().size() - 1;
+						if(!empty && item != null) {
+							T data = this.getTreeTableRow().getItem();
+							menu = uiProvider.createContextMenu(data, index);
+							icon = uiProvider.getIconNode(data, index);
+						}
+						this.setContextMenu(menu);
+						this.setGraphic(icon);
 					}
-					this.setContextMenu(menu);
-					this.setGraphic(icon);
-				}
+				};
+				cell.textProperty().bind(cell.itemProperty());
+				return cell;
 			};
-			cell.textProperty().bind(cell.itemProperty());
-			return cell;
-		});
-		view.getColumns().add(col);
+		} else {
+			// Editable text field
+			cellFactory = forTreeTableColumn();
+		}
+		column.setCellFactory(cellFactory);
+
+		view.getColumns().add(column);
+
+		return column;
 	}
 
 	/** Returns the underlying {@link TreeTableView}. */
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..6bb4c9a8d2b6f140dab0dbd505999fc3aded887f
--- /dev/null
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/.ratings
@@ -0,0 +1,2 @@
+CompositeFXControllerBase.java 3c411746e6d3733d66194506effcc276ad9b5613 GREEN
+ICompositeFXController.java 8476557dedab914c87c2931a09aad8e628463f30 GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/CompositeFXControllerBase.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/CompositeFXControllerBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..3c411746e6d3733d66194506effcc276ad9b5613
--- /dev/null
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/CompositeFXControllerBase.java
@@ -0,0 +1,104 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.common.ui.javafx.layout;
+
+import static java.util.Arrays.asList;
+import static javafx.scene.layout.AnchorPane.setBottomAnchor;
+import static javafx.scene.layout.AnchorPane.setLeftAnchor;
+import static javafx.scene.layout.AnchorPane.setRightAnchor;
+import static javafx.scene.layout.AnchorPane.setTopAnchor;
+import static org.fortiss.tooling.common.ui.javafx.util.JavaFXUtils.loadFXML;
+
+import java.io.IOException;
+import java.net.URL;
+import java.util.List;
+
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+import javafx.scene.layout.AnchorPane;
+
+/**
+ * JavaFX node which can be hierarchically composed. It can be included within another
+ * {@link CompositeFXControllerBase} and might contain other {@link CompositeFXControllerBase}s.
+ * 
+ * @param <T>
+ *            Type of the controlled element itself.
+ * @param <S>
+ *            Type of the layout elements which can be contained.
+ * 
+ * @author munaro
+ */
+public abstract class CompositeFXControllerBase<T extends Node, S extends Node>
+		implements ICompositeFXController<T, S> {
+
+	/**
+	 * JavaFX {@link Node} with the layout specified in the {@link FXML} resource and
+	 * associated with a controller of type {@code T}.
+	 */
+	private T layout;
+
+	/**
+	 * {@link ICompositeFXController}s to be added to the {@link Node} by the
+	 * {@code addContainments} method.
+	 */
+	private ICompositeFXController<? extends S, ?>[] containments;
+
+	/** Constructor. */
+	@SuppressWarnings("unchecked")
+	public CompositeFXControllerBase(ICompositeFXController<? extends S, ?>... containments) {
+		this.containments = containments;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public T getLayout() {
+		return layout;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<ICompositeFXController<? extends S, ?>> getContainments() {
+		return asList(containments);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void loadLayout() {
+		getContainments().forEach(containment -> containment.loadLayout());
+		if(layout == null) {
+			URL fxmlResource = getClass().getResource(getFXMLLocation());
+			try {
+				layout = loadFXML(fxmlResource, this);
+			} catch(IOException e) {
+				throw new RuntimeException(
+						"Cannot load the resource located at " + getFXMLLocation(), e);
+			}
+		}
+	}
+
+	/**
+	 * If the container is an {@link AnchorPane}, all margins are removed so as to fit the child to
+	 * the anchor pane's size.
+	 */
+	protected void fitToParent(Node child) {
+		if(child.getParent() instanceof AnchorPane) {
+			setBottomAnchor(child, 0.0);
+			setTopAnchor(child, 0.0);
+			setLeftAnchor(child, 0.0);
+			setRightAnchor(child, 0.0);
+		}
+	}
+}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/ICompositeFXController.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/ICompositeFXController.java
new file mode 100644
index 0000000000000000000000000000000000000000..8476557dedab914c87c2931a09aad8e628463f30
--- /dev/null
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/layout/ICompositeFXController.java
@@ -0,0 +1,49 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.common.ui.javafx.layout;
+
+import java.util.List;
+
+import javafx.fxml.FXML;
+import javafx.scene.Node;
+
+/**
+ * Generic interface for JavaFX controllers which can be hierarchically composed.
+ * 
+ * @param <T>
+ *            Type of the controlled element itself.
+ * @param <S>
+ *            Type of the layout elements which can be contained.
+ * 
+ * @author munaro
+ */
+public interface ICompositeFXController<T extends Node, S extends Node> {
+
+	/** Loads the the JavaFX layout from the specified {@link FXML} resource. */
+	public void loadLayout();
+
+	/** Returns a {@link Node} with the layout. */
+	public T getLayout();
+
+	/** Returns the location of the {@link FXML} resource with the layout. */
+	public String getFXMLLocation();
+
+	/** Initializes the {@link ICompositeFXController}. */
+	public void initialize();
+
+	/** Returns the {@link ICompositeFXController} containments. */
+	public List<ICompositeFXController<? extends S, ?>> getContainments();
+}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/.ratings b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/.ratings
index cd9b77b00f1d5a5ab51c9a5d37aef27a53e00ed2..1922ed59e6f776adeb20031a9a89f3ef591ddfc5 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/.ratings
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/.ratings
@@ -1 +1,2 @@
-SceneGraphUtils.java f54304c2eb604934de9afdf9d2a8ca88a762398a GREEN
+GraphicUtils.java 4d471a310a52bda1c090f956dcdbe90775b12cb8 GREEN
+JavaFXUtils.java db3cf28289109ffec64c8f96c7b2de779a977b3b GREEN
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/GraphicUtils.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/GraphicUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..4d471a310a52bda1c090f956dcdbe90775b12cb8
--- /dev/null
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/GraphicUtils.java
@@ -0,0 +1,67 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.common.ui.javafx.util;
+
+import java.io.InputStream;
+import java.net.URL;
+import java.util.HashMap;
+
+import javafx.scene.image.Image;
+import javafx.scene.paint.Color;
+
+/**
+ * Utility methods for handling graphics in JavaFX-based views.
+ * 
+ * @author munaro
+ */
+public class GraphicUtils {
+
+	/** The image cache of loaded images. */
+	private static final HashMap<String, Image> imageCache = new HashMap<>();
+
+	/** Returns the plugin-local URI string for the given resource. */
+	public static String getURIString(String pluginId, String localPath) {
+		return "platform:/plugin/" + pluginId + localPath;
+	}
+
+	/** Returns the Java FX Image load from the local path. */
+	public static Image getFXImage(String pluginId, String localPath) {
+		String uri = getURIString(pluginId, localPath);
+		if(uri == null) {
+			return null;
+		}
+		Image cacheImage = imageCache.get(uri);
+		if(cacheImage == null) {
+			InputStream in = null;
+			try {
+				in = new URL(uri).openStream();
+			} catch(Exception e) {
+				e.printStackTrace();
+			}
+			if(in != null) {
+				cacheImage = new Image(in);
+			}
+			imageCache.put(uri, cacheImage);
+		}
+		return cacheImage;
+	}
+
+	/** Converts the given SWT color to Java FX color. */
+	public static Color convertColor(org.eclipse.swt.graphics.Color swtColor) {
+		return Color.rgb(swtColor.getRed(), swtColor.getGreen(), swtColor.getBlue(),
+				swtColor.getAlpha() / 255.0);
+	}
+}
diff --git a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/SceneGraphUtils.java b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/JavaFXUtils.java
similarity index 85%
rename from org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/SceneGraphUtils.java
rename to org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/JavaFXUtils.java
index f54304c2eb604934de9afdf9d2a8ca88a762398a..db3cf28289109ffec64c8f96c7b2de779a977b3b 100644
--- a/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/SceneGraphUtils.java
+++ b/org.fortiss.tooling.common.ui/src/org/fortiss/tooling/common/ui/javafx/util/JavaFXUtils.java
@@ -15,10 +15,14 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.common.ui.javafx.util;
 
+import java.io.IOException;
+import java.net.URL;
 import java.util.LinkedList;
 import java.util.Queue;
 import java.util.function.Predicate;
 
+import javafx.fxml.FXML;
+import javafx.fxml.FXMLLoader;
 import javafx.scene.Node;
 import javafx.scene.Parent;
 import javafx.scene.Scene;
@@ -28,14 +32,35 @@ import javafx.scene.Scene;
  * 
  * @author hoelzl
  * @author diewald
+ * @author munaro
  */
-public final class SceneGraphUtils {
+public final class JavaFXUtils {
 
 	/** Prevent instantiation. */
-	private SceneGraphUtils() {
+	private JavaFXUtils() {
 		// Nothing to do
 	}
 
+	/**
+	 * Loads a JavaFX layout from an {@link FXML} resource and associates it with the given
+	 * controller.
+	 * 
+	 * @param fxmlResource
+	 *            {@link URL} of the {@link FXML} resource to load.
+	 * @param controller
+	 *            Controller to be added to associated with the returned scene.
+	 * @return The loaded object hierarchy. See {@link FXMLLoader} for more information.
+	 * @throws IOException
+	 */
+	public static <T> T loadFXML(URL fxmlResource, Object controller) throws IOException {
+		FXMLLoader fxmlLoader = new FXMLLoader();
+		fxmlLoader.setClassLoader(controller.getClass().getClassLoader());
+		fxmlLoader.setController(controller);
+		fxmlLoader.setLocation(fxmlResource);
+
+		return fxmlLoader.load();
+	}
+
 	/**
 	 * Searches the scene graph hierarchy for the nearest parent node of the given class.
 	 *
diff --git a/org.fortiss.tooling.common/.settings b/org.fortiss.tooling.common/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.common/.settings
+++ b/org.fortiss.tooling.common/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.graphicsGL.ui/.settings b/org.fortiss.tooling.graphicsGL.ui/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.graphicsGL.ui/.settings
+++ b/org.fortiss.tooling.graphicsGL.ui/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.graphicsGL/.settings b/org.fortiss.tooling.graphicsGL/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.graphicsGL/.settings
+++ b/org.fortiss.tooling.graphicsGL/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.kernel.ui/.settings b/org.fortiss.tooling.kernel.ui/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.kernel.ui/.settings
+++ b/org.fortiss.tooling.kernel.ui/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
index 881846afa276a61c6c3c08ca4e481866234ae095..ca6401da3143db4f507bbbef21b47a85dddd61e1 100644
--- a/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
+++ b/org.fortiss.tooling.kernel.ui/META-INF/MANIFEST.MF
@@ -4,11 +4,12 @@ Bundle-Name: Tooling Kernel UI
 Bundle-SymbolicName: org.fortiss.tooling.kernel.ui;singleton:=true
 Bundle-Version: 2.16.0.qualifier
 Bundle-Activator: org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator
-Require-Bundle: org.fortiss.tooling.common.ui;bundle-version="2.16.0";visibility:=reexport,
- org.fortiss.tooling.kernel;bundle-version="2.16.0";visibility:=reexport,
+Require-Bundle: org.fortiss.tooling.common.ui;visibility:=reexport,
+ org.fortiss.tooling.kernel;visibility:=reexport,
  org.eclipse.core.resources;visibility:=reexport,
  org.eclipse.emf.databinding;visibility:=reexport,
- org.eclipse.core.databinding.property;visibility:=reexport
+ org.eclipse.core.databinding.property;visibility:=reexport,
+ com.google.guava;visibility:=reexport
 Bundle-ActivationPolicy: lazy
 Bundle-RequiredExecutionEnvironment: JavaSE-11
 Bundle-Vendor: fortiss GmbH
diff --git a/org.fortiss.tooling.kernel.ui/plugin.xml b/org.fortiss.tooling.kernel.ui/plugin.xml
index 8f76e8c6d6cd0bad21b7a515806f273ba7cd679a..f84dd2cdad77ebdb72f81b1b3276d21dfba748ce 100644
--- a/org.fortiss.tooling.kernel.ui/plugin.xml
+++ b/org.fortiss.tooling.kernel.ui/plugin.xml
@@ -116,30 +116,11 @@
          </propertySection>
       </propertySections>
    </extension>
-   <extension
-         point="org.eclipse.ui.decorators">
-      <decorator
-            class="org.fortiss.tooling.kernel.ui.internal.ConstraintLabelDecorator"
-            id="org.fortiss.tooling.kernel.ui.internal.ConstraintLabelDecorator"
-            label="Constraint Decorator"
-            lightweight="true"
-            location="BOTTOM_LEFT"
-            state="true">
-         <enablement>
-            <objectClass
-                  name="org.eclipse.emf.ecore.EObject">
-            </objectClass>
-         </enablement>
-      </decorator>
-   </extension>
    <extension
          point="org.fortiss.tooling.kernel.ui.contextMenuContribution">
       <contextMenuContribution
             contributor="org.fortiss.tooling.kernel.ui.internal.views.NavigatorNewMenu">
       </contextMenuContribution>
-      <contextMenuContribution
-            contributor="org.fortiss.tooling.kernel.ui.internal.views.ConstraintMenu">
-      </contextMenuContribution>
    </extension>
    <extension
          point="org.eclipse.ui.perspectives">
@@ -150,15 +131,6 @@
             name="Storage">
       </perspective>
    </extension>
-   <extension
-         point="org.fortiss.tooling.kernel.ui.modelElementHandler">
-      <modelElementHandler
-            handler="org.fortiss.tooling.kernel.ui.extension.base.ConstraintUIBases$ConstraintHandler">
-         <modelElementClass
-               modelElementClass="org.fortiss.tooling.kernel.model.constraints.ConstraintInstance">
-         </modelElementClass>
-      </modelElementHandler>
-   </extension>
    <extension point="org.fortiss.tooling.kernel.uiMessageHandler">
       <uiMessageHandler
             handler="org.fortiss.tooling.kernel.ui.extension.base.DialogMessageHandler">
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
index e4afd03ed7a246008939ddd4dfced2250a797efa..e3dae57d37ce91f7898d85eb9774c665040a8e9f 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/.ratings
@@ -1,10 +1,9 @@
 IAllocationEditPartFactory.java 7d30a6b77cc04191fcd516260ff10d4128f7f3ad GREEN
-IConstraintUI.java e2cfa44697a95333601a8df131a169aaee85e9b5 GREEN
 IContextMenuContributor.java 0f09c76662c154cf52ddab61b417e82a42854162 GREEN
 IContextMenuMultiSelectionContributor.java 125b31dd38009bc2095b7e6bc860e946e39f58c4 GREEN
 IEditPartFactory.java 5729715847f553d95a5bad4a9211c7e6f458badd GREEN
 IModelEditor.java 962d7f7758abc88bbc6064c8b4eb32da00abf8e8 GREEN
-IModelEditorBinding.java a3d5c344f61fa6f12ab944a4e933a557d6e7011b GREEN
+IModelEditorBinding.java d6896569cfe7eb0d7f0b8e4a71573c50e8c75329 GREEN
 IModelElementHandler.java 21b4a96251e0267f156b4b8f2b95a97f6e81e646 GREEN
 ITutorialStepUI.java b8aee2b95857484ab6ad9ecd55b5de9f0ea158e5 GREEN
 ITutorialUIProvider.java aa0ff5db4d7ba0953e34edeb99f3e8279567e18f GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IConstraintUI.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IConstraintUI.java
deleted file mode 100644
index e2cfa44697a95333601a8df131a169aaee85e9b5..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IConstraintUI.java
+++ /dev/null
@@ -1,91 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2015 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.extension;
-
-import java.util.List;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService.IFix;
-
-/**
- * Interface for the GUI of constraints.
- * 
- * @author aravantinos
- */
-public interface IConstraintUI {
-
-	/**
-	 * Action to take when trying to open the given constraint instance. <code>canOpen</code> should
-	 * be called before in order to know if the status can be opened.
-	 * 
-	 * @return true if the constraint instance could indeed be open, false if it needs further
-	 *         handling.
-	 */
-	public boolean openStatus(ConstraintInstance ci, IConstraintInstanceStatus s);
-
-	/** True if the constraint instance can be open. */
-	boolean canOpen(ConstraintInstance ci, IConstraintInstanceStatus s);
-
-	/** Method to execute when a constraint instance gets outdated. */
-	public void onOutdate(ConstraintInstance ci);
-
-	/**
-	 * Returns a short user-friendly description for the current status of the constraint instance.
-	 */
-	public String getMessage(ConstraintInstance ci, IConstraintInstanceStatus s);
-
-	/**
-	 * Returns a list of possible automatic fixes for the given constraint instance. A constraint
-	 * instance should be candidate to fixing if its status is anything but successful or outdated.
-	 */
-	List<IFix> fixes(ConstraintInstance ci, IConstraintInstanceStatus s);
-
-	/**
-	 * Set to <code>true</code> if you want that a failure of your constraint be displayed as a
-	 * warning rather than as an error.
-	 */
-	public boolean displayAsWarning();
-
-	/** Gets a general description for the constraint type. */
-	String getDescription();
-
-	/**
-	 * Same as <code>getDescription</code> but allows to make use of additional instance-specific
-	 * information.
-	 */
-	public String getDescription(ConstraintInstance ci);
-
-	/** Returns the image descriptor to be used as icon image. */
-	public ImageDescriptor getIconImageDescriptor();
-
-	/**
-	 * Way for the constraint to indicate that the verification is often time consuming.
-	 * This triggers a few goodies:
-	 * - wait 1s before triggering the constraint autocheck (if relevant)
-	 * - display a warning popup in case of first trigger of the verification
-	 * TODO(2703) make instead an event "onActivate" in order to allow customization. For instance
-	 * one could check if Z3 is present or not.
-	 */
-	public boolean isTimeConsuming();
-
-	/**
-	 * True if this constraint shall be always activated (and therefore the user shall not be
-	 * offered the possibility to control whether the constraint is active or not).
-	 */
-	public boolean shouldBeManuallyActivated();
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
index a3d5c344f61fa6f12ab944a4e933a557d6e7011b..d6896569cfe7eb0d7f0b8e4a71573c50e8c75329 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/IModelEditorBinding.java
@@ -16,6 +16,9 @@
 package org.fortiss.tooling.kernel.ui.extension;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
 import org.eclipse.ui.IEditorPart;
 import org.fortiss.tooling.kernel.service.base.IEObjectAware;
 import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
@@ -24,12 +27,16 @@ import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
  * Interface for editor bindings. An editor binding a defines a model element
  * editor. Usually, an editor (in the Eclipse interpretation) is a view (in the
  * model-based development interpretation) on the underlying model.
- * 
- * <P>
+ * <p>
+ * This interface also specifies bindings to those MVC factories that are responsible for the
+ * interaction of the editor with the model, its presentation, and behavior.
+ * <p>
  * Each editor provided by some binding becomes part of an Eclipse multi-page editor. Its page
  * carries the name delivered by {@link #getLabel}. The {@link IModelEditorBindingService} sorts the
  * provided editors according to their priority returned by {@link #getPriority} with higher values
  * having lower priority.
+ * <b>NOTE:</b>: The priority reported by {@link #getPriority()} is also used to define the order in
+ * which the factories are traversed.
  * 
  * @see IModelEditorBindingService
  * 
@@ -40,6 +47,15 @@ public interface IModelEditorBinding<T extends EObject> extends IEObjectAware<EO
 	/** Returns the class of the editor registered by this binding. */
 	Class<? extends IEditorPart> getEditorClass(T object);
 
+	/** Returns the {@link IModelFactory} to instantiate for the {@link IEditorPart}. */
+	Class<? extends IModelFactory> getModelFactory();
+
+	/** Returns the {@link IVisualFactory} to instantiate for the {@link IEditorPart}. */
+	Class<? extends IVisualFactory> getVisualFactory();
+
+	/** Returns the {@link IControllerFactory} to instantiate for the {@link IEditorPart}. */
+	Class<? extends IControllerFactory> getControllerFactory();
+
 	/** Returns the label of the editor. */
 	String getLabel(T object);
 
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
index 0dc4ea3d0c7cc3b78179d5bf38f965a7c79702a3..3776fb18b863e417da1104e086324e0e0cd6c1fc 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/.ratings
@@ -1,12 +1,13 @@
-ConstraintUIBases.java 3676a600e0866091db9798763c6eee97eec5b55b GREEN
 ContextMenuSubMenuContributorBase.java 6275d96fe8690d9d4744bcbaef3c7d14ba8e30ff GREEN
 DialogMessageHandler.java 8714da09a777c8557de0a5c48ff68c340f9fa91d GREEN
 EObjectActionBase.java 4ef9f8be59e64d4838acc9e268d418ba5d94fa1a GREEN
 EReferenceListPropertySectionBase.java 7390dd7bfdc979e8ff0c5c30c67ab7b6c9d70c92 GREEN
 EReferencePropertySectionBase.java 0548da6778516003257f59d0b4c2b60d458be3b6 GREEN
 EditorBase.java 9c09fff92945256bb8680992ae7bb2c78f47b150 GREEN
+FXEditorBase.java 2e520be0bbae7d0aebdff70218a124dbe0896ce2 GREEN
 IListPropertySection.java 8bb00fe7959583e794ff9437b7a77404c9a9e70f GREEN
-ModelEditorBindingBase.java 4c5ac569c0b6e7678fc8191096b26dfd09fdcb98 GREEN
+LWFXEFEditorBase.java 2bd06235f20c18dc2e7d433700b2ad74a16664e2 GREEN
+ModelEditorBindingBase.java c258cb0ea28d74440856cd2abf367408fbbc1279 GREEN
 ModelElementHandlerBase.java 384727748f125c9d43f19d9c0eba4ba1be5a7a26 GREEN
 MultiEObjectActionBase.java 9e237d8ea640c4194e4877af4a9cfce88698e543 GREEN
 NamedCommentedModelElementHandlerBase.java 681b98b50b362f01abb7a36f108f4f11b9e51829 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ConstraintUIBases.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ConstraintUIBases.java
deleted file mode 100644
index 3676a600e0866091db9798763c6eee97eec5b55b..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ConstraintUIBases.java
+++ /dev/null
@@ -1,286 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2015 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.extension.base;
-
-import static org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils.triggerMarkersRefresh;
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.createOutdatedStatus;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.IStatus;
-import org.eclipse.core.runtime.Status;
-import org.eclipse.core.runtime.jobs.Job;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.events.SelectionAdapter;
-import org.eclipse.swt.events.SelectionEvent;
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-import org.eclipse.swt.widgets.Button;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Group;
-import org.eclipse.swt.widgets.Shell;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.ErrorConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.FailedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.ui.extension.IConstraintUI;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService.IFix;
-import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
-
-/**
- * Base classes for constraint verification GUI.
- * 
- * @author aravantinos
- */
-public class ConstraintUIBases {
-
-	/** Base class for constraint verification GUI. */
-	public static abstract class ConstraintUIBase implements IConstraintUI {
-		/** {@inheritDoc} */
-		@Override
-		public boolean canOpen(ConstraintInstance ci, IConstraintInstanceStatus status) {
-			return status instanceof OutdatedConstraintInstanceStatus;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public String getDescription(ConstraintInstance ci) {
-			return this.getDescription();
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public List<IFix> fixes(ConstraintInstance ci, IConstraintInstanceStatus status) {
-			// No fix by default, it is however strongly recommended to override in order to improve
-			// user experience.
-			return new ArrayList<IFix>();
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean openStatus(ConstraintInstance ci, IConstraintInstanceStatus status) {
-			if(!canOpen(ci, status)) {
-				return false;
-			}
-			if(status instanceof OutdatedConstraintInstanceStatus) {
-				IConstraintService.getInstance().verify(ci);
-				IConstraintInstanceStatus currentStatus =
-						IConstraintUIService.getInstance().getStatus(ci);
-				if(currentStatus instanceof ErrorConstraintInstanceStatus && canOpen(ci, status)) {
-					openStatus(ci, currentStatus);
-				}
-				return true;
-			}
-			if(status instanceof FailedConstraintInstanceStatus ||
-					status instanceof ErrorConstraintInstanceStatus) {
-				List<IFix> fixes = IConstraintUIService.getInstance().fixes(ci);
-				Shell shell = Display.getCurrent().getActiveShell();
-				int result = new FixDialog(shell, status, getMessage(ci, status), fixes).open();
-				if(fixes.size() == 1 && result == 0) {
-					// get(0) because the size is equal to 1 by the previous test
-					fixes.get(0).runFix(status);
-				} else if(result > 1) {
-					// In this case, result = 0 iff the dialog was cancelled, 1 iff the dialog was
-					// OK, or any number greater than 1 to select a given fix, hence the result-2
-					// below.
-					fixes.get(result - 2).runFix(status);
-				}
-				return true;
-			}
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean isTimeConsuming() {
-			return false;
-		}
-
-		/** Dialog presenting the error/failure and the possible fix(es). */
-		private static class FixDialog extends MessageDialog {
-			/** List of possible fixes. */
-			List<IFix> fixes;
-
-			/** Constructor. */
-			public FixDialog(Shell parentShell, IConstraintInstanceStatus s, String msg,
-					List<IFix> fixes) {
-				super(parentShell, getTitle(s), null, msg, getIconType(s), getButtons(fixes), 1);
-				this.fixes = fixes;
-			}
-
-			/**
-			 * Returns the buttons to display: "OK" is always displayed. In addition, if there is
-			 * only one fix, we provide one button for this fix. If there is more than one
-			 * possible fixes, they will displayed instead horizontally (via getCustomArea).
-			 */
-			private static String[] getButtons(List<IFix> fixes) {
-				String[] res = new String[fixes.size() == 1 ? 2 : 1];
-				if(fixes.size() == 1) {
-					// get(0) because the size is equal to 1 by the previous test
-					res[0] = "Fix: " + fixes.get(0).getDescription();
-				}
-				res[res.length - 1] = "OK";
-				return res;
-			}
-
-			/** Returns the icon type corresponding to <code>s</code>. */
-			private static String getTitle(IConstraintInstanceStatus s) {
-				if(s instanceof FailedConstraintInstanceStatus) {
-					return "Verification of constraint failed";
-				}
-				return "Error during constraint verification";
-			}
-
-			/** Returns the icon type corresponding to <code>s</code>. */
-			private static int getIconType(IConstraintInstanceStatus s) {
-				return s instanceof FailedConstraintInstanceStatus ? MessageDialog.WARNING : ERROR;
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			protected Control createCustomArea(Composite parent) {
-				if(fixes.size() <= 1) {
-					return null;
-				}
-				Group buttonGroup = new Group(parent, SWT.NONE);
-				buttonGroup.setLayout(new GridLayout());
-				buttonGroup.setLayoutData(new GridData(SWT.RIGHT, SWT.TOP, true, false));
-				buttonGroup.setText("Possible fixes");
-				for(IFix fix : fixes) {
-					Button button = new Button(buttonGroup, SWT.None);
-					button.setText(fix.getDescription());
-					button.addSelectionListener(new SelectionAdapter() {
-						@Override
-						public void widgetSelected(SelectionEvent event) {
-							buttonPressed(fixes.indexOf(fix) + 1);
-						}
-					});
-				}
-				// Does not matter what we return as long as it's not null
-				return buttonGroup;
-			}
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public String getMessage(ConstraintInstance ci, IConstraintInstanceStatus status) {
-			IConstraintInstanceStatus s = IConstraintUIService.getInstance().getStatus(ci);
-			// Default message. Inheriting classes SHOULD specialize.
-			String name = IModelElementHandlerService.getInstance().getName(s.getConstraint());
-			String pre = s instanceof ErrorConstraintInstanceStatus ? "Error while checking"
-					: "Unsatisfied";
-			return pre + " constraint" + (name == null ? "." : ": \"" + name + "\"");
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void onOutdate(ConstraintInstance ci) {
-			// By default, we just set the status to outdated
-			createOutdatedStatus(ci);
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean shouldBeManuallyActivated() {
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean displayAsWarning() {
-			// By default, constraints failures are displayed as error not as warnings
-			return false;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public ImageDescriptor getIconImageDescriptor() {
-			return null;
-		}
-	}
-
-	/**
-	 * Base class for constraint verifier UIs which automatically trigger a new check when the
-	 * constraint gets outdated.
-	 */
-	public static abstract class ConstraintUIBaseAutocheck extends ConstraintUIBase {
-
-		/** {@inheritDoc} */
-		@Override
-		public void onOutdate(ConstraintInstance ci) {
-			Display display = Display.getDefault();
-			String name = "Verifying " + ConstraintUIBaseAutocheck.this.getDescription();
-			Job latestJob = new Job(name) {
-				/** {@inheritDoc} */
-				@Override
-				protected IStatus run(IProgressMonitor monitor) {
-					try {
-						display.asyncExec(() -> IConstraintService.getInstance().cancel(ci));
-						IConstraintService.getInstance().verify(ci);
-						display.asyncExec(() -> triggerMarkersRefresh(ci));
-						return Status.OK_STATUS;
-					} catch(IllegalArgumentException e) {
-						// This sort of exception might happen, not sure why, but we *in no case*
-						// want to throw an error message to the user in case of some failure
-						// resulting of a constraint check which he did not explicitly triggered
-						return Status.CANCEL_STATUS;
-					}
-				}
-			};
-			// If the constraint is considered time consuming, we wait 1s before starting the job
-			// because user modifications can go faster than the check.
-			latestJob.schedule(isTimeConsuming() ? 1000 : 0);
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public boolean canOpen(ConstraintInstance ci, IConstraintInstanceStatus status) {
-			return false;
-		}
-	}
-
-	/** Handler for constraints. */
-	public static class ConstraintHandler extends ModelElementHandlerBase<ConstraintInstance> {
-
-		/** {@inheritDoc} */
-		@Override
-		public String getName(ConstraintInstance element) {
-			return getDescription(element);
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public ImageDescriptor getIconImageDescriptor() {
-			// This method will actually never be called
-			return null;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public ImageDescriptor getIconImageDescriptor(ConstraintInstance element) {
-			return IConstraintUIService.getInstance().getIconImageDescriptor(element);
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/introspection/items/ConstraintVerificationServiceIntrospectionDetailsItem.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java
similarity index 50%
rename from org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/introspection/items/ConstraintVerificationServiceIntrospectionDetailsItem.java
rename to org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java
index 9499a4b7ffa68d0090bb27e8cd9da13381f298c7..2e520be0bbae7d0aebdff70218a124dbe0896ce2 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/introspection/items/ConstraintVerificationServiceIntrospectionDetailsItem.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/FXEditorBase.java
@@ -1,5 +1,5 @@
 /*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
+| Copyright 2011 fortiss GmbH                                              |
 |                                                                          |
 | Licensed under the Apache License, Version 2.0 (the "License");          |
 | you may not use this file except in compliance with the License.         |
@@ -13,39 +13,30 @@
 | See the License for the specific language governing permissions and      |
 | limitations under the License.                                           |
 +--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.introspection.items;
+package org.fortiss.tooling.kernel.ui.extension.base;
 
-import java.util.Collection;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.swt.SWT;
+import org.eclipse.swt.widgets.Composite;
 
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.service.IConstraintService;
+import javafx.embed.swt.FXCanvas;
+import javafx.scene.Parent;
+import javafx.scene.Scene;
 
 /**
- * {@link IIntrospectionDetailsItem} for the {@link IConstraintService}.
+ * Base implementation of model element editors which are using JavaFX.
  * 
- * @author aravantinos
+ * @author hoelzlf
  */
-public class ConstraintVerificationServiceIntrospectionDetailsItem
-		implements IIntrospectionDetailsItem {
-
-	/** Read-only copy of the services handler list. */
-	protected final Collection<IConstraint> handlerSet;
-
-	/** Constructor. */
-	public ConstraintVerificationServiceIntrospectionDetailsItem(
-			Collection<IConstraint> handlerSet) {
-		this.handlerSet = handlerSet;
+public abstract class FXEditorBase<T extends EObject> extends EditorBase<T> {
+	/** {@inheritDoc} */
+	@Override
+	public final void createPartControl(Composite parent) {
+		FXCanvas canvas = new FXCanvas(parent, SWT.NONE);
+		Scene scene = new Scene(createSceneRoot());
+		canvas.setScene(scene);
 	}
 
-	/** Returns the first registration classes. */
-	public Collection<IConstraint> getHandlerKeyClasses() {
-		return handlerSet;
-	}
-
-	/** Returns the registered constraint of the given name. */
-	public IConstraint getHandler(String name) {
-		return handlerSet.stream().filter(c -> name.equals(c.getClass().getName())).findFirst()
-				.get();
-	}
+	/** Creates the root node of the scene. */
+	protected abstract Parent createSceneRoot();
 }
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/LWFXEFEditorBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/LWFXEFEditorBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..2bd06235f20c18dc2e7d433700b2ad74a16664e2
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/LWFXEFEditorBase.java
@@ -0,0 +1,162 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.ui.extension.base;
+
+import static java.util.stream.Collectors.toList;
+
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.ISelectionChangedListener;
+import org.eclipse.jface.viewers.ISelectionProvider;
+import org.eclipse.jface.viewers.IStructuredSelection;
+import org.eclipse.jface.viewers.SelectionChangedEvent;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewer;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.DiagramViewerSelection;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.change.Change;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
+import org.eclipse.ui.IEditorPart;
+import org.fortiss.tooling.kernel.service.ICommandStackService;
+import org.fortiss.tooling.kernel.ui.extension.IModelEditorBinding;
+import org.fortiss.tooling.kernel.ui.extension.base.factory.DelegatingControllerFactory;
+import org.fortiss.tooling.kernel.ui.extension.base.factory.DelegatingModelFactory;
+import org.fortiss.tooling.kernel.ui.extension.base.factory.DelegatingVisualFactory;
+import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
+
+import javafx.scene.Parent;
+
+/**
+ * Base class for JavaFX-based {@link IEditorPart}s that display diagrams of {@link EObject}s.
+ * 
+ * @author hoelzl
+ * @author diewald
+ */
+public abstract class LWFXEFEditorBase<T extends EObject> extends FXEditorBase<T>
+		implements ISelectionProvider {
+	/** The diagram viewer. */
+	protected DiagramViewer viewer;
+	/** The list of {@link ISelectionChangedListener}s. */
+	private final List<ISelectionChangedListener> selectionListeners = new ArrayList<>();
+
+	/** References the delegating {@link IModelFactory} of this JavaFX {@link IEditorPart}. */
+	private IModelFactory delegatingModelFactory;
+
+	/** References the delegating {@link IModelFactory} of this JavaFX {@link IEditorPart}. */
+	private IVisualFactory delegatingVisualFactory;
+
+	/** References the delegating {@link IModelFactory} of this JavaFX {@link IEditorPart}. */
+	private IControllerFactory delegatingControllerFactory;
+
+	/** {@inheritDoc} */
+	@Override
+	protected final Parent createSceneRoot() {
+		constructMVCFactories();
+
+		viewer = new DiagramViewer(delegatingModelFactory, delegatingVisualFactory,
+				delegatingControllerFactory, cb -> modelSelected(), chg -> applyModelChange(chg));
+		customizeViewer();
+		getSite().setSelectionProvider(this);
+		return viewer.getVisualNode();
+	}
+
+	/**
+	 * Constructs delegating factories that wrap all factories registered by
+	 * {@link IModelEditorBinding}s for the edited type. Delegating factories are used for extending
+	 * editors of the same type.
+	 */
+	protected void constructMVCFactories() {
+		List<IModelEditorBinding<EObject>> bindings =
+				IModelEditorBindingService.getInstance().getBindings(editedObject);
+		bindings.removeIf(b -> (b.getEditorClass(editedObject) != null) &&
+				(!LWFXEFEditorBase.class.isAssignableFrom(b.getEditorClass(editedObject))));
+
+		List<Class<? extends IModelFactory>> modelFactories = bindings.stream()
+				.map(b -> b.getModelFactory()).filter(Objects::nonNull).collect(toList());
+		List<Class<? extends IVisualFactory>> visualFactories = bindings.stream()
+				.map(b -> b.getVisualFactory()).filter(Objects::nonNull).collect(toList());
+		List<Class<? extends IControllerFactory>> controllerFactories = bindings.stream()
+				.map(b -> b.getControllerFactory()).filter(Objects::nonNull).collect(toList());
+
+		delegatingModelFactory = new DelegatingModelFactory(modelFactories, editedObject);
+		delegatingVisualFactory = new DelegatingVisualFactory(visualFactories);
+		delegatingControllerFactory = new DelegatingControllerFactory(controllerFactories);
+	}
+
+	/** Customize the viewer after it is created. The default implementation changes nothing. */
+	protected void customizeViewer() {
+		// the default does nothing
+	}
+
+	/** Called when a model element is selected in the diagram viewer. */
+	protected void modelSelected() {
+		getSite().getSelectionProvider().setSelection(createSelection());
+	}
+
+	/** Called when some change to the model happens. */
+	protected void applyModelChange(Change chg) {
+		ICommandStackService.getInstance().runAsCommand(editedObject, () -> chg.applyChange());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void addSelectionChangedListener(ISelectionChangedListener listener) {
+		if(!selectionListeners.contains(listener)) {
+			selectionListeners.add(listener);
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
+		selectionListeners.remove(listener);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void setSelection(ISelection selection) {
+		SelectionChangedEvent evt = new SelectionChangedEvent(this, selection);
+		for(ISelectionChangedListener scl : selectionListeners) {
+			scl.selectionChanged(evt);
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ISelection getSelection() {
+		return createSelection();
+	}
+
+	/** Creates an {@link IStructuredSelection} from {@link DiagramViewerSelection}. */
+	private IStructuredSelection createSelection() {
+		DiagramViewerSelection vsel = viewer.getSelection();
+		if(vsel.isEmpty()) {
+			return StructuredSelection.EMPTY;
+		}
+		List<Object> selList = new ArrayList<>(vsel.getSecondarySelections().size() + 1);
+		selList.add(vsel.getPrimarySelection().getModel());
+		for(IMVCBundle sec : vsel.getSecondarySelections()) {
+			selList.add(sec.getModel());
+		}
+		return new StructuredSelection(selList);
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
index 4c5ac569c0b6e7678fc8191096b26dfd09fdcb98..c258cb0ea28d74440856cd2abf367408fbbc1279 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/ModelEditorBindingBase.java
@@ -16,6 +16,9 @@
 package org.fortiss.tooling.kernel.ui.extension.base;
 
 import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
 import org.fortiss.tooling.kernel.service.base.IEObjectAware;
 import org.fortiss.tooling.kernel.ui.extension.IModelEditorBinding;
 import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
@@ -34,6 +37,7 @@ import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
  * @see IModelEditorBindingService
  * 
  * @author hoelzl
+ * @author diewald
  */
 public abstract class ModelEditorBindingBase<T extends EObject>
 		implements IEObjectAware<EObject>, IModelEditorBinding<T> {
@@ -48,6 +52,30 @@ public abstract class ModelEditorBindingBase<T extends EObject>
 		return getEditorClass(null);
 	}
 
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends IModelFactory> getModelFactory() {
+		throw new UnsupportedOperationException("This method shall only be called from FX" +
+				" editors. Ensure to define the model factory in the editor binding. Remove" +
+				" this method when the ediors are migrated to JavaFX.");
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends IVisualFactory> getVisualFactory() {
+		throw new UnsupportedOperationException("This method shall only be called from FX" +
+				" editors. Ensure to define the visual factory in the editor binding. Remove" +
+				" this method when the ediors are migrated to JavaFX.");
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Class<? extends IControllerFactory> getControllerFactory() {
+		throw new UnsupportedOperationException("This method shall only be called from FX" +
+				" editors. Ensure to define the controller factory in the editor binding. Remove" +
+				" this method when the ediors are migrated to JavaFX.");
+	}
+
 	/** Returns the label of editor */
 	@Override
 	public String getLabel(T object) {
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/.ratings
new file mode 100644
index 0000000000000000000000000000000000000000..75b475f75083ac3976a4740cc7fc19976f96542c
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/.ratings
@@ -0,0 +1,4 @@
+DelegatingControllerFactory.java ad214d83b5821b39862b7c382c91a13c3dfddbd0 GREEN
+DelegatingFactoryBase.java f421742267610f41bb6196346026d2f239d90ed0 GREEN
+DelegatingModelFactory.java 717b706781879efe9efcb5ce4bf53723e39a3e1b GREEN
+DelegatingVisualFactory.java 7e834acd12ae4d1c2b2b32a5456dc9f2b6d4e466 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingControllerFactory.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingControllerFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..ad214d83b5821b39862b7c382c91a13c3dfddbd0
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingControllerFactory.java
@@ -0,0 +1,111 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.ui.extension.base.factory;
+
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IController;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.controller.IControllerFactory;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IMVCBundle;
+
+/**
+ * Delegates the creational calls to concrete {@link IControllerFactory}s. The first non-null
+ * element returned by the factories of the initially given list is returned. If no element is
+ * created (all delegates returned null), this factory throws a {@link RuntimeException}.
+ * 
+ * @author hoelzl
+ * @author diewald
+ */
+public class DelegatingControllerFactory extends DelegatingFactoryBase<IControllerFactory>
+		implements IControllerFactory {
+
+	/** Constructor. */
+	public DelegatingControllerFactory(List<Class<? extends IControllerFactory>> factories) {
+		super(factories, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IController createContentController(IContentMVCBundle modelBundle) {
+		Optional<IController> controller =
+				getDelegateFactories().stream().map(f -> f.createContentController(modelBundle))
+						.filter(cc -> cc != null).findFirst();
+		if(controller.isPresent()) {
+			return controller.get();
+		}
+		throw createNoControllerException(modelBundle);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IController createDiagramAnchorageController(IDiagramAnchorageMVCBundle modelBundle) {
+		Optional<IController> controller = getDelegateFactories().stream()
+				.map(f -> f.createDiagramAnchorageController(modelBundle)).filter(cc -> cc != null)
+				.findFirst();
+		if(controller.isPresent()) {
+			return controller.get();
+		}
+		throw createNoControllerException(modelBundle);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IController createContentAnchorageController(IContentAnchorageMVCBundle modelBundle) {
+		Optional<IController> controller = getDelegateFactories().stream()
+				.map(f -> f.createContentAnchorageController(modelBundle)).filter(cc -> cc != null)
+				.findFirst();
+		if(controller.isPresent()) {
+			return controller.get();
+		}
+		throw createNoControllerException(modelBundle);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IController createLinkController(ILinkMVCBundle modelBundle) {
+		Optional<IController> controller = getDelegateFactories().stream()
+				.map(f -> f.createLinkController(modelBundle)).filter(cc -> cc != null).findFirst();
+		if(controller.isPresent()) {
+			return controller.get();
+		}
+		throw createNoControllerException(modelBundle);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IController createDiagramController(IDiagramMVCBundle diagramBundle) {
+		Optional<IController> controller = getDelegateFactories().stream().map(f -> {
+			return f.createDiagramController(diagramBundle);
+		}).filter(cc -> cc != null).findFirst();
+		if(controller.isPresent()) {
+			return controller.get();
+		}
+		throw createNoControllerException(diagramBundle);
+	}
+
+	/** Throws a runtime exception indicating a missing controller. */
+	private RuntimeException createNoControllerException(IMVCBundle modelBundle) {
+		return new RuntimeException("No controller has been specified for model elements of the" +
+				" type " + modelBundle.getModel().getClass().getSimpleName() + ". Please check" +
+				" the editor bindings and the delegate controllers.");
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingFactoryBase.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingFactoryBase.java
new file mode 100644
index 0000000000000000000000000000000000000000..f421742267610f41bb6196346026d2f239d90ed0
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingFactoryBase.java
@@ -0,0 +1,79 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.ui.extension.base.factory;
+
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.lang3.reflect.ConstructorUtils.getMatchingAccessibleConstructor;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Optional;
+
+import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
+
+import com.google.common.collect.ImmutableList;
+
+/**
+ * Base class for delegating MVC factories that wrap 1..n factories for editors of a defined type.
+ * 
+ * @author diewald
+ */
+/* package */ abstract class DelegatingFactoryBase<T> {
+
+	/** References the edited Object in case it is needed by some factory. May be {@code null}. */
+	protected final Object editedObject;
+
+	/** References the */
+	private List<T> delegateFactories = new ArrayList<>();
+
+	/** Constructor. */
+	protected DelegatingFactoryBase(List<Class<? extends T>> factories, Object editedObject) {
+		this.editedObject = editedObject;
+
+		delegateFactories = factories.stream().map(fCls -> constructFactory(fCls))
+				.flatMap(Optional::stream).collect(toList());
+	}
+
+	/** Creates an instance of the given {@code delegateFactory}. */
+	protected Optional<? extends T> constructFactory(Class<? extends T> delegateFactory) {
+		Constructor<? extends T> ctor = null;
+		try {
+			ctor = getMatchingAccessibleConstructor(delegateFactory);
+			try {
+				return Optional.of(ctor.newInstance());
+			} catch(InstantiationException | IllegalAccessException | IllegalArgumentException |
+					InvocationTargetException e) {
+				error(ToolingKernelUIActivator.getDefault(), "Failed to instantiate the factory " +
+						delegateFactory.getSimpleName() + ".");
+				return Optional.empty();
+			}
+		} catch(NullPointerException | SecurityException e1) {
+			error(ToolingKernelUIActivator.getDefault(), "The factory " +
+					delegateFactory.getSimpleName() +
+					" is missing a no-arg Constructor. Only such constructors are allowed for" +
+					" these factories.");
+			return Optional.empty();
+		}
+	}
+
+	/** Returns the list of delegate factory instances whose types are given during construction. */
+	protected ImmutableList<T> getDelegateFactories() {
+		return ImmutableList.copyOf(delegateFactories);
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingModelFactory.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingModelFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..717b706781879efe9efcb5ce4bf53723e39a3e1b
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingModelFactory.java
@@ -0,0 +1,144 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.ui.extension.base.factory;
+
+import static java.util.stream.Collectors.toList;
+import static org.apache.commons.lang3.reflect.ConstructorUtils.getMatchingAccessibleConstructor;
+import static org.conqat.lib.commons.collections.CollectionUtils.isNullOrEmpty;
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getInterfaceType;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.List;
+import java.util.Optional;
+
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.model.IModelFactory;
+import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
+
+/**
+ * Delegates the creational and getter calls to concrete {@link IModelFactory}s. The first non-null
+ * element returned by the factories of the initially given list is returned. If no element is
+ * created (all delegates returned null), this factory also returns null.
+ * <p>
+ * Only the root model must be identical for all delegate factories. Hence, the root element of the
+ * first delegate is returned.
+ * 
+ * @author hoelzl
+ */
+public class DelegatingModelFactory extends DelegatingFactoryBase<IModelFactory>
+		implements IModelFactory {
+
+	/** Constructor. */
+	public DelegatingModelFactory(List<Class<? extends IModelFactory>> factories,
+			Object editedObject) {
+		super(factories, editedObject);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	protected Optional<? extends IModelFactory>
+			constructFactory(Class<? extends IModelFactory> delegateFactory) {
+		Constructor<? extends IModelFactory> ctor = null;
+		try {
+			Class<?> ctorParamType = (editedObject instanceof EObject)
+					? getInterfaceType((EObject)editedObject) : editedObject.getClass();
+			ctor = getMatchingAccessibleConstructor(delegateFactory, ctorParamType);
+			try {
+				return Optional.of(ctor.newInstance(editedObject));
+			} catch(InstantiationException | IllegalAccessException | IllegalArgumentException |
+					InvocationTargetException e) {
+				error(ToolingKernelUIActivator.getDefault(), "Failed to instantiate the factory " +
+						delegateFactory.getSimpleName() + ".");
+				return Optional.empty();
+			}
+		} catch(NullPointerException | SecurityException e1) {
+			error(ToolingKernelUIActivator.getDefault(), "The factory " +
+					delegateFactory.getSimpleName() +
+					" is missing a single argument Constructor accepting the edited model." +
+					" Only such constructors are allowed for " +
+					IModelFactory.class.getSimpleName() + "s.");
+			return Optional.empty();
+		}
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getContentAnchorageModels(Object parent) {
+		return getDelegateFactories().stream().map(f -> f.getContentAnchorageModels(parent))
+				.filter(lm -> !isNullOrEmpty(lm)).flatMap(Collection::stream).distinct()
+				.collect(toList());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getLinkStart(Object link) {
+		return getDelegateFactories().stream().map(f -> f.getLinkStart(link))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getLinkEnd(Object link) {
+		return getDelegateFactories().stream().map(f -> f.getLinkEnd(link)).filter(cc -> cc != null)
+				.findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getParent(Object element) {
+		return getDelegateFactories().stream().map(f -> f.getParent(element))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public Object getRootModel() {
+		return editedObject;
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getContentModels() {
+		return getDelegateFactories().stream().map(f -> f.getContentModels())
+				.filter(lm -> !isNullOrEmpty(lm)).flatMap(Collection::stream).distinct()
+				.collect(toList());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getDiagramAnchorageModels() {
+		return getDelegateFactories().stream().map(f -> f.getDiagramAnchorageModels())
+				.filter(lm -> !isNullOrEmpty(lm)).flatMap(Collection::stream).distinct()
+				.collect(toList());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<?> getLinkModels() {
+		return getDelegateFactories().stream().map(f -> f.getLinkModels())
+				.filter(lm -> !isNullOrEmpty(lm)).flatMap(Collection::stream).distinct()
+				.collect(toList());
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public void update() {
+		// Not yet needed.
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingVisualFactory.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingVisualFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..7e834acd12ae4d1c2b2b32a5456dc9f2b6d4e466
--- /dev/null
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/extension/base/factory/DelegatingVisualFactory.java
@@ -0,0 +1,81 @@
+/*-------------------------------------------------------------------------+
+| Copyright 2019 fortiss GmbH                                              |
+|                                                                          |
+| Licensed under the Apache License, Version 2.0 (the "License");          |
+| you may not use this file except in compliance with the License.         |
+| You may obtain a copy of the License at                                  |
+|                                                                          |
+|    http://www.apache.org/licenses/LICENSE-2.0                            |
+|                                                                          |
+| Unless required by applicable law or agreed to in writing, software      |
+| distributed under the License is distributed on an "AS IS" BASIS,        |
+| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
+| See the License for the specific language governing permissions and      |
+| limitations under the License.                                           |
++--------------------------------------------------------------------------*/
+package org.fortiss.tooling.kernel.ui.extension.base.factory;
+
+import java.util.List;
+
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IContentMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.IDiagramAnchorageMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.mvc.ILinkMVCBundle;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentAnchorageVisual;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IContentVisual;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IDiagramAnchorageVisual;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.ILinkVisual;
+import org.eclipse.systemfocus.kernel.common.ui.javafx.lwfxef.visual.IVisualFactory;
+import org.eclipse.ui.IEditorPart;
+import org.fortiss.tooling.kernel.service.ITransformationService;
+import org.fortiss.tooling.kernel.ui.extension.base.LWFXEFEditorBase;
+
+/**
+ * Base class for {@link IVisualFactory}s of extendable {@link LWFXEFEditorBase}
+ * {@link IEditorPart}s.The first non-null element returned by the factories of the initially given
+ * list is returned. If no element is
+ * created (all delegates returned null), this factory also returns null.
+ * <P>
+ * This class uses the {@link ITransformationService} to find a delegate visual factory for the
+ * model elements in question.
+ * 
+ * @author hoelzl
+ */
+public class DelegatingVisualFactory extends DelegatingFactoryBase<IVisualFactory>
+		implements IVisualFactory {
+
+	/** Constructor. */
+	public DelegatingVisualFactory(List<Class<? extends IVisualFactory>> factories) {
+		super(factories, null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IContentVisual createContentVisual(IContentMVCBundle modelBundle) {
+		return getDelegateFactories().stream().map(f -> f.createContentVisual(modelBundle))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IDiagramAnchorageVisual
+			createDiagramAnchorageVisual(IDiagramAnchorageMVCBundle modelBundle) {
+		return getDelegateFactories().stream().map(f -> f.createDiagramAnchorageVisual(modelBundle))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public IContentAnchorageVisual
+			createContentAnchorageVisual(IContentAnchorageMVCBundle modelBundle) {
+		return getDelegateFactories().stream().map(f -> f.createContentAnchorageVisual(modelBundle))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public ILinkVisual createLinkVisual(ILinkMVCBundle modelBundle) {
+		return getDelegateFactories().stream().map(f -> f.createLinkVisual(modelBundle))
+				.filter(cc -> cc != null).findFirst().orElse(null);
+	}
+}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
index 4ea2eb911c9c55e937b880dbeaf7c166dd8ac547..4fe5ae19062526bb33cd7efe44bd12d9d85587b6 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/.ratings
@@ -1,12 +1,10 @@
 ActionService.java e29126b5947c9fd2f1d82bb87001b9d0ead50c3b GREEN
 AllocationEditPartFactoryService.java 81bd227736013f1157ba9d0f79a9f3deefe10064 GREEN
-ConstraintLabelDecorator.java ac138bfc97ea3b2f8fde0497ade915e4cd942af1 GREEN
-ConstraintUIService.java 433e35bb1c9bbc628c6ee070ff45632400becf4a GREEN
 ContextMenuService.java ca3c899293f25b70ce8e5f0d86ca2f9683329d81 GREEN
 EditPartFactoryService.java e9180c0020f1769d9e24ef3c08f9ca5599dbc5c3 GREEN
-MarkerService.java b01b7706034691683df7bbc2e7828c42574b3147 GREEN
+MarkerService.java 208f97f3ccabf0947702a17ddca23d8766a268f4 GREEN
 ModelEditorBindingService.java 948fcdc298a74e366351ad8835a145af6cd238be GREEN
 ModelElementHandlerService.java 07a30545ad687ff0fe13bf7a9348c41fb03e0b2c GREEN
 NavigatorService.java 2b1361eac805996e22e5409dafff9707fbac3376 GREEN
-ToolingKernelUIInternal.java 38903445a9084b7908716a00f41621dfb3126fca GREEN
+ToolingKernelUIInternal.java a70d19883dfb315d860233156d8524cf1ac2952f GREEN
 TutorialUIService.java b1d632eca91b4feb583f3930cd6ee4722dd9bfed GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java
deleted file mode 100644
index ac138bfc97ea3b2f8fde0497ade915e4cd942af1..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintLabelDecorator.java
+++ /dev/null
@@ -1,60 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.internal;
-
-import static org.fortiss.tooling.kernel.ui.ESharedImages.ERROR_OVERLAY;
-import static org.fortiss.tooling.kernel.ui.ESharedImages.FATAL_OVERLAY;
-import static org.fortiss.tooling.kernel.ui.ESharedImages.WARNING_OVERLAY;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.viewers.BaseLabelProvider;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.jface.viewers.ILightweightLabelDecorator;
-import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity;
-import org.fortiss.tooling.kernel.ui.service.IMarkerService;
-import org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils;
-
-/**
- * Label decorator for the {@link IMarkerService} decorations: errors, warnings, etc.
- * 
- * @author hoelzl
- */
-public final class ConstraintLabelDecorator extends BaseLabelProvider
-		implements ILightweightLabelDecorator {
-
-	/** {@inheritDoc} */
-	@Override
-	public void decorate(Object element, IDecoration decoration) {
-		if(element instanceof EObject) {
-			ESeverity sev =
-					IMarkerService.getInstance().getHighestViolationSeverity((EObject)element);
-			sev = ConstraintsUIUtils.augmentSeverityWithConstraintSeverity(sev, (EObject)element);
-			switch(sev) {
-				case FATAL:
-					decoration.addOverlay(FATAL_OVERLAY.getImageDescriptor());
-					break;
-				case ERROR:
-					decoration.addOverlay(ERROR_OVERLAY.getImageDescriptor());
-					break;
-				case WARNING:
-					decoration.addOverlay(WARNING_OVERLAY.getImageDescriptor());
-					break;
-				default:
-					// ignore info and debug
-			}
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintUIService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintUIService.java
deleted file mode 100644
index 433e35bb1c9bbc628c6ee070ff45632400becf4a..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ConstraintUIService.java
+++ /dev/null
@@ -1,475 +0,0 @@
-package org.fortiss.tooling.kernel.ui.internal;
-
-import static java.util.Collections.emptyList;
-import static org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils.displayTimeConsumptionWarning;
-import static org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils.triggerMarkerRefresh;
-import static org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils.triggerMarkersRefresh;
-import static org.fortiss.tooling.kernel.utils.LoggingUtils.warning;
-
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.function.Predicate;
-import java.util.stream.Collectors;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.ENamedElement;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.fortiss.tooling.kernel.ToolingKernelActivator;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.introspection.IIntrospectionItem;
-import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintsPackage;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.service.IKernelIntrospectionSystemService;
-import org.fortiss.tooling.kernel.service.IPersistencyService;
-import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
-import org.fortiss.tooling.kernel.ui.extension.IConstraintUI;
-import org.fortiss.tooling.kernel.ui.internal.introspection.items.ConstraintUIServiceIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils;
-import org.fortiss.tooling.kernel.utils.EcoreUtils;
-import org.fortiss.tooling.kernel.utils.LoggingUtils;
-
-/**
- * Implementation of {@link IConstraintUIService}.
- * 
- * @author aravantinos
- */
-public final class ConstraintUIService
-		implements IConstraintUIService, IIntrospectiveKernelService {
-
-	/** The singleton service instance. */
-	private static ConstraintUIService INSTANCE = new ConstraintUIService();
-
-	/** Stores the string to class handler map. */
-	protected final Map<String, Class<? extends IConstraint>> string2cstrMap =
-			new HashMap<String, Class<? extends IConstraint>>();
-
-	/** Stores the non-UI class to UI class handler map. */
-	protected final Map<Class<? extends IConstraint>, Class<? extends IConstraintUI>> cstr2cstrUIMap =
-			new HashMap<Class<? extends IConstraint>, Class<? extends IConstraintUI>>();
-
-	/** Stores the UI-class to instance handler map. */
-	protected final Map<Class<? extends IConstraintUI>, IConstraintUI> instanceMap =
-			new HashMap<Class<? extends IConstraintUI>, IConstraintUI>();
-
-	/** Returns the service instance. */
-	public static ConstraintUIService getInstance() {
-		return INSTANCE;
-	}
-
-	/** Activates logging to observe when constraints get outdated. */
-	private static final boolean DEBUG = false;
-
-	/** Starts the service. */
-	public void startService() {
-		IKernelIntrospectionSystemService.getInstance().registerService(this);
-		List<ITopLevelElement> tops = IPersistencyService.getInstance().getTopLevelElements();
-		for(ITopLevelElement top : tops) {
-			TreeIterator<EObject> tree = top.getRootModelElement().eAllContents();
-			while(tree.hasNext()) {
-				EObject next = tree.next();
-				if(next instanceof ConstraintInstance) {
-					install((ConstraintInstance)next);
-				}
-			}
-		}
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void registerConstraintUI(Class<? extends IConstraintUI> cstrUIClass,
-			Class<? extends IConstraint> cstrClass) {
-		String name = cstrClass.getName();
-		if(string2cstrMap.get(name) != null) {
-			warning(ToolingKernelActivator.getDefault(),
-					"Encountered more than one registered constraint UI associated with " + name);
-		}
-		string2cstrMap.put(name, cstrClass);
-		cstr2cstrUIMap.put(cstrClass, cstrUIClass);
-		try {
-			instanceMap.put(cstrUIClass, cstrUIClass.getConstructor().newInstance());
-		} catch(InstantiationException | IllegalAccessException | IllegalArgumentException |
-				InvocationTargetException | NoSuchMethodException | SecurityException e) {
-			warning(ToolingKernelActivator.getDefault(),
-					"Instanciation of " + cstrUIClass.getName() + " threw an exception.");
-		}
-	}
-
-	/** Initializes the service by setting up the handler map. */
-	public void initializeService() {
-		// nothing to do here
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getIntrospectionDescription() {
-		return getIntrospectionLabel() +
-				"\n\nThis service deals with the UI aspects of constraints." +
-				"\n\nIt provides the following:" +
-				"\n- inform whether a constraint instance can be open or not," +
-				"\n- open the status of a constraint instance," +
-				"\n- \"install\" a constraint instance, i.e., sets listeners on the constrained element(s) in order" +
-				"\n  to automatically detect when a constraint is outdated," +
-				"\n- inform, for a given constraint instance, whether it should display an error or a warning in case of non-satisfaction," +
-				"\n- provide a user-friendly short description for a constraint (useful in various automatic messages)," +
-				"\n- provide an icon for a given constraint (useful in the context menu)," +
-				"\n- give the status of a given constraint instance - taking into account whether the constraint is activated or not," +
-				"\n- activate a given constraint," + "\n- deactivate a given constraint," +
-				"\n- give the list of all available constraints," +
-				"\n- give the list of constraints which should always be activated - by opposition to those which should be explicitly activated by the user," +
-				"\n- give the list of constraints which are currently activated - by the user or automatically," +
-				"\n- complete a given project with instances of a given constraint if necessary." +
-				"\n\nThis service is \"fed\" by classes of type IConstraintUI." +
-				"\n\nThe class org.fortiss.tooling.kernel.ui.extension.base.ConstraintVerifierUIBaseAutocheck should" +
-				"\ngenerally provide a sufficient initial implementation. You are however strongly encouraged" +
-				"\nto extend this class to provide a better feedback to the user (e.g., with detailed errors)." +
-				"\n\nSee the developer wiki page \"Add a new constraint on a metamodel\"" +
-				" for detailed documentation on developing a new sort of constraint.";
-	}
-
-	/** @return the first registered constraint UI corresponding to <code>ci</code>. */
-	private IConstraintUI getConstraintUI(ConstraintInstance ci) {
-		Class<? extends IConstraint> cstr = string2cstrMap.get(ci.getConstraintName());
-		Class<? extends IConstraintUI> cstrUI = cstr2cstrUIMap.get(cstr);
-		return instanceMap.get(cstrUI);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void openStatus(ConstraintInstance ci) {
-		getConstraintUI(ci).openStatus(ci, getStatus(ci));
-		triggerMarkersRefresh(ci);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean canOpen(ConstraintInstance ci) {
-		IConstraintUI verifier = getConstraintUI(ci);
-		return verifier.canOpen(ci, getStatus(ci));
-	}
-
-	/** Map containing the adapters of each constrained element. */
-	Map<IConstrained, Adapter> constrainedAdapterMap = new HashMap<IConstrained, Adapter>();
-
-	/** Installed constraints, sorted by adapters. */
-	Map<Adapter, List<ConstraintInstance>> installedConstraintInstances = new HashMap<>();
-
-	/** {@inheritDoc} */
-	@Override
-	public void install(ConstraintInstance ci) {
-		triggerMarkersRefresh(ci);
-		for(IConstrained constrained : ci.getConstraineds()) {
-			Adapter currentAdapter = constrainedAdapterMap.get(constrained);
-			if(currentAdapter == null) {
-				currentAdapter = new EContentAdapter() {
-					@Override
-					public void notifyChanged(Notification notification) {
-						super.notifyChanged(notification);
-						if(isTouch(notification) || constraintRemoved(notification, constrained)) {
-							return;
-						}
-						List<ConstraintInstance> outdatedConstraintInstances = new ArrayList<>();
-						for(ConstraintInstance ci : installedConstraintInstances.get(this)) {
-							if(getStatus(ci) != null) {
-								constraintOutdated(ci, notification);
-								outdatedConstraintInstances.add(ci);
-							}
-						}
-						triggerMarkersRefresh(outdatedConstraintInstances);
-					}
-				};
-				constrained.eAdapters().add(currentAdapter);
-				constrainedAdapterMap.put(constrained, currentAdapter);
-				installedConstraintInstances.put(currentAdapter, new ArrayList<>());
-			}
-			installedConstraintInstances.get(currentAdapter).add(ci);
-		}
-	}
-
-	/**
-	 * Checks if <code>notification</code> denotes a change entailing that <code>ci</code> is
-	 * outdated. If so updates the status to outdated or triggers an automatic check if the
-	 * <code>autocheck</code> field of the constraint is <code>true</code>.
-	 * 
-	 * @return <code>true</code> iff <code>notification</code> indeed entailed that <code>ci</code>
-	 *         is outdated.
-	 */
-	private boolean constraintOutdated(ConstraintInstance ci, Notification notification) {
-		if(skipStatusChangeNotification(ci, notification)) {
-			return false;
-		}
-		if(!IConstraintService.getInstance().isUpToDate(ci)) {
-			if(DEBUG) {
-				String msg = "Constraint instance " + ci.toString() + " is outdated.";
-				LoggingUtils.info(ToolingKernelUIActivator.getDefault(), msg);
-			}
-			if(!IConstraintService.getInstance().isUpdating(ci)) {
-				IConstraintService.getInstance().markAsUpdating(ci);
-				getConstraintUI(ci).onOutdate(ci);
-				return true;
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return true iff <code>notification</code> denotes a change of the <code>ci</code>'s
-	 *         status.
-	 */
-	private boolean skipStatusChangeNotification(ConstraintInstance ci, Notification notification) {
-		String n = ConstraintsPackage.eINSTANCE.getConstraintInstance_Status().getName();
-		if(notification.getNotifier() != null && notification.getNotifier().equals(ci)) {
-			if(notification.getFeature() instanceof EReference) {
-				return(n.equals(((ENamedElement)notification.getFeature()).getName()));
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * @return true if the notification is a consequence of a constraint of <code>constrained</code>
-	 *         being removed.
-	 */
-	private boolean constraintRemoved(Notification notification, IConstrained constrained) {
-		if(notification.getEventType() != Notification.REMOVE) {
-			return false;
-		}
-		if(!notification.getNotifier().equals(constrained)) {
-			return false;
-		}
-		if(notification.getFeature() instanceof EReference) {
-			String name = ((ENamedElement)notification.getFeature()).getName();
-			if(name.equals(
-					ConstraintsPackage.eINSTANCE.getIConstrained_ConstraintInstances().getName())) {
-				Adapter cstrdAdapter = constrainedAdapterMap.get(constrained);
-				List<ConstraintInstance> cis = installedConstraintInstances.get(cstrdAdapter);
-				// To check!!! notification.getOldValue() should be the removed ConstraintInstance
-				cis.remove(notification.getOldValue());
-				if(cis.isEmpty()) {
-					constrained.eAdapters().remove(cstrdAdapter);
-					constrainedAdapterMap.remove(constrained);
-				}
-				return true;
-			}
-		}
-		return true;
-	}
-
-	/** @return true if <code>notification</code> is not relevant and should be skipped */
-	private static boolean isTouch(Notification notification) {
-		// Notifications which do not notify about a model change.
-		if(notification.isTouch()) {
-			return true;
-		}
-		// Notifications initiated by the the AF3 kernel which are only GUI related.
-		if(notification.getEventType() == EcoreUtils.KERNEL_EMF_EVENT_TYPE_COUNT) {
-			return true;
-		}
-		return false;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public IIntrospectionDetailsItem getDetailsItem() {
-		Map<String, Class<? extends IConstraintUI>> handlerMap = new HashMap<>();
-		for(Entry<String, Class<? extends IConstraint>> entry : string2cstrMap.entrySet()) {
-			Class<? extends IConstraintUI> cstrUIClass = cstr2cstrUIMap.get(entry.getValue());
-			handlerMap.put(entry.getKey(), cstrUIClass);
-		}
-		return new ConstraintUIServiceIntrospectionDetailsItem(handlerMap);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getIntrospectionLabel() {
-		return "Constraint UI Service";
-	}
-
-	/** Activated constraints per top level element. */
-	private static Map<ITopLevelElement, Set<Class<? extends IConstraint>>> activatedConstraints =
-			new HashMap<>();
-
-	/** {@inheritDoc} */
-	@Override
-	public IConstraintInstanceStatus getStatus(ConstraintInstance ci) {
-		ITopLevelElement top = IPersistencyService.getInstance().getTopLevelElementFor(ci);
-		boolean isActivated = false;
-		Set<Class<? extends IConstraint>> set = activatedConstraints.get(top);
-		if(set != null) {
-			for(Class<? extends IConstraint> id : set) {
-				if(id.getName().equals(ci.getConstraintName())) {
-					isActivated = true;
-				}
-			}
-		}
-		return isActivated ? ci.getStatus() : null;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends IConstraint>> getAllConstraints() {
-		return cstr2cstrUIMap.keySet();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends IConstraint>> getActivatedConstraints(ITopLevelElement top) {
-		Set<Class<? extends IConstraint>> res = activatedConstraints.get(top);
-		return res != null ? res : new HashSet<>();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void activate(Class<? extends IConstraint> cstrClass,
-			IConstraintInstanceContainer cstrContainer) {
-		ITopLevelElement top =
-				IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer);
-		if(!activatedConstraints.containsKey(top)) {
-			activatedConstraints.put(top, new HashSet<>());
-		}
-		activatedConstraints.get(top).add(cstrClass);
-		List<ConstraintInstance> addeds =
-				IConstraintService.getInstance().addMissingConstraintsInstances(top, cstrClass);
-		IConstraintUI cstrUI = instanceMap.get(cstr2cstrUIMap.get(cstrClass));
-		if(!addeds.isEmpty() && cstrUI.isTimeConsuming()) {
-			displayTimeConsumptionWarning(cstrClass);
-		}
-		// Install notifiers for newly added constraints
-		for(ConstraintInstance added : addeds) {
-			IConstraintUIService.getInstance().install(added);
-		}
-		EList<ConstraintInstance> cstrs = cstrContainer.getConstraintInstances();
-		Predicate<ConstraintInstance> isID = c -> cstrClass.getName().equals(c.getConstraintName());
-		List<ConstraintInstance> idCstrs = cstrs.stream().filter(isID).collect(Collectors.toList());
-		update(idCstrs);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void addMissingConstraintInstances(IConstraintInstanceContainer cstrContainer) {
-		ITopLevelElement top =
-				IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer);
-		List<ConstraintInstance> addeds = new ArrayList<ConstraintInstance>();
-		for(Class<? extends IConstraint> cstrClass : getActivatedConstraints(top)) {
-			addeds.addAll(IConstraintService.getInstance().addMissingConstraintsInstances(top,
-					cstrClass));
-			IConstraintService.getInstance().addMissingConstraintsInstances(top, cstrClass);
-		}
-		// Install notifiers for newly added constraints
-		for(ConstraintInstance added : addeds) {
-			IConstraintUIService.getInstance().install(added);
-		}
-		update(addeds);
-	}
-
-	/** Checks the constraints among the given list of constraint instances. */
-	private void update(List<ConstraintInstance> cis) {
-		// Checks all the constraints: the newly added and the already existing ones which are now
-		// activated.
-		for(ConstraintInstance ci : cis) {
-			// No need to check if it turns out the status is already known from a previous
-			// activation.
-			if(!IConstraintService.getInstance().isUpdating(ci) &&
-					(!IConstraintService.getInstance().isUpToDate(ci) ||
-							ci.getStatus() instanceof OutdatedConstraintInstanceStatus)) {
-				getConstraintUI(ci).onOutdate(ci);
-			}
-		}
-		ConstraintsUIUtils.triggerMarkersRefresh(cis);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void deactivate(Class<? extends IConstraint> cstrClass,
-			IConstraintInstanceContainer cstrContainer) {
-		ITopLevelElement top =
-				IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer);
-		activatedConstraints.get(top).remove(cstrClass);
-		triggerMarkerRefresh(cstrClass, cstrContainer);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getDescription(Class<? extends IConstraint> cstrClass) {
-		IConstraintUI cstrUI = instanceMap.get(cstr2cstrUIMap.get(cstrClass));
-		return cstrUI == null ? null : cstrUI.getDescription();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean showInIntrospectionNavigation() {
-		return true;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Collection<IIntrospectionItem> getIntrospectionItems() {
-		return emptyList();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public ImageDescriptor getIconImageDescriptor(ConstraintInstance ci) {
-		Class<? extends IConstraint> cstrClass = string2cstrMap.get(ci.getConstraintName());
-		IConstraintUI cstrUI = instanceMap.get(cstr2cstrUIMap.get(cstrClass));
-		return cstrUI == null ? null : cstrUI.getIconImageDescriptor();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean shallDisplayAsWarning(ConstraintInstance constraint) {
-		return getConstraintUI(constraint).displayAsWarning();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Set<Class<? extends IConstraint>> getAlwaysActivatedConstraints() {
-		HashSet<Class<? extends IConstraint>> res = new HashSet<>();
-		for(Entry<Class<? extends IConstraint>, Class<? extends IConstraintUI>> entry : cstr2cstrUIMap
-				.entrySet()) {
-			if(!instanceMap.get(entry.getValue()).shouldBeManuallyActivated()) {
-				res.add(entry.getKey());
-			}
-		}
-		return res;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getDescription(ConstraintInstance ci) {
-		Class<? extends IConstraint> cstrClass = string2cstrMap.get(ci.getConstraintName());
-		return instanceMap.get(cstr2cstrUIMap.get(cstrClass)).getDescription(ci);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public List<IFix> fixes(ConstraintInstance ci) {
-		List<IFix> fixes = null;
-		IConstraintUI cstr = getConstraintUI(ci);
-		if(cstr != null) {
-			fixes = cstr.fixes(ci, ci.getStatus());
-		}
-		return fixes != null ? fixes : new ArrayList<IFix>();
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
index b01b7706034691683df7bbc2e7828c42574b3147..208f97f3ccabf0947702a17ddca23d8766a268f4 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/MarkerService.java
@@ -18,7 +18,6 @@ package org.fortiss.tooling.kernel.ui.internal;
 import static java.util.Collections.emptyList;
 import static java.util.Collections.sort;
 import static org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator.getImageDescriptor;
-import static org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils.augmentSeverityWithConstraintSeverity;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.postRefreshNotification;
 
 import java.util.ArrayList;
@@ -41,7 +40,6 @@ import org.eclipse.ui.progress.UIJob;
 import org.fortiss.tooling.kernel.extension.data.IConstraintViolation;
 import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
 import org.fortiss.tooling.kernel.service.IConstraintCheckerService;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
 import org.fortiss.tooling.kernel.service.listener.IPersistencyServiceListener;
@@ -168,9 +166,6 @@ public class MarkerService implements IMarkerService, IPersistencyServiceListene
 			return ESeverity.lowest();
 		}
 		ESeverity sev = getCacheEntry(top).getHighestSeverity(element);
-		if(element instanceof IConstrained) {
-			sev = augmentSeverityWithConstraintSeverity(sev, element);
-		}
 		return sev;
 	}
 
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java
index 948fcdc298a74e366351ad8835a145af6cd238be..577f5db41abf240291434dbad6bc6b0fde1eeb2b 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ModelEditorBindingService.java
@@ -16,10 +16,13 @@
 package org.fortiss.tooling.kernel.ui.internal;
 
 import static java.util.Collections.emptyList;
+import static java.util.Collections.sort;
 import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.getParentElement;
 import static org.fortiss.tooling.kernel.utils.KernelModelElementUtils.isChildElementOf;
 import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
 
+import java.util.ArrayList;
+import java.util.Comparator;
 import java.util.EventObject;
 import java.util.HashMap;
 import java.util.List;
@@ -96,6 +99,16 @@ public class ModelEditorBindingService extends EObjectAwareServiceBase<IModelEdi
 	@Override
 	public void startService() {
 		IKernelIntrospectionSystemService.getInstance().registerService(this);
+
+		for(List<IModelEditorBinding<EObject>> bindings : handlerMap.values()) {
+			sort(bindings, new Comparator<IModelEditorBinding<EObject>>() {
+				@Override
+				public int compare(IModelEditorBinding<EObject> o1,
+						IModelEditorBinding<EObject> o2) {
+					return o2.getPriority() - o1.getPriority();
+				}
+			});
+		}
 	}
 
 	/** Registers the given editor binding with the service. */
@@ -169,12 +182,18 @@ public class ModelEditorBindingService extends EObjectAwareServiceBase<IModelEdi
 
 	/** {@inheritDoc} */
 	@Override
-	public List<IModelEditorBinding<EObject>> getBindings(EObject element) {
-		List<IModelEditorBinding<EObject>> bindings = getRegisteredHandlers(element.getClass());
+	public List<IModelEditorBinding<EObject>> getBindings(Class<? extends EObject> elementType) {
+		List<IModelEditorBinding<EObject>> bindings = getRegisteredHandlers(elementType);
 		if(bindings == null) {
 			bindings = emptyList();
 		}
-		return bindings;
+		return new ArrayList<>(bindings);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public List<IModelEditorBinding<EObject>> getBindings(EObject element) {
+		return getBindings(element.getClass());
 	}
 
 	/** {@inheritDoc} */
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ToolingKernelUIInternal.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ToolingKernelUIInternal.java
index 38903445a9084b7908716a00f41621dfb3126fca..a70d19883dfb315d860233156d8524cf1ac2952f 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ToolingKernelUIInternal.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/ToolingKernelUIInternal.java
@@ -29,7 +29,6 @@ public final class ToolingKernelUIInternal {
 		printPhase("Tooling Kernel UI initializing ...");
 		ActionService.getInstance().initializeService();
 		AllocationEditPartFactoryService.getInstance().initializeService();
-		ConstraintUIService.getInstance().initializeService();
 		ContextMenuService.getInstance().initializeService();
 		EditPartFactoryService.getInstance().initializeService();
 		MarkerService.getInstance().initializeService();
@@ -45,7 +44,6 @@ public final class ToolingKernelUIInternal {
 		printPhase("Tooling Kernel UI starting ...");
 		ActionService.getInstance().startService();
 		AllocationEditPartFactoryService.getInstance().startService();
-		ConstraintUIService.getInstance().startService();
 		ContextMenuService.getInstance().startService();
 		EditPartFactoryService.getInstance().startService();
 		MarkerService.getInstance().startService();
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
index 7b672cb407f325d3e708dae32125084d5b8d68e2..04963a065a9a724a7e30606456560f819bf493b7 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/.ratings
@@ -1,5 +1,5 @@
 ActionBarContributor.java 18d9db3744c5381cca8b6823b5f7bc18183a1cfa GREEN
-ExtendableMultiPageEditor.java f8eb6fdc347098fb03e776f23fab61109aa55d6e GREEN
+ExtendableMultiPageEditor.java b18b5eed364eaa1c83cbcb64a89288d1ad263f7d GREEN
 IActionContributingEditor.java 4aa7496d67822de919a8cf0af0ddaafc61bf2919 GREEN
 ModelElementEditorInput.java e269eff5d992d375a646e54d048f1f0efc6144dd GREEN
 TutorialStepUIEditor.java 9eadc96c302b5131ff4cc3715777718fa06ec7e8 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
index f8eb6fdc347098fb03e776f23fab61109aa55d6e..b18b5eed364eaa1c83cbcb64a89288d1ad263f7d 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/editor/ExtendableMultiPageEditor.java
@@ -15,11 +15,10 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.ui.internal.editor;
 
-import static java.util.Collections.sort;
 import static org.conqat.ide.commons.ui.logging.LoggingUtils.error;
 
+import java.lang.reflect.Constructor;
 import java.util.Collection;
-import java.util.Comparator;
 import java.util.EventObject;
 import java.util.List;
 
@@ -185,18 +184,13 @@ public class ExtendableMultiPageEditor extends MultiPageEditorPart
 		int pageIndex = 0;
 		List<IModelEditorBinding<EObject>> bindings =
 				IModelEditorBindingService.getInstance().getBindings(editedObject);
-		sort(bindings, new Comparator<IModelEditorBinding<EObject>>() {
-			@Override
-			public int compare(IModelEditorBinding<EObject> o1, IModelEditorBinding<EObject> o2) {
-				return o2.getPriority() - o1.getPriority();
-			}
-		});
 		for(IModelEditorBinding<EObject> editorBinding : bindings) {
 			try {
 				Class<? extends IEditorPart> editorClass =
 						editorBinding.getEditorClass(editedObject);
 				if(editorClass != null) {
-					IEditorPart editorPart = editorClass.newInstance();
+					Class<? extends EObject> inputType = editedObject.getClass();
+					IEditorPart editorPart = constructEditorPart(editorClass, inputType);
 					addPage(editorPart, getEditorInput());
 					setPageText(pageIndex++, editorBinding.getLabel(editedObject));
 				}
@@ -206,6 +200,23 @@ public class ExtendableMultiPageEditor extends MultiPageEditorPart
 		}
 	}
 
+	/**
+	 * Constructs an {@link IEditorPart} instance of the given {@code editorClass}.
+	 * {@link IEditorPart}s that take the input model element type as a parameter are preferred over
+	 * no-arg constructors.
+	 */
+	protected IEditorPart constructEditorPart(Class<? extends IEditorPart> editorClass,
+			Class<? extends EObject> inputType) throws Exception {
+		try {
+			Constructor<? extends IEditorPart> ctor = editorClass.getConstructor(Class.class);
+			return ctor.newInstance(inputType);
+		} catch(NoSuchMethodException | SecurityException e) {
+			// Fallback for no-arg constructors.
+			Constructor<? extends IEditorPart> ctor = editorClass.getConstructor();
+			return ctor.newInstance();
+		}
+	}
+
 	/** {@inheritDoc} */
 	@Override
 	public void doSave(IProgressMonitor monitor) {
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/.ratings
index cf783a7ef376170862fac66dc2f0ee007c206a64..5be567a381cb00bbd092fd15f0bedb8d6e158f38 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/.ratings
@@ -1,2 +1,2 @@
 DetailsUIHandlerBase.java d3d2038cee67f61ca0be7e0c832ffc95771cee0f GREEN
-KISSDetailsUIRegistry.java 89716fced381fa2b8e64cd8bcd81fa22495973d9 GREEN
+KISSDetailsUIRegistry.java 4ae512082e0a7751f9da1d631b1bba44c2e5e8c4 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/KISSDetailsUIRegistry.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/KISSDetailsUIRegistry.java
index 89716fced381fa2b8e64cd8bcd81fa22495973d9..4ae512082e0a7751f9da1d631b1bba44c2e5e8c4 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/KISSDetailsUIRegistry.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/KISSDetailsUIRegistry.java
@@ -21,7 +21,6 @@ import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.IIntrospectionItem;
 import org.fortiss.tooling.kernel.introspection.items.ConnectionCompositorServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.items.ConstraintCheckerServiceIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.introspection.items.ConstraintVerificationServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.items.EclipseResourceStorageServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.items.ElementCompositorServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.introspection.items.LibraryServiceIntrospectionDetailsItem;
@@ -32,8 +31,6 @@ import org.fortiss.tooling.kernel.introspection.items.TransformationServiceIntro
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.AllocationEditPartFactoryServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.ConnectionCompositorServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.ConstraintCheckerServiceIntrospectionDetailsUIHandler;
-import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.ConstraintServiceIntrospectionDetailsUIHandler;
-import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.ConstraintUIServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.ContextMenuServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.EclipseResourceStorageProviderIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.EditPartFactoryServiceIntrospectionDetailsUIHandler;
@@ -46,7 +43,6 @@ import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.Pers
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.PrototypeServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.details.handler.TransformationServiceIntrospectionDetailsUIHandler;
 import org.fortiss.tooling.kernel.ui.internal.introspection.items.AllocationEditPartFactoryServiceIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.ui.internal.introspection.items.ConstraintUIServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.ui.internal.introspection.items.ContextMenuServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.ui.internal.introspection.items.EditPartFactoryServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.ui.internal.introspection.items.ModelEditorBindingServiceIntrospectionDetailsItem;
@@ -100,10 +96,6 @@ public final class KISSDetailsUIRegistry {
 				new PersistencyServiceIntrospectionDetailsUIHandler());
 		registerHandler(TransformationServiceIntrospectionDetailsItem.class,
 				new TransformationServiceIntrospectionDetailsUIHandler());
-		registerHandler(ConstraintVerificationServiceIntrospectionDetailsItem.class,
-				new ConstraintServiceIntrospectionDetailsUIHandler());
-		registerHandler(ConstraintUIServiceIntrospectionDetailsItem.class,
-				new ConstraintUIServiceIntrospectionDetailsUIHandler());
 	}
 
 	/** Registers the given composite */
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/.ratings
index 90ff45a0a408bb5fa6f1cb93b69a980e20e74555..7603b3de5398117aa2b0d0afd8b299f9f63c8c9c 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/.ratings
@@ -1,8 +1,6 @@
 AllocationEditPartFactoryServiceIntrospectionDetailsUIHandler.java 944cc4d5db305ceba7ca1f1f1957a5160511a228 GREEN
 ConnectionCompositorServiceIntrospectionDetailsUIHandler.java bf4744afe94f1b97c2f8442466c10d4969b81854 GREEN
 ConstraintCheckerServiceIntrospectionDetailsUIHandler.java 33758640bc77148162b88143dd1ed758a12bcf30 GREEN
-ConstraintServiceIntrospectionDetailsUIHandler.java 8695a09d5a6047d1a478c1d48a49f1e3072caadd GREEN
-ConstraintUIServiceIntrospectionDetailsUIHandler.java bc5fff880e84fac2fa8e1bc43b67cfb2ce907f97 GREEN
 ContextMenuServiceIntrospectionDetailsUIHandler.java 33f39e000e14a9c2661ca280e82139593852be7c GREEN
 CopyClassNameToClipBoardRunnable.java 884555c7026c466d3401b272fc64b9f693074950 GREEN
 EObjectAware2IntrospectionDetailsUIHandlerBase.java 18aefde758dc370f564a535d71bab9afc8bdf91f GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintServiceIntrospectionDetailsUIHandler.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintServiceIntrospectionDetailsUIHandler.java
deleted file mode 100644
index 8695a09d5a6047d1a478c1d48a49f1e3072caadd..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintServiceIntrospectionDetailsUIHandler.java
+++ /dev/null
@@ -1,90 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.internal.introspection.details.handler;
-
-import org.conqat.ide.commons.ui.jface.TreeContentProviderBase;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TableLabelProviderBase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.introspection.items.ConstraintVerificationServiceIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-
-/**
- * Introspection UI handler for the {@link IConstraintService}.
- * 
- * @author hoelzl
- */
-public final class ConstraintServiceIntrospectionDetailsUIHandler
-		extends EObjectAwareIntrospectionDetailsUIHandlerBase {
-
-	/** {@inheritDoc} */
-	@Override
-	public Control createComposite(ScrolledComposite parent) {
-		String heading = "Type to search registered constraint:";
-		return createFilteredTreeInTabFolder(parent, heading, "", "Registered constraints");
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected void createTreeColumns(Tree tree) {
-		TreeColumn col0 = new TreeColumn(tree, SWT.LEFT);
-		col0.setText("Constraint");
-		col0.setWidth(900);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ITreeContentProvider createContentProvider() {
-		return new TreeContentProviderBase() {
-
-			/** {@inheritDoc} */
-			@Override
-			public Object[] getChildren(Object parentElement) {
-				if(parentElement == getInputObject()) {
-					return getInputObject().getHandlerKeyClasses().toArray();
-				}
-				return new Object[0];
-			}
-		};
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ITableLabelProvider createLabelProvider() {
-		return new TableLabelProvider();
-	}
-
-	/** Table label provider for handler registrations with two classes. */
-	protected static class TableLabelProvider extends TableLabelProviderBase {
-		/** {@inheritDoc} */
-		@Override
-		public String getColumnText(Object element, int columnIndex) {
-			return element instanceof IConstraint ? element.getClass().getName() : "";
-		}
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ConstraintVerificationServiceIntrospectionDetailsItem getInputObject() {
-		return (ConstraintVerificationServiceIntrospectionDetailsItem)dataItem;
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintUIServiceIntrospectionDetailsUIHandler.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintUIServiceIntrospectionDetailsUIHandler.java
deleted file mode 100644
index bc5fff880e84fac2fa8e1bc43b67cfb2ce907f97..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/details/handler/ConstraintUIServiceIntrospectionDetailsUIHandler.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.internal.introspection.details.handler;
-
-import java.util.Map.Entry;
-
-import org.conqat.ide.commons.ui.jface.TreeContentProviderBase;
-import org.eclipse.jface.viewers.ITableLabelProvider;
-import org.eclipse.jface.viewers.ITreeContentProvider;
-import org.eclipse.jface.viewers.TableLabelProviderBase;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.custom.ScrolledComposite;
-import org.eclipse.swt.widgets.Control;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-import org.fortiss.tooling.kernel.service.IConnectionCompositorService;
-import org.fortiss.tooling.kernel.ui.internal.introspection.items.ConstraintUIServiceIntrospectionDetailsItem;
-
-/**
- * Introspection UI handler for the {@link IConnectionCompositorService}.
- * 
- * @author hoelzl
- */
-public final class ConstraintUIServiceIntrospectionDetailsUIHandler
-		extends EObjectAwareIntrospectionDetailsUIHandlerBase {
-
-	/** {@inheritDoc} */
-	@Override
-	public Control createComposite(ScrolledComposite parent) {
-		String heading = "Type to search registered constraint UI's:";
-		return createFilteredTreeInTabFolder(parent, heading, "", "Registered constraint UI's");
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected void createTreeColumns(Tree tree) {
-		TreeColumn col0 = new TreeColumn(tree, SWT.LEFT);
-		col0.setText("Constraint UI");
-		col0.setWidth(600);
-
-		TreeColumn col1 = new TreeColumn(tree, SWT.LEFT);
-		col1.setText("Matching constraint");
-		col1.setWidth(300);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ITreeContentProvider createContentProvider() {
-		return new TreeContentProviderBase() {
-
-			/** {@inheritDoc} */
-			@Override
-			public Object[] getChildren(Object parentElement) {
-				if(parentElement == getInputObject()) {
-					return getInputObject().getHandlerKeyClasses().toArray();
-				}
-				return new Object[0];
-			}
-		};
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ITableLabelProvider createLabelProvider() {
-		return new TableLabelProvider();
-	}
-
-	/** Table label provider for handler registrations with two classes. */
-	protected static class TableLabelProvider extends TableLabelProviderBase {
-		/** {@inheritDoc} */
-		@Override
-		public String getColumnText(Object element, int columnIndex) {
-			if(element instanceof Entry<?, ?>) {
-				switch(columnIndex) {
-					case 0:
-						return (String)((Entry<?, ?>)element).getKey();
-					case 1:
-						return ((Class<?>)((Entry<?, ?>)element).getValue()).getName();
-				}
-			}
-			return "";
-		}
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	protected ConstraintUIServiceIntrospectionDetailsItem getInputObject() {
-		return (ConstraintUIServiceIntrospectionDetailsItem)dataItem;
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/.ratings
index 434543b49938dd77aef9d3a96ab693d4cdefb459..cf998a62cc03308101d57266a57e1116a2e3850f 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/.ratings
@@ -1,5 +1,4 @@
 AllocationEditPartFactoryServiceIntrospectionDetailsItem.java e2067b2d95c270a9aed82a2368177d76b0144d79 GREEN
-ConstraintUIServiceIntrospectionDetailsItem.java c143c6113a5bc3c69c6652055e6f703a170d9794 GREEN
 ContextMenuServiceIntrospectionDetailsItem.java ce7c725510e986b99fcddb40676cf6a5e7c2351d GREEN
 EditPartFactoryServiceIntrospectionDetailsItem.java f11316c73b6de0e254c4e319e063065e598d5c96 GREEN
 ModelEditorBindingServiceIntrospectionDetailsItem.java b241c242f5d8597542d9b63276b64ac2ca81ec7d GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/ConstraintUIServiceIntrospectionDetailsItem.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/ConstraintUIServiceIntrospectionDetailsItem.java
deleted file mode 100644
index c143c6113a5bc3c69c6652055e6f703a170d9794..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/introspection/items/ConstraintUIServiceIntrospectionDetailsItem.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.internal.introspection.items;
-
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.ui.extension.IConstraintUI;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-
-/**
- * {@link IIntrospectionDetailsItem} for {@link IConstraintUIService}.
- * 
- * @author hoelzl
- */
-public final class ConstraintUIServiceIntrospectionDetailsItem
-		implements IIntrospectionDetailsItem {
-
-	/** Read-only copy of the services handler maps. */
-	protected final Map<String, Class<? extends IConstraintUI>> handlerMap;
-
-	/** Constructor. */
-	public ConstraintUIServiceIntrospectionDetailsItem(
-			Map<String, Class<? extends IConstraintUI>> handlerMap) {
-		this.handlerMap = handlerMap;
-	}
-
-	/** Returns the registered constraint UI's along with their non-UI counterparts. */
-	public Set<Entry<String, Class<? extends IConstraintUI>>> getHandlerKeyClasses() {
-		return handlerMap.entrySet();
-	}
-
-	/** Returns the handler list for the given registration class. */
-	public Class<? extends IConstraintUI> getHandler(String regClass) {
-		return handlerMap.get(regClass);
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
index 4ef64c3de26f956c75e25f1106d5b0a80fbf821f..75283430c8346ab6dfc5341b8e549540588a4d82 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/.ratings
@@ -1,4 +1,3 @@
-ConstraintMenu.java 55bb88600b21e832109460f14fe8f09a18056fcc GREEN
 DoubleClick.java fd00e7737c0bad903433c0adb67dad92220ff451 GREEN
 GenericNewMenu.java 7e0dd435cb5ca6d4b486235ec17eef3e5c7aa5f6 GREEN
 LibraryView.java 44107622da7bcf431e1177e462d711646488957f GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ConstraintMenu.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ConstraintMenu.java
deleted file mode 100644
index 55bb88600b21e832109460f14fe8f09a18056fcc..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/internal/views/ConstraintMenu.java
+++ /dev/null
@@ -1,315 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.internal.views;
-
-import static java.util.Collections.emptyList;
-import static org.eclipse.jface.resource.ImageDescriptor.createFromImage;
-
-import java.util.List;
-import java.util.stream.Collectors;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.eclipse.jface.viewers.DecorationOverlayIcon;
-import org.eclipse.jface.viewers.IDecoration;
-import org.eclipse.swt.graphics.Image;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.ErrorConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.FailedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.SuccessConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.ICommandStackService;
-import org.fortiss.tooling.kernel.ui.ESharedImages;
-import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
-import org.fortiss.tooling.kernel.ui.extension.IContextMenuContributor;
-import org.fortiss.tooling.kernel.ui.extension.IModelElementHandler;
-import org.fortiss.tooling.kernel.ui.extension.data.ContextMenuContextProvider;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService.IFix;
-import org.fortiss.tooling.kernel.ui.service.IContextMenuService;
-import org.fortiss.tooling.kernel.ui.service.IModelEditorBindingService;
-import org.fortiss.tooling.kernel.ui.service.IModelElementHandlerService;
-
-/**
- * Context menu for constraints.
- * 
- * @author hoelzl
- */
-public class ConstraintMenu implements IContextMenuContributor {
-
-	/** {@inheritDoc} */
-	@Override
-	public List<IContributionItem> getContributedItems(EObject selectedObject,
-			ContextMenuContextProvider contextProvider) {
-		if(!(selectedObject instanceof IConstrained)) {
-			return emptyList();
-		}
-		return ((IConstrained)selectedObject).getConstraintInstances().stream()
-				.filter(ci -> shouldGetMenuEntry(ci))
-				.map(ci -> constraintToAction(ci, (IConstrained)selectedObject))
-				.collect(Collectors.toList());
-	}
-
-	/**
-	 * <code>true</code> iff <code>ci</code> should get a menu entry, i.e., if not successful and
-	 * activated.
-	 */
-	private boolean shouldGetMenuEntry(ConstraintInstance ci) {
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(ci);
-		return !(status == null || status instanceof SuccessConstraintInstanceStatus);
-	}
-
-	/**
-	 * Returns the submenu or menu entry corresponding to the status of <code>ci</code>.
-	 * <code>elt</code> is needed to prevent displaying an entry to go to <code>elt</code> (not
-	 * hurtful, but useless, since the user is already seeing it).
-	 */
-	private IContributionItem constraintToAction(ConstraintInstance ci, IConstrained elt) {
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(ci);
-		ConstraintSubMenuBase m;
-		if(status instanceof FailedConstraintInstanceStatus) {
-			m = new KnowMoreAboutFailingConstraintAction(ci, elt);
-		} else if(status instanceof ErrorConstraintInstanceStatus) {
-			m = new CheckErrorConstraintAction(ci, elt);
-		} else if(status instanceof OutdatedConstraintInstanceStatus) {
-			m = new CheckOutdatedConstraintAction(ci, elt);
-		} else {
-			// should not happen
-			return null;
-		}
-		if(m.getItems().length == 0) {
-			Action a = new Action(m.getMenuText(), m.getImageDescriptor()) {
-				// nothing to do
-			};
-			return new ActionContributionItem(a);
-		}
-		if(m.getItems().length == 1 && m.getTopActionContribution() != null) {
-			IAction uniqueAction = m.getTopActionContribution().getAction();
-			String txt = m.getMenuText();
-			String newText = txt + " -> " + uniqueAction.getText();
-			uniqueAction.setText(newText);
-			uniqueAction.setImageDescriptor(m.getImageDescriptor());
-			return m.getTopActionContribution();
-		}
-		return m;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getMenuSectionID() {
-		return IContextMenuService.BEFORE_GLOBAL_MENU_SECTION_ID;
-	}
-
-	/** Action to "go to" a given constrained element. */
-	private static class GoToConstrained extends Action {
-
-		/** The constrained element to open. */
-		private IConstrained cstrd;
-
-		/** Constructor. */
-		public GoToConstrained(IConstrained cstrd) {
-			super("Go to " + IModelElementHandlerService.getInstance().getName(cstrd),
-					createFromImage(IModelElementHandlerService.getInstance().getIcon(cstrd)));
-			this.cstrd = cstrd;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void run() {
-			IModelElementHandler<EObject> handler =
-					IModelElementHandlerService.getInstance().getModelElementHandler(cstrd);
-			EObject eltToOpen =
-					handler == null ? cstrd : handler.handleOpenModelElementRequest(cstrd);
-			IModelEditorBindingService.getInstance().openInEditor(eltToOpen);
-		}
-	}
-
-	/** Get the icon of the prototype. */
-	public static String getText(ConstraintInstance ci, String suffix) {
-		return "\"" + IConstraintUIService.getInstance().getDescription(ci) + "\": " + suffix;
-	}
-
-	/** Get the icon of the prototype. */
-	public static ImageDescriptor getIcon(ConstraintInstance ci, ImageDescriptor overlay) {
-		ImageDescriptor imgd = IConstraintUIService.getInstance().getIconImageDescriptor(ci);
-		Image img = imgd == null ? null : imgd.createImage();
-		if(img == null) {
-			if(IConstraintUIService.getInstance().shallDisplayAsWarning(ci)) {
-				return ESharedImages.WARNING.getImageDescriptor();
-			}
-			return ESharedImages.ERROR.getImageDescriptor();
-		}
-		ImageDescriptor[] descriptors = new ImageDescriptor[5];
-		descriptors[IDecoration.BOTTOM_LEFT] = overlay;
-		return new DecorationOverlayIcon(img, descriptors);
-	}
-
-	/** Get the correct overlay for the given constraint. */
-	private static ImageDescriptor getOverlay(ConstraintInstance ci) {
-		if(IConstraintUIService.getInstance().shallDisplayAsWarning(ci)) {
-			return ESharedImages.WARNING_OVERLAY.getImageDescriptor();
-		}
-		return ESharedImages.ERROR_OVERLAY.getImageDescriptor();
-	}
-
-	/** Base for action involved in a constraint submenu. */
-	private static class ConstraintSubMenuBase extends MenuManager {
-		/** The constraint. */
-		protected ConstraintInstance ci;
-
-		/**
-		 * The action to get more information about the constraint status.
-		 * The same action allows to update an outdated constraint status (there is no
-		 * "more information" to get out of an outdated constraint); it is stored in a field to
-		 * allow the "update" action to change the icon and the text going with it.
-		 */
-		protected ActionContributionItem moreInfoAction;
-
-		/** Constructor. */
-		public ConstraintSubMenuBase(ConstraintInstance ci, IConstrained selectedElt, String suffix,
-				ImageDescriptor overlay) {
-			super(getText(ci, suffix), getIcon(ci, overlay), null);
-			this.ci = ci;
-			if(IConstraintUIService.getInstance().canOpen(ci)) {
-				moreInfoAction = new ActionContributionItem(new OpenStatusAction());
-				this.add(moreInfoAction);
-			}
-			for(IConstrained cstrd : ci.getConstraineds()) {
-				if(!selectedElt.equals(cstrd)) {
-					this.add(new ActionContributionItem(new GoToConstrained(cstrd)));
-				}
-			}
-		}
-
-		/**
-		 * @return The top action contribution. Useful in case we get aware that there is only one
-		 *         contribution and we therefore want to present it without going through a submenu.
-		 */
-		public ActionContributionItem getTopActionContribution() {
-			if(this.getItems()[0] instanceof ActionContributionItem) {
-				return (ActionContributionItem)this.getItems()[0];
-			}
-			return null;
-		}
-
-		/** Action to update a constraint. Assumes the status *can be open*. */
-		protected class OpenStatusAction extends Action {
-
-			/** Constructor. */
-			public OpenStatusAction() {
-				super("More information...",
-						ToolingKernelUIActivator.getImageDescriptor("icons/info.gif"));
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public void run() {
-				IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(ci);
-				if(status instanceof OutdatedConstraintInstanceStatus) {
-					ICommandStackService.getInstance().runAsCommand(ci, new Runnable() {
-						@Override
-						public void run() {
-							IConstraintUIService.getInstance().openStatus(ci);
-						}
-					});
-				} else {
-					IConstraintUIService.getInstance().openStatus(ci);
-				}
-			}
-		}
-	}
-
-	/** Action for creating a new prototype. */
-	private static class CheckOutdatedConstraintAction extends ConstraintSubMenuBase {
-
-		/** Constructor. */
-		public CheckOutdatedConstraintAction(ConstraintInstance ci, IConstrained selectedElt) {
-			super(ci, selectedElt, "Outdated", ESharedImages.WARNING_OVERLAY.getImageDescriptor());
-			IAction action = moreInfoAction.getAction();
-			action.setImageDescriptor(ToolingKernelUIActivator.getImageDescriptor("icons/ok.png"));
-			action.setText("Check");
-		}
-	}
-
-	/** Action for knowing more about some unsuccessful constraint. */
-	private static class KnowMoreAboutUnsuccessfulConstraintAction extends ConstraintSubMenuBase {
-
-		/** Constructor. */
-		public KnowMoreAboutUnsuccessfulConstraintAction(ConstraintInstance ci,
-				IConstrained selectedElt, String suffix) {
-			super(ci, selectedElt, suffix, getOverlay(ci));
-			List<IFix> fixes = IConstraintUIService.getInstance().fixes(ci);
-			if(fixes != null) {
-				for(IFix fix : fixes) {
-					this.add(new ActionContributionItem(new FixAction(fix)));
-				}
-			}
-		}
-
-		/** Action to update a constraint. */
-		private class FixAction extends Action {
-
-			/** The fix to achieve. */
-			IFix fix;
-
-			/** Constructor. */
-			public FixAction(IFix fix) {
-				super(fix.getDescription(),
-						ToolingKernelUIActivator.getImageDescriptor("icons/fix.png"));
-				this.fix = fix;
-			}
-
-			/** {@inheritDoc} */
-			@Override
-			public void run() {
-				ICommandStackService.getInstance().runAsCommand(ci, new Runnable() {
-					@Override
-					public void run() {
-						fix.runFix(IConstraintUIService.getInstance().getStatus(ci));
-					}
-				});
-			}
-		}
-	}
-
-	/** Action for knowing more about a failing constraint. */
-	private static class KnowMoreAboutFailingConstraintAction
-			extends KnowMoreAboutUnsuccessfulConstraintAction {
-
-		/** Constructor. */
-		public KnowMoreAboutFailingConstraintAction(ConstraintInstance ci,
-				IConstrained selectedElt) {
-			super(ci, selectedElt, "Unsatisfied");
-		}
-	}
-
-	/** Action for knowing more about a constraint yielding an error. */
-	private static class CheckErrorConstraintAction
-			extends KnowMoreAboutUnsuccessfulConstraintAction {
-
-		/** Constructor. */
-		public CheckErrorConstraintAction(ConstraintInstance ci, IConstrained selectedElt) {
-			super(ci, selectedElt, "Error encountered");
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings
index e97d02bb76318c4fa509cab879c8029ee5376253..ac88577cf756cac95c8f570ad76c78098a9ea3ba 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/.ratings
@@ -1,10 +1,9 @@
 IActionService.java 22eafafc8708cbff7f855f7b1b9bef042c127f25 GREEN
 IAllocationEditPartFactoryService.java ac7243a8ff8a6c3f71937ecf3e63a04e271ca1d5 GREEN
-IConstraintUIService.java 07df6b9553bf04f8c414c976dc630e6a1dd5ec96 GREEN
 IContextMenuService.java cfb6b8237b6cd2b0e461991a9ceb95969f330265 GREEN
 IEditPartFactoryService.java c448bff63fb81f57037c9f1dc5319859c12d0c4d GREEN
 IMarkerService.java d433e838e387dd2fe61b8dea7395ebb7203ae39b GREEN
-IModelEditorBindingService.java e000fb7faf558d1201c5c26e449e0019b4ec24b0 GREEN
+IModelEditorBindingService.java ce2ae1957e2232bb0fac1d1d262103f9adfc5266 GREEN
 IModelElementHandlerService.java c04c2876ccb8b3f8597c8e443f9c7c3db0945430 GREEN
 INavigatorService.java 8d2ffeb6f075d3abea904b84d8a40090d97837fd GREEN
 ITutorialUIService.java 72707c60c3d23d8ffc5c579cb9b022bb614eb094 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IConstraintUIService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IConstraintUIService.java
deleted file mode 100644
index 07df6b9553bf04f8c414c976dc630e6a1dd5ec96..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IConstraintUIService.java
+++ /dev/null
@@ -1,112 +0,0 @@
-package org.fortiss.tooling.kernel.ui.service;
-
-import java.util.List;
-import java.util.Set;
-
-import org.eclipse.jface.resource.ImageDescriptor;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.ui.extension.IConstraintUI;
-import org.fortiss.tooling.kernel.ui.internal.ConstraintUIService;
-
-/**
- * GUI aspects of {@link IConstraintService}.
- * 
- * @author aravantinos
- */
-public interface IConstraintUIService {
-
-	/** Returns the service instance. */
-	public static IConstraintUIService getInstance() {
-		return ConstraintUIService.getInstance();
-	}
-
-	/** Action to take when trying to open the (status of the given) constraint instance. */
-	void openStatus(ConstraintInstance ci);
-
-	/** True if the (status of the) given constraint instance can be open. */
-	boolean canOpen(ConstraintInstance ci);
-
-	/**
-	 * Install the given constraint instance: install notifiers and triggers an "onOutdate" event.
-	 */
-	void install(ConstraintInstance ci);
-
-	/**
-	 * True if a failure of the given constraint instance shall be displayed as a warning instead of
-	 * as an error.
-	 */
-	boolean shallDisplayAsWarning(ConstraintInstance ci);
-
-	/** Returns a description for the given constraint. */
-	String getDescription(Class<? extends IConstraint> c);
-
-	/** Returns a description for the given constraint instance. */
-	String getDescription(ConstraintInstance ci);
-
-	/** Returns the image descriptor to be used as icon image for the given constraint instance. */
-	ImageDescriptor getIconImageDescriptor(ConstraintInstance c);
-
-	/**
-	 * Browse the elements in the context of the given container, adds constraints instances if
-	 * relevant and install them.
-	 */
-	void addMissingConstraintInstances(IConstraintInstanceContainer cstrContainer);
-
-	/**
-	 * Returns the status of the given constraint instance, possibly returns <code>null</code> if
-	 * the constraint instance is not activated.
-	 */
-	IConstraintInstanceStatus getStatus(ConstraintInstance ci);
-
-	/**
-	 * Returns a list of possible automatic fixes for <code>ci</code>. A constraint instance should
-	 * be candidate to fixing if it is anything but successful or outdated.
-	 */
-	List<IFix> fixes(ConstraintInstance ci);
-
-	/** Interface for a "fix". */
-	public interface IFix {
-		/**
-		 * Description of the fix. Useful to allow the user distinguish the fix in case there are
-		 * several.
-		 */
-		String getDescription();
-
-		/** Fixes (the constraint instance of) <code>status</code>. */
-		void runFix(IConstraintInstanceStatus status);
-	}
-
-	/** Returns a list of all available constraints. */
-	Set<Class<? extends IConstraint>> getAllConstraints();
-
-	/** Returns a list of constraints which should always be activated. */
-	Set<Class<? extends IConstraint>> getAlwaysActivatedConstraints();
-
-	/** Returns a list of all constraints which are activated for the given top element. */
-	Set<Class<? extends IConstraint>> getActivatedConstraints(ITopLevelElement top);
-
-	/**
-	 * Activates the constraint <code>cstr</code> in the context of the given constraints container.
-	 */
-	void activate(Class<? extends IConstraint> cstr, IConstraintInstanceContainer cstrContainer);
-
-	/**
-	 * Deactivates the constraint <code>cstr</code> in the context of the given constraints
-	 * container.
-	 * The constraint container is necessary to retrieve the constraints whose markers need to be
-	 * deactivated.
-	 */
-	void deactivate(Class<? extends IConstraint> cstr, IConstraintInstanceContainer cstrContainer);
-
-	/**
-	 * Registers the constraint UI part with the kernel and associates it with its non-UI
-	 * counterpart. The non-UI counterpart should however be registered separately.
-	 */
-	void registerConstraintUI(Class<? extends IConstraintUI> cstrUI,
-			Class<? extends IConstraint> cstr);
-}
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IModelEditorBindingService.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IModelEditorBindingService.java
index e000fb7faf558d1201c5c26e449e0019b4ec24b0..ce2ae1957e2232bb0fac1d1d262103f9adfc5266 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IModelEditorBindingService.java
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/service/IModelEditorBindingService.java
@@ -54,6 +54,9 @@ public interface IModelEditorBindingService {
 	/** Returns the currently active editor. */
 	IModelEditor<EObject> getActiveEditor();
 
+	/** Returns registered editor bindings for the given class. */
+	List<IModelEditorBinding<EObject>> getBindings(Class<? extends EObject> elementType);
+
 	/** Returns registered editor bindings for the given {@link EObject}. */
 	List<IModelEditorBinding<EObject>> getBindings(EObject element);
 
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/.ratings b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/.ratings
index f0fcdeb321a83a3554b17b564ff8d377d5cc8dbd..fd2078b766355261bbefb4db4293b6e65ecb2c06 100644
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/.ratings
+++ b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/.ratings
@@ -1,5 +1,4 @@
 ActionUtils.java 4553e487264e3d1f86f4767da4a7400cce4b9a5d GREEN
-ConstraintsUIUtils.java 69d5e08bbf768baf2790380e36f1020ef826a33e GREEN
 CopyPasteUtils.java bbc5cf9c9dc03ebf8dc75d42c919fe6eb60b388e GREEN
 DataBindingUtils.java 631c47881caa13fc567679a7e4416eb777af0713 GREEN
 DragAndDropUtils.java 7aab91518aa12d76533a345bf6ed0be9ac7ff0e5 GREEN
diff --git a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUIUtils.java b/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUIUtils.java
deleted file mode 100644
index 69d5e08bbf768baf2790380e36f1020ef826a33e..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel.ui/src/org/fortiss/tooling/kernel/ui/util/ConstraintsUIUtils.java
+++ /dev/null
@@ -1,337 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2015 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.ui.util;
-
-import static org.fortiss.tooling.kernel.extension.data.IConstraintViolation.SEVERITY_DIRECT_COMPARATOR;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.function.Consumer;
-import java.util.function.Function;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.viewers.ColumnLabelProvider;
-import org.eclipse.swt.SWT;
-import org.eclipse.swt.graphics.Color;
-import org.eclipse.swt.widgets.Display;
-import org.eclipse.swt.widgets.Shell;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.IConstraintViolation;
-import org.fortiss.tooling.kernel.extension.data.IConstraintViolation.ESeverity;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.ErrorConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.FailedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.SuccessConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService;
-import org.fortiss.tooling.kernel.ui.service.IConstraintUIService.IFix;
-import org.fortiss.tooling.kernel.utils.EcoreUtils;
-
-/**
- * Utility functions for constraints.
- * 
- * @author aravantinos
- */
-public class ConstraintsUIUtils {
-
-	/** Gathers some statuses by verification status. */
-	public static class ClassifiedStatuses {
-
-		/** Failed constraints. */
-		public List<FailedConstraintInstanceStatus> failedStatuses;
-
-		/** Error statuses (constraint could not be checked). */
-		public List<ErrorConstraintInstanceStatus> errorStatuses;
-
-		/** Outdated statuses. */
-		public List<OutdatedConstraintInstanceStatus> outdatedStatuses;
-
-		/** Successful constraints. */
-		public List<SuccessConstraintInstanceStatus> successStatuses;
-
-		/** Constructor. */
-		public ClassifiedStatuses() {
-			failedStatuses = new ArrayList<FailedConstraintInstanceStatus>();
-			errorStatuses = new ArrayList<ErrorConstraintInstanceStatus>();
-			outdatedStatuses = new ArrayList<OutdatedConstraintInstanceStatus>();
-			successStatuses = new ArrayList<SuccessConstraintInstanceStatus>();
-		}
-	}
-
-	/** Returns {@link ClassifiedStatuses} corresponding to <code>constrained</code>. */
-	public static ClassifiedStatuses getClassifiedStatuses(IConstrained constrained) {
-		ClassifiedStatuses res = new ClassifiedStatuses();
-		for(ConstraintInstance constraint : constrained.getConstraintInstances()) {
-			IConstraintInstanceStatus status =
-					IConstraintUIService.getInstance().getStatus(constraint);
-			if(status instanceof FailedConstraintInstanceStatus) {
-				res.failedStatuses.add((FailedConstraintInstanceStatus)status);
-			}
-			if(status instanceof ErrorConstraintInstanceStatus) {
-				res.errorStatuses.add((ErrorConstraintInstanceStatus)status);
-			}
-			if(status instanceof OutdatedConstraintInstanceStatus) {
-				res.outdatedStatuses.add((OutdatedConstraintInstanceStatus)status);
-			}
-			if(status instanceof SuccessConstraintInstanceStatus) {
-				res.successStatuses.add((SuccessConstraintInstanceStatus)status);
-			}
-		}
-		return res;
-	}
-
-	/** Returns {@link ESeverity} corresponding to the status of the constraint <code>c</code> */
-	public static ESeverity getConstraintSeverity(ConstraintInstance c) {
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(c);
-		if(IConstraintUIService.getInstance().shallDisplayAsWarning(c)) {
-			if(status instanceof FailedConstraintInstanceStatus ||
-					status instanceof OutdatedConstraintInstanceStatus) {
-				return ESeverity.WARNING;
-			}
-			return ESeverity.lowest();
-		}
-		if(status instanceof FailedConstraintInstanceStatus) {
-			return ESeverity.ERROR;
-		} else if(status instanceof ErrorConstraintInstanceStatus) {
-			return ESeverity.ERROR;
-		} else if(status instanceof OutdatedConstraintInstanceStatus) {
-			return ESeverity.WARNING;
-		} else {
-			return ESeverity.lowest();
-		}
-	}
-
-	/** Returns severity corresponding to the status of the constraints of <code>c</code>. */
-	public static ESeverity getSeverity(IConstrained c) {
-		try {
-			return c.getConstraintInstances().stream().map(cstr -> getConstraintSeverity(cstr))
-					.sorted(IConstraintViolation.SEVERITY_DIRECT_COMPARATOR).findFirst().get();
-		} catch(Exception e) {
-			return null;
-		}
-	}
-
-	/**
-	 * Returns the maximum severity between <code>sev</code> and the severity resulting of possibly
-	 * unsatisfied constraints on <code>modelElement</code>.
-	 */
-	public static ESeverity augmentSeverityWithConstraintSeverity(ESeverity sev,
-			EObject modelElement) {
-		if(modelElement instanceof IConstrained) {
-			ESeverity sev2 = ConstraintsUIUtils.getSeverity((IConstrained)modelElement);
-			if(sev == null || (sev2 != null && SEVERITY_DIRECT_COMPARATOR.compare(sev2, sev) < 0)) {
-				sev = sev2;
-			}
-		}
-		return sev == null ? ESeverity.lowest() : sev;
-	}
-
-	/**
-	 * Sends (kernel-specific) refresh notifications to the constrained elements to trigger a
-	 * refresh of the marker decorations.
-	 */
-	public static void triggerMarkersRefresh(ConstraintInstance ci) {
-		List<IConstrained> constraineds = new ArrayList<IConstrained>();
-		// We first collect separately the constrained objects because - unfortunately for some
-		// unknown reason - the following notification seems to trigger a change of the list of
-		// constrained objects.
-		constraineds.addAll(ci.getConstraineds());
-		constraineds.stream().forEach(constrained -> {
-			if(constrained != null) {
-				EcoreUtils.postRefreshNotification(constrained);
-			}
-		});
-	}
-
-	/**
-	 * Sends (kernel-specific) refresh notifications to every element constrained by a constraint
-	 * instance of the given list.
-	 */
-	public static void triggerMarkersRefresh(List<ConstraintInstance> cis) {
-		Set<IConstrained> constraineds = new HashSet<IConstrained>();
-		for(ConstraintInstance ci : cis) {
-			for(IConstrained cstrd : ci.getConstraineds()) {
-				if(cstrd != null) {
-					constraineds.add(cstrd);
-				}
-			}
-		}
-		constraineds.stream().forEach(cstrd -> EcoreUtils.postRefreshNotification(cstrd));
-	}
-
-	/**
-	 * Calls <code>triggerMarkersRefresh</code> on every constraint of <code>cstrContainer</code>
-	 * matching <code>id</code>.
-	 */
-	public static void triggerMarkerRefresh(Class<? extends IConstraint> cstrClass,
-			IConstraintInstanceContainer cstrContainer) {
-		for(ConstraintInstance c : cstrContainer.getConstraintInstances()) {
-			if(c.getConstraintName().equals(cstrClass.getName())) {
-				triggerMarkersRefresh(c);
-			}
-		}
-	}
-
-	/** Returns a standard text describing the status of <code>c</code>. */
-	public static String getText(ConstraintInstance c) {
-		if(c == null) {
-			return "";
-		}
-		String mainMsg = "ERROR";
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(c);
-		if(status == null) {
-			mainMsg = "NOT APPLICABLE";
-		} else if(status instanceof SuccessConstraintInstanceStatus) {
-			mainMsg = "SUCCESS";
-		} else if(status instanceof FailedConstraintInstanceStatus) {
-			mainMsg = "FAIL";
-		} else if(status instanceof OutdatedConstraintInstanceStatus) {
-			mainMsg = "OUTDATED";
-		}
-		return mainMsg;
-	}
-
-	/** Returns a standard "hint" indicating possible action on the status of <code>c</code>. */
-	public static String getHint(ConstraintInstance c) {
-		if(c == null) {
-			return "";
-		}
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(c);
-		if(status instanceof OutdatedConstraintInstanceStatus) {
-			return "(double-click to update)";
-		} else if(IConstraintUIService.getInstance().canOpen(c)) {
-			return "(double-click for more details)";
-		}
-		return "";
-	}
-
-	/** Returns a standard color corresponding to the status of <code>c</code>. */
-	public static Color getColor(ConstraintInstance c) {
-		Display display = Display.getCurrent();
-		if(c == null) {
-			return null;
-		}
-		IConstraintInstanceStatus status = IConstraintUIService.getInstance().getStatus(c);
-		if(status == null) {
-			return null;
-		} else if(status instanceof FailedConstraintInstanceStatus ||
-				status instanceof ErrorConstraintInstanceStatus) {
-			return display.getSystemColor(SWT.COLOR_RED);
-		} else if(status instanceof SuccessConstraintInstanceStatus) {
-			return display.getSystemColor(SWT.COLOR_GREEN);
-		}
-		return display.getSystemColor(SWT.COLOR_GRAY);
-	}
-
-	/** A label provider for the status of an {@link ConstraintInstance}. */
-	public static class StatusLabelProvider extends ColumnLabelProvider {
-
-		/** See constructor. */
-		private boolean withHint;
-
-		/** Function to retrieve a constraint from the embedded objects. */
-		private Function<Object, ConstraintInstance> getConstraint;
-
-		/**
-		 * Constructor.
-		 * 
-		 * @param withHint
-		 *            <code>true</code> if you want to display hints like "double-click for more
-		 *            details" in the status. If you set it to <code>true</code>, you are
-		 *            responsible for providing the corresponding behaviour (e.g., that
-		 *            double-clicking will open the status).
-		 * @param getConstraint
-		 *            Function returning a constraint from the object to be provided.
-		 */
-		public StatusLabelProvider(boolean withHint,
-				Function<Object, ConstraintInstance> getConstraint) {
-			super();
-			this.getConstraint = getConstraint;
-			this.withHint = withHint;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public String getText(Object element) {
-			ConstraintInstance cstr = getConstraint.apply(element);
-			// the following call CANNOT BE INLINED
-			String mainMsg = ConstraintsUIUtils.getText(cstr);
-			return mainMsg + (withHint ? " " + ConstraintsUIUtils.getHint(cstr) : "");
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public Color getBackground(Object element) {
-			ConstraintInstance cstr = getConstraint.apply(element);
-			return ConstraintsUIUtils.getColor(cstr);
-		}
-	}
-
-	/** Returns <code>true</code> iff <code>constraint</code> is active. */
-	public static boolean isConstraintActive(ConstraintInstance constraint) {
-		return IConstraintUIService.getInstance().getStatus(constraint) != null;
-	}
-
-	/**
-	 * Standard warning message to display when a resource-consuming check is activated for the
-	 * first time.
-	 */
-	public static void displayTimeConsumptionWarning(Class<? extends IConstraint> cstrClass) {
-		Display d = Display.getCurrent();
-		d = d == null ? Display.getDefault() : d;
-		Shell shell = d.getActiveShell();
-		String title = "Background operation about to start";
-		String msg = "AutoFOCUS will now go through your project to check that ";
-		msg += IConstraintUIService.getInstance().getDescription(cstrClass) + ". ";
-		msg += "This might slow down your system.\n\n";
-		msg += "Note that this is a one-time thing: once the check is activated, ";
-		msg += "subsequent runs should be unnoticed.";
-		MessageDialog.openWarning(shell, title, msg);
-	}
-
-	/** Base for fixes. */
-	public static class FixBase implements IFix {
-		/** The description. */
-		private String description;
-
-		/** The fix itself. */
-		private Consumer<IConstraintInstanceStatus> fix;
-
-		/** Constructor. */
-		public FixBase(String description, Consumer<IConstraintInstanceStatus> fix) {
-			this.description = description;
-			this.fix = fix;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public String getDescription() {
-			return description;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void runFix(IConstraintInstanceStatus status) {
-			fix.accept(status);
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel/.settings b/org.fortiss.tooling.kernel/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.kernel/.settings
+++ b/org.fortiss.tooling.kernel/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/.ratings
index 0a98fb5c57e6ec70b3853c8145ec72ebe32eb99e..b2f23c1f28fd6be6f4cd785dfbd17d06d59c5604 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/.ratings
@@ -6,7 +6,7 @@ IEclipseResourceStorageLocationProvider.java 0ab7f304d52a9d86f01f66e308e9a7ca420
 IElementCompositor.java 5b0ab1732f71b3f8467e0276c844f0dd549e191f GREEN
 ILibraryElementHandler.java 00ef5b25c63b8570006e6f6748aed0da1f33a5f1 GREEN
 ILogMessageHandler.java 9ab53e836a095ef00fd84ecc0375167edf593b46 GREEN
-IMigrationProvider.java fdb1078dfca10a82a18f79b862d7b8644e80e14e GREEN
+IMigrationProvider.java 241bfd8594dfb86ce0f89dc95b43662f52d9e450 GREEN
 IPrototypeProvider.java d5e3dbae19b5654caf28b81da6b1609d3c12be12 GREEN
 IStorageProvider.java d9b14cdd254d0c956dc5715c1c4d4d955a705dd5 GREEN
 ITransformationProvider.java a4ee2ea08720bb2fce29806062eb01499bb5071e GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IConstraint.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IConstraint.java
deleted file mode 100644
index e5e95efa8b06b30d6feffd9a2033e5caa3e710e9..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IConstraint.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2015 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.extension;
-
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-
-/**
- * Interface for constraints as required by {@link IConstraintService}.
- */
-public interface IConstraint {
-
-	/** Verify the given constraint instance. */
-	IConstraintInstanceStatus verify(ConstraintInstance ci);
-
-	/**
-	 * Hook to preprocess <code>cstrd</code> before computing its checksum. Typically useful to
-	 * remove items which should not be considered when computing the checksum, e.g., layout
-	 * information.
-	 */
-	void preprocessBeforeChecksum(IConstrained cstrd);
-
-	/** Cancels the last verification of <code>ci</code>. */
-	void cancel(ConstraintInstance ci);
-
-	/**
-	 * Adds a constraint instance to the provided element.
-	 * 
-	 * Subclasses shall return <code>null</code> if the provided element should not be constrained
-	 * (whatever is the reason: the constraint is only judge here).
-	 */
-	ConstraintInstance addConstraintInstanceIfNeeded(IConstrained cstrd);
-
-	/**
-	 * @return The name of the Group. This method will be implemented in all of the classes that
-	 *         implements this interface
-	 */
-	String getGroup();
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IMigrationProvider.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IMigrationProvider.java
index fdb1078dfca10a82a18f79b862d7b8644e80e14e..241bfd8594dfb86ce0f89dc95b43662f52d9e450 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IMigrationProvider.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/IMigrationProvider.java
@@ -45,12 +45,12 @@ public interface IMigrationProvider extends IObjectAware<ITopLevelElement> {
 	/**
 	 * Applies the provider to the given element.
 	 * 
-	 * The parameter "unknownFeatures" returns a map indicating the features that are not recognized
+	 * The parameter "unknownFeatures" indicates the features that are not recognized
 	 * in the model. This can be useful to detect features coming from old models and can be then
 	 * translated to the new model by a migrator.
 	 * 
-	 * The migrator should remove from unknownFeatures the features that it dealt with.
-	 * If one forgets to do so, the migrator will run into an infinite loop!
+	 * @return all unknown features that have successfully been migrated.
 	 */
-	void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures);
+	Map<EObject, AnyType> migrate(ITopLevelElement modelElement,
+			Map<EObject, AnyType> unknownFeatures);
 }
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/ConstraintBases.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/ConstraintBases.java
deleted file mode 100644
index 93b4743cc1f5e2677635e644663ba934ef7f7f4e..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/ConstraintBases.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2016 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.extension.base;
-
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.createConstraintInstance;
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.createOutdatedStatus;
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.getConstrained;
-import static org.fortiss.tooling.kernel.utils.ConstraintsUtils.getConstraintInstanceOfType;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-
-/**
- * Base for {@link IConstraint}.
- * 
- * @author aravantinos
- */
-public class ConstraintBases {
-	/** Most generic base. */
-	public abstract static class ConstraintBase implements IConstraint {
-
-		/** Returns the constraint instance container in the context of the given object. */
-		abstract public IConstraintInstanceContainer getConstraintInstanceContainer(EObject obj);
-
-		/** {@inheritDoc} */
-		@Override
-		public void preprocessBeforeChecksum(IConstrained cstrd) {
-			cstrd.getConstraintInstances().clear();
-			cstrd.getChecksumsPerConstraintName().clear();
-			// By default, we remove all the constraint-related information.
-			TreeIterator<EObject> it = cstrd.eAllContents();
-			List<EMap<String, BigInteger>> toClears = new ArrayList<>();
-			while(it.hasNext()) {
-				EObject obj = it.next();
-				if(obj instanceof IConstrained) {
-					((IConstrained)obj).getConstraintInstances().clear();
-					toClears.add(((IConstrained)obj).getChecksumsPerConstraintName());
-				}
-			}
-			toClears.stream().forEach(toClear -> toClear.clear());
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public void cancel(ConstraintInstance ci) {
-			// By default - and generally - nothing to do. Not all constraints are so heavy that
-			// they deserve to have a cancellation procedure.
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public ConstraintInstance addConstraintInstanceIfNeeded(IConstrained constrained) {
-			if(getConstraintInstanceOfType(constrained, this) != null) {
-				return null;
-			}
-			ConstraintInstance ci = createConstraintInstanceIfNeeded(constrained);
-			if(ci != null) {
-				createOutdatedStatus(ci);
-			}
-			if(ci != null) {
-				IConstraintInstanceContainer ciContainer =
-						getConstraintInstanceContainer(constrained);
-				ciContainer.getConstraintInstances().add(ci);
-			}
-			return ci;
-		}
-
-		/**
-		 * Creates and return a constraint instance on the provided element.
-		 * 
-		 * Subclasses shall return <code>null</code> if the provided element should not be
-		 * constrained (whatever is the reason: the constraint is only judge here).
-		 */
-		public abstract ConstraintInstance
-				createConstraintInstanceIfNeeded(IConstrained constrained);
-	}
-
-	/**
-	 * Base for a constraint which is as close as possible to the old constraint system:
-	 * - the constrained element contains all the information necessary for the constraint
-	 * (nothing stored in the constraint instance)
-	 * - only one element is constrained
-	 */
-	public static abstract class ConstraintCheckerBase extends ConstraintBase {
-		/** {@inheritDoc} */
-		@Override
-		public IConstraintInstanceStatus verify(ConstraintInstance ci) {
-			IConstrained constrained = getConstrained(ci);
-			return isApplicable(constrained) ? verify(constrained) : null;
-		}
-
-		/** Verify the given constrained element. */
-		public abstract IConstraintInstanceStatus verify(IConstrained constrained);
-
-		/** Determines whether this constraint is applicable to the given model element. */
-		public abstract boolean isApplicable(IConstrained constrained);
-
-		/** {@inheritDoc} */
-		@Override
-		public ConstraintInstance addConstraintInstanceIfNeeded(IConstrained constrained) {
-			return isApplicable(constrained) ? super.addConstraintInstanceIfNeeded(constrained)
-					: null;
-		}
-
-		/** {@inheritDoc} */
-		@Override
-		public ConstraintInstance createConstraintInstanceIfNeeded(IConstrained constrained) {
-			return createConstraintInstance(this.getClass(), constrained);
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java
deleted file mode 100644
index 4a1b676223b7ec53259a26d1a671b11ff2f911e2..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/extension/base/RemoveDeprecatedArtifactsMigrationProviderBase.java
+++ /dev/null
@@ -1,95 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2018 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.extension.base;
-
-import static org.conqat.lib.commons.reflect.ReflectionUtils.isInstanceOfAny;
-import static org.eclipse.emf.ecore.util.EcoreUtil.delete;
-import static org.fortiss.tooling.common.util.LambdaUtils.asStream;
-
-import java.util.Collection;
-import java.util.Map;
-import java.util.Optional;
-import java.util.stream.Stream;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.xml.type.AnyType;
-import org.fortiss.tooling.kernel.extension.IMigrationProvider;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.model.INamedCommentedElement;
-
-/**
- * Remove artificats related to deprecated use case model.
- * 
- * @author barner
- */
-public abstract class RemoveDeprecatedArtifactsMigrationProviderBase implements IMigrationProvider { // NO_UCD
-	// Migrators are retired after a release, but this base class should be available when needed.
-	// See https://af3-developer.fortiss.org/projects/autofocus3/wiki/Model_Migration
-
-	/** Returns the {@link Collection} of deprecated artifact types to be removed from the model. */
-	protected abstract Collection<Class<? extends EObject>> getDeprecatedArtifacts();
-
-	/**
-	 * Returns the {@link Collection} of deprecated root artifact types (possibly empty subset of
-	 * {@link #getDeprecatedArtifacts()}) for which a comment is added to the migrated model that
-	 * deprecated artifacts have been removed.
-	 */
-	protected abstract Collection<Class<? extends EObject>> getDeprecatedRootArtifacts();
-
-	/** Returns the {@link Stream} of deprecated model elements to be removed. */
-	private Stream<EObject> getDeprecatedModelElements(ITopLevelElement modelElement) {
-		Stream<EObject> root = asStream(modelElement.getRootModelElement().eAllContents());
-		Collection<Class<? extends EObject>> deprArtifacts = getDeprecatedArtifacts();
-		return root.filter(
-				e -> isInstanceOfAny(e, deprArtifacts.toArray(new Class[deprArtifacts.size()])));
-	}
-
-	/** {@inheritDoc} */
-
-	@Override
-	public boolean needMigration(ITopLevelElement modelElement,
-			Map<EObject, AnyType> unknownFeatures) {
-
-		return getDeprecatedModelElements(modelElement).findAny().isPresent();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void migrate(ITopLevelElement modelElement, Map<EObject, AnyType> unknownFeatures) {
-		EObject object;
-		do {
-			object = null;
-			Stream<EObject> deprecatedModelElements = getDeprecatedModelElements(modelElement);
-			Optional<EObject> anyObject = deprecatedModelElements.findAny();
-			if(anyObject.isPresent()) {
-				object = anyObject.get();
-				if(object.eContainer() instanceof INamedCommentedElement) {
-					INamedCommentedElement parent = (INamedCommentedElement)object.eContainer();
-					if(parent.getComment() == null || parent.getComment().isEmpty()) {
-						for(Class<? extends EObject> rootType : getDeprecatedRootArtifacts()) {
-							if(rootType.isAssignableFrom(object.getClass())) {
-								parent.setComment(rootType.getSimpleName() +
-										" models are no longer supported. This sub-model has been removed automatically!");
-								break;
-							}
-						}
-					}
-				}
-				delete(object);
-			}
-		} while(object != null);
-	}
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/.ratings
index e6e117aec42749c55a27ff79b3607f3b914272f7..95a442ad4aea705c31e35a4f2b5c4016bc201a16 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/.ratings
@@ -1,15 +1,14 @@
 CommandStackService.java 957bda69b5feb91f002aed4d25ed334e92801e7e GREEN
 ConnectionCompositorService.java d69a60cd7a3d06e91d24fd32b9c00125ea71e0dd GREEN
 ConstraintCheckerService.java 459b5eb717598e7e8bb71a0c87e57ea85cb00e4b GREEN
-ConstraintService.java 139187909523300c80a22be920329f1c9d0fb654 GREEN
 DummyTopLevelElement.java 8394597464707992cd053e68129bb87ce9f696db GREEN
 ElementCompositorService.java 98c5d27e09881e60aa4f87c1ac0c7787cdec9f7c GREEN
 LibraryPrototypeProvider.java b77eddbdca78f561ffb1233e98817be361c690ae GREEN
 LibraryService.java d22671ba820466062852c15873698adf28960d94 GREEN
 LoggingService.java da784259f7b456b54bf75c41ec268f64919ce78d GREEN
-MigrationService.java 632c13563a3d69681e2a608023fcdadbe5340c4b GREEN
+MigrationService.java 2f800eac9793aa736089a802bbfc2c4c1c09770d GREEN
 PersistencyService.java 103eef642c038ef63fa49b743d803aaa3fea2724 GREEN
 PrototypeService.java 18c3db05ab11f189a9711bf241c3c7f35c954a9e GREEN
-ToolingKernelInternal.java d624a5f6b237ce993e150e2b8d1b4390e3fc8f7a GREEN
+ToolingKernelInternal.java f6e7114825748683c7f1d040b41ab854a6c4d79b GREEN
 TransformationService.java 3cdb86fe920158f93cd9466c6ef9697b2dd8ca7f GREEN
 TutorialService.java 675d3f365ce062869f86baa3779d50687674bda0 GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ConstraintService.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ConstraintService.java
deleted file mode 100644
index 139187909523300c80a22be920329f1c9d0fb654..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ConstraintService.java
+++ /dev/null
@@ -1,350 +0,0 @@
-package org.fortiss.tooling.kernel.internal;
-
-import static java.util.Collections.emptyList;
-import static org.eclipse.emf.ecore.xmi.XMLResource.OPTION_PROCESS_DANGLING_HREF;
-import static org.eclipse.emf.ecore.xmi.XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD;
-import static org.fortiss.tooling.kernel.utils.EcoreUtils.copy;
-import static org.fortiss.tooling.kernel.utils.LoggingUtils.warning;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileOutputStream;
-import java.io.ObjectOutputStream;
-import java.lang.reflect.InvocationTargetException;
-import java.math.BigInteger;
-import java.security.MessageDigest;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EMap;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-import org.fortiss.tooling.kernel.ToolingKernelActivator;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.introspection.IIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.introspection.IIntrospectionItem;
-import org.fortiss.tooling.kernel.introspection.IIntrospectiveKernelService;
-import org.fortiss.tooling.kernel.introspection.items.ConstraintVerificationServiceIntrospectionDetailsItem;
-import org.fortiss.tooling.kernel.model.INamedElement;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-import org.fortiss.tooling.kernel.service.IKernelIntrospectionSystemService;
-import org.fortiss.tooling.kernel.service.IPersistencyService;
-
-/**
- * Implementation of {@link IConstraintService}.
- * 
- * @author aravantinos
- */
-public final class ConstraintService implements IIntrospectiveKernelService, IConstraintService {
-
-	/** The singleton instance. */
-	private static final ConstraintService INSTANCE = new ConstraintService();
-
-	/** Stores the set of registered constraint classes by name. */
-	protected final Map<String, Class<? extends IConstraint>> handlerMap =
-			new HashMap<String, Class<? extends IConstraint>>();
-
-	/** Stores the set of registered constraints classes instantiations. */
-	protected final Map<Class<? extends IConstraint>, IConstraint> instanceMap =
-			new HashMap<Class<? extends IConstraint>, IConstraint>();
-
-	/** Returns singleton instance of the service. */
-	public static ConstraintService getInstance() {
-		return INSTANCE;
-	}
-
-	/** Starts the service. */
-	public void startService() {
-		IKernelIntrospectionSystemService.getInstance().registerService(this);
-	}
-
-	/** Initializes the service by setting up the handler map. */
-	public void initializeService() {
-		// nothing to do here
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void registerConstraint(Class<? extends IConstraint> cstrClass) {
-		String name = cstrClass.getName();
-		Class<? extends IConstraint> existingCstr = handlerMap.get(name);
-		if(existingCstr != null) {
-			warning(ToolingKernelActivator.getDefault(),
-					"Encountered more than one registered constraint with name " + name);
-		}
-		handlerMap.put(name, cstrClass);
-		try {
-			instanceMap.put(cstrClass, cstrClass.getConstructor().newInstance());
-		} catch(InstantiationException | IllegalAccessException | IllegalArgumentException |
-				InvocationTargetException | NoSuchMethodException | SecurityException e) {
-			warning(ToolingKernelActivator.getDefault(),
-					"Instanciation of " + cstrClass.getName() + " threw an exception.");
-		}
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getIntrospectionDescription() {
-		return getIntrospectionLabel() + "\n\nThe service deals with constraints over AF3 models." +
-				"\nA constraint is a function over a model element (the \"constrained\" element) which returns true or false." +
-				"\nThe application of a constraint to a given model element is called a \"constraint instance\"." +
-				"\nContrarily to usual constraint systems, constraint instances are a first-class citizen for this service" +
-				"\nbecause it allows us to store the status of the constraint on the given element as well as the checksum of the constrained element." +
-				"\n\nThe service provides the following:" +
-				"\n- verification of a constraint instance," +
-				"\n- cancellation of a constraint instance verification (if provided by the relevant verifier)," +
-				"\n- check whether a constraint instance is up to date," +
-				"\n- provide a list of possible \"quick fixes\" for a given constraint instance in case it failed," +
-				"\n- complete a given project with instances of a given constraint if necessary" +
-				"\n  (it is however advised to use instead, if possible, the equivalent function of the UI service which also installs" +
-				"\n  the added constraint instances)." +
-				"\n\nThis service is fed with classes of type IConstraint." +
-				"\nSuch classes are responsible of the verification of constraints which return a status of the following form:" +
-				"\n- SUCCESS means the verification succeeded" +
-				"\n- FAIL means the verification failed" +
-				"\n- ERROR means the verification could not be run (typically because an error happened)" +
-				"\n- OUTDATED means the constrained items have changed and the constraint instance should be verified. " +
-				"\n- null if it is irrelevant to check the constraint - whatever is the reason. " +
-				"\nDo not hesitate to extend these statuses to define your own," +
-				"\nfor instance to provide more information about failure (thus possibly allowing automatic fixes)." +
-				"\n\nThe class org.fortiss.af3.project.utils.ConstraintsProjectUtils.AF3ProjectConstraintCheckerBase should" +
-				"\ngenerally provide a sufficient initial implementation." +
-				"\n\nSee the developer wiki page \"Add a new constraint on a metamodel\"" +
-				" for detailed documentation on developing a new sort of constraint.";
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void verify(ConstraintInstance ci) {
-		IConstraint verifier = getConstraint(ci);
-		if(verifier != null) {
-			ITopLevelElement modelContext =
-					IPersistencyService.getInstance().getTopLevelElementFor(ci);
-			// It can happen that <code>modelContext</code> is null, e.g., if the verification is
-			// triggered while the constraint is actually being removed.
-			if(modelContext == null) {
-				return;
-			}
-			modelContext.runAsCommand(() -> {
-				// We update the checksums before verification to avoid detecting some fake changes
-				// during the verification.
-				updateChecksums(ci);
-				IConstraintInstanceStatus status = verifier.verify(ci);
-				ci.setStatus(status);
-				// And we also update the checksums after in case the verification had some side
-				// effects...
-				updateChecksums(ci);
-				currentlyUpdating.remove(ci);
-			});
-		}
-	}
-
-	/** Returns the short name of the constraint of the given instance. */
-	private String cstrShortName(ConstraintInstance ci) {
-		int dolIndex = ci.getConstraintName().lastIndexOf('$');
-		int dotIndex = ci.getConstraintName().lastIndexOf('.');
-		return ci.getConstraintName().substring(Math.max(dotIndex, dolIndex) + 1);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean isUpToDate(ConstraintInstance ci) {
-		if(ci == null) {
-			// silently return in case of a null constraint instance
-			return true;
-		}
-		for(IConstrained c : ci.getConstraineds()) {
-			BigInteger computeCheckSum = computeCheckSum(c, ci);
-			EMap<String, BigInteger> checksumMap = c.getChecksumsPerConstraintName();
-			BigInteger storedChecksum = checksumMap.get(ci.getConstraintName());
-			if(computeCheckSum == null || !computeCheckSum.equals(storedChecksum)) {
-				return false;
-			}
-		}
-		return true;
-	}
-
-	/** Updates all the checksums of <code>ci</code>. */
-	private void updateChecksums(ConstraintInstance ci) {
-		for(IConstrained c : ci.getConstraineds()) {
-			c.getChecksumsPerConstraintName().put(ci.getConstraintName(), computeCheckSum(c, ci));
-		}
-	}
-
-	/**
-	 * Path to a directory where to store the constrained elements which are actually checksummed.
-	 * This is useful since it is essential to control very precisely how checksums are computed.
-	 * If equal to the empty string, debug is deactivated.
-	 * This string should however only be set to a non-empty string on a local machine, never
-	 * committed!
-	 */
-	private static final String DEBUG_FOLDER = null;
-
-	/** Number used to annotate the traces when debugging is active. */
-	private int debug_trace_number = 0;
-
-	/**
-	 * Returns the checksum of <code>constrained</code>. Note that <code>ci</code> is necessary
-	 * because it has a potential impact on what is relevant for the checksum or not.
-	 */
-	protected BigInteger computeCheckSum(IConstrained constrained, ConstraintInstance ci) {
-		if(constrained == null) {
-			return null;
-		}
-		ByteArrayOutputStream baos = new ByteArrayOutputStream();
-		final EObject hashRelevant = getChecksumRelevantEObject(constrained, ci);
-		try(ObjectOutputStream oos = new ObjectOutputStream(baos)) {
-			final ResourceSet rset = new ResourceSetImpl();
-
-			Resource resource = rset.createResource(URI.createURI("temp"));
-			resource.getContents().add(hashRelevant);
-			Map<String, String> options = new HashMap<>();
-
-			// The option below is to allow computing the hashsum of an incomplete ecore sub-model,
-			// which is wanted in case parts of the model which are not checksum relevant are still
-			// referred to.
-			options.put(OPTION_PROCESS_DANGLING_HREF, OPTION_PROCESS_DANGLING_HREF_DISCARD);
-
-			resource.save(oos, options);
-			MessageDigest m = MessageDigest.getInstance("SHA1");
-			m.update(baos.toByteArray());
-			BigInteger res = new BigInteger(1, m.digest());
-			if(DEBUG_FOLDER != null) {
-				String filePrefix = DEBUG_FOLDER + "/trace" + debug_trace_number++;
-				String nameCstr = cstrShortName(ci);
-				String nameCstrd = constrained instanceof INamedElement
-						? ((INamedElement)constrained).getName() : constrained.toString();
-				String fileName = filePrefix + "_" + nameCstr + "_" + nameCstrd + ".xml";
-				try(FileOutputStream file = new FileOutputStream(fileName);
-						ObjectOutputStream oos2 = new ObjectOutputStream(file)) {
-					resource.save(oos2, options);
-					oos2.writeUTF("\nCHECKSUM: " + res.toString());
-				}
-			}
-			resource.getContents().remove(hashRelevant);
-			resource.delete(options);
-			return res;
-		} catch(Exception e) {
-			e.printStackTrace();
-			return null;
-		}
-	}
-
-	/**
-	 * Returns the object to be used to compute the checksum.
-	 * Generally, all statuses and checksums are removed. Each constraint can also provide
-	 * specific adaptations.
-	 */
-	protected EObject getChecksumRelevantEObject(IConstrained constrained, ConstraintInstance ci) {
-		IConstrained res = copy(constrained);
-		res.getChecksumsPerConstraintName().clear();
-		IConstraint verifier = getConstraint(ci);
-		if(verifier != null) {
-			verifier.preprocessBeforeChecksum(res);
-		}
-		return res;
-	}
-
-	/** @return The registered constraint whose <code>ci</code> is a constraint instance of. */
-	protected IConstraint getConstraint(ConstraintInstance ci) {
-		return instanceMap.get(handlerMap.get(ci.getConstraintName()));
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void cancel(ConstraintInstance ci) {
-		getConstraint(ci).cancel(ci);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getIntrospectionLabel() {
-		return "Constraint Service";
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public IIntrospectionDetailsItem getDetailsItem() {
-		return new ConstraintVerificationServiceIntrospectionDetailsItem(instanceMap.values());
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean showInIntrospectionNavigation() {
-		return true;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Collection<IIntrospectionItem> getIntrospectionItems() {
-		return emptyList();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public List<ConstraintInstance> addMissingConstraintsInstances(ITopLevelElement top,
-			Class<? extends IConstraint> cstrClass) {
-		List<ConstraintInstance> addedConstraints = new ArrayList<ConstraintInstance>();
-		IConstraint cstr = instanceMap.get(cstrClass);
-		TreeIterator<EObject> it = top.getRootModelElement().eAllContents();
-		while(it.hasNext()) {
-			EObject elt = it.next();
-			if(elt instanceof IConstrained) {
-				ConstraintInstance ci = cstr.addConstraintInstanceIfNeeded((IConstrained)elt);
-				if(ci != null) {
-					addedConstraints.add(ci);
-				}
-			}
-		}
-		return addedConstraints;
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getName(Class<? extends IConstraint> cstrClass) {
-		return cstrClass.getName();
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public Class<? extends IConstraint> getConstraintByName(String name) {
-		return handlerMap.get(name);
-	}
-
-	/**
-	 * List of constraint instances being currently updated, to prevent triggering twice an update
-	 * which is already on its way.
-	 */
-	List<ConstraintInstance> currentlyUpdating = new ArrayList<>();
-
-	/** {@inheritDoc} */
-	@Override
-	public boolean isUpdating(ConstraintInstance ci) {
-		return currentlyUpdating.contains(ci);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public void markAsUpdating(ConstraintInstance ci) {
-		currentlyUpdating.add(ci);
-	}
-
-	/** {@inheritDoc} */
-	@Override
-	public String getGroupName(Class<? extends IConstraint> cstrClass) {
-		if(instanceMap.get(cstrClass).getGroup() != null) {
-			return instanceMap.get(cstrClass).getGroup().trim().toString();
-		}
-		return "";
-	}
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/MigrationService.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/MigrationService.java
index 632c13563a3d69681e2a608023fcdadbe5340c4b..2f800eac9793aa736089a802bbfc2c4c1c09770d 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/MigrationService.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/MigrationService.java
@@ -16,18 +16,21 @@
 package org.fortiss.tooling.kernel.internal;
 
 import static java.util.Collections.emptyList;
+import static java.util.stream.Collectors.joining;
+import static java.util.stream.Collectors.toSet;
 import static org.fortiss.tooling.kernel.utils.EcoreUtils.getFirstChildWithType;
 import static org.fortiss.tooling.kernel.utils.LoggingUtils.error;
+import static org.fortiss.tooling.kernel.utils.LoggingUtils.warning;
 
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.stream.Stream;
 
 import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.util.BasicEList;
 import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.util.FeatureMap;
 import org.eclipse.emf.ecore.xml.type.AnyType;
 import org.fortiss.tooling.kernel.ToolingKernelActivator;
 import org.fortiss.tooling.kernel.extension.IMigrationProvider;
@@ -97,19 +100,6 @@ public class MigrationService extends ObjectAwareServiceBase<IMigrationProvider>
 		return false;
 	}
 
-	/** Extracts the list of feature names from a map of features. */
-	private List<String> featuresToStrings(Map<EObject, AnyType> features) {
-		List<String> res = new BasicEList<String>();
-		for(AnyType featuresPerKey : features.values()) {
-			FeatureMap actualFeatures = featuresPerKey.getMixed();
-			actualFeatures.addAll(featuresPerKey.getAnyAttribute());
-			for(FeatureMap.Entry feature : actualFeatures) {
-				res.add(feature.getEStructuralFeature().getName());
-			}
-		}
-		return res;
-	}
-
 	/** {@inheritDoc} */
 	@Override
 	public void migrate(final ITopLevelElement input, final Map<EObject, AnyType> unknownFeatures) {
@@ -117,17 +107,12 @@ public class MigrationService extends ObjectAwareServiceBase<IMigrationProvider>
 
 			@Override
 			public void run() {
+				Map<EObject, AnyType> migratedFeatures = new HashMap<EObject, AnyType>();
 				for(IMigrationProvider provider : getProviders(input)) {
 					if(provider.needMigration(input, unknownFeatures)) {
-						provider.migrate(input, unknownFeatures);
+						migratedFeatures.putAll(provider.migrate(input, unknownFeatures));
 					}
 				}
-				if(!unknownFeatures.isEmpty()) {
-					error(ToolingKernelActivator.getDefault(),
-							input.getSaveableName() + " contains one or more unknown feature(s): " +
-									featuresToStrings(unknownFeatures));
-				}
-
 				for(IMigrationProvider provider : getProviders(input)) {
 					if(provider.needMigration(input, unknownFeatures)) {
 						error(ToolingKernelActivator.getDefault(),
@@ -136,6 +121,19 @@ public class MigrationService extends ObjectAwareServiceBase<IMigrationProvider>
 										"already performed. Please fix the migrator (or model).");
 					}
 				}
+				unknownFeatures.entrySet().removeAll(migratedFeatures.entrySet());
+				if(!unknownFeatures.isEmpty()) {
+					Stream<AnyType> anyTypes = unknownFeatures.values().stream()
+							.map(v -> v.getMixed()).flatMap(f -> f.stream()).map(e -> e.getValue())
+							.filter(AnyType.class::isInstance).map(AnyType.class::cast);
+					String removedTypes = anyTypes.map(a -> a.eClass().getName()).collect(toSet())
+							.stream().collect(joining(", "));
+					warning(ToolingKernelActivator.getDefault(), input.getSaveableName() +
+							" contains one or more feature(s) of the following unkown types that will be deleted: " +
+							removedTypes + ".");
+
+					unknownFeatures.clear();
+				}
 			}
 		});
 
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ToolingKernelInternal.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ToolingKernelInternal.java
index d624a5f6b237ce993e150e2b8d1b4390e3fc8f7a..f6e7114825748683c7f1d040b41ab854a6c4d79b 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ToolingKernelInternal.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/ToolingKernelInternal.java
@@ -35,7 +35,6 @@ public final class ToolingKernelInternal {
 		CommandStackService.getInstance().initializeService();
 		ConnectionCompositorService.getInstance().initializeService();
 		ConstraintCheckerService.getInstance().initializeService();
-		ConstraintService.getInstance().initializeService();
 		ElementCompositorService.getInstance().initializeService();
 		MigrationService.getInstance().initializeService();
 		LibraryService.getInstance().initializeService();
@@ -56,7 +55,6 @@ public final class ToolingKernelInternal {
 		CommandStackService.getInstance().startService();
 		ConnectionCompositorService.getInstance().startService();
 		ConstraintCheckerService.getInstance().startService();
-		ConstraintService.getInstance().startService();
 		ElementCompositorService.getInstance().startService();
 		MigrationService.getInstance().startService();
 		LibraryService.getInstance().startService();
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings
index 4a4edee0b9b29c4f7e79c5026854886346e3d02a..605b741d853bf1e95bbf06c68ab9a477dea3beb5 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/.ratings
@@ -1,5 +1,5 @@
 AutoUndoCommandStack.java fc326adf66c6cea2354884cdc240da5f2f82689a GREEN
 EMFTransactionalCommand.java ba4b5bead9768b6ce6c955b9238cd96cb722533c GREEN
 EclipseResourceStorageService.java e29e32272286921c5e43963253902b3ba54490c7 GREEN
-ModelContext.java 55de5f19c5d625f935fb8136ff72d80b3a54ff19 GREEN
+ModelContext.java db1735834c85e7b508266f56463d011f2b72af0e GREEN
 NonDirtyingEMFTransactionalCommand.java d288ebe35d22442c603496b0c917fb99a8febeea GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java
index 55de5f19c5d625f935fb8136ff72d80b3a54ff19..db1735834c85e7b508266f56463d011f2b72af0e 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/internal/storage/eclipse/ModelContext.java
@@ -330,7 +330,9 @@ class ModelContext implements ITopLevelElement, CommandStackListener {
 
 		// Step 3..n: Save resources not managed by kernel
 		for(Resource currentResource : rset.getResources()) {
-			if(currentResource != resource && !editingDomain.isReadOnly(currentResource)) {
+			if(currentResource != resource && !editingDomain.isReadOnly(currentResource) &&
+					!currentResource.getContents().isEmpty()) {
+				// do not save resources which are not contained (by a FileProject)
 				try {
 					currentResource.save(saveOptions);
 				} catch(IOException e) {
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/IConstraintService.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/IConstraintService.java
deleted file mode 100644
index d55c3e25b8cef7e2f7c555adec7ff31e28449370..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/IConstraintService.java
+++ /dev/null
@@ -1,80 +0,0 @@
-package org.fortiss.tooling.kernel.service;
-
-import java.util.List;
-
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
-import org.fortiss.tooling.kernel.internal.ConstraintService;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-
-/**
- * The verification service allows to register constraints. See KISS documentation for more details.
- */
-public interface IConstraintService {
-
-	/** Returns the service instance. */
-	public static IConstraintService getInstance() {
-		return ConstraintService.getInstance();
-	}
-
-	/**
-	 * Verifies the constraint instance <code>ci</code>. The service always runs the verification
-	 * in a command. Should not yield any "useless" change because verification should always update
-	 * the constraint instance status and the checksums anyways.
-	 */
-	void verify(ConstraintInstance ci);
-
-	/**
-	 * Tries to cancel the last verification of the constraint instance <code>ci</code>. The actual
-	 * actions to take upon cancellation are up to the constraint.
-	 */
-	void cancel(ConstraintInstance ci);
-
-	/**
-	 * @return <code>true</code> if the constraint instance <code>ci</code> is up to date.
-	 *         This does not just look at the status but computes a diff between the constrained
-	 *         element and the one for which the constraint instance was last time checked. In the
-	 *         standard case, it is enough to call IConstraintVerificationUIService.getStatus and
-	 *         see if the result is an instance of {@link OutdatedConstraintInstanceStatus}. You
-	 *         should use <code>isUpToDate</code> *only if
-	 *         IConstraintVerificationUIService.getStatus does not provide the information you
-	 *         want*.
-	 */
-	boolean isUpToDate(ConstraintInstance ci);
-
-	/**
-	 * Completes <code>top</code> with missing constraints instances of constraint handled by
-	 * <code>cstrClass</code>, if applicable.
-	 * 
-	 * @return List of added constraints instances.
-	 * 
-	 */
-	List<ConstraintInstance> addMissingConstraintsInstances(ITopLevelElement top,
-			Class<? extends IConstraint> cstrClass);
-
-	/** Returns the name of the given constraint, usable for serialization. */
-	public String getName(Class<? extends IConstraint> cstrClass);
-
-	/**
-	 * @param cstrClass
-	 * @return name of the group that a particular constraint belong to
-	 */
-	public String getGroupName(Class<? extends IConstraint> cstrClass);
-
-	/** Returns a constraint, given its name. */
-	public Class<? extends IConstraint> getConstraintByName(String name);
-
-	/** Registers the given verifier with the service. */
-	void registerConstraint(Class<? extends IConstraint> cstrClass);
-
-	/** <code>true</code> if the given instance is queued for update. */
-	boolean isUpdating(ConstraintInstance ci);
-
-	/**
-	 * Marks the given instance as being queued for update.
-	 * 
-	 * ONLY FOR INTERNAL USE.
-	 */
-	void markAsUpdating(ConstraintInstance ci);
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
index d85861e2edafbeb32da7cbcff68cc64ad45f8ba9..8fb040ffbf08c91fe3c8dea473975346c23c28b3 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/.ratings
@@ -1,5 +1,4 @@
 CompositionUtils.java 34c0a191bd0fb4176c94b4d61abb5c88a679d5e8 GREEN
-ConstraintsUtils.java 0f8be020f2ca4bb08931c32452163c04a28e30ce GREEN
 EMFResourceUtils.java 979d0e1f4f66a2b3e715d2da0ebef6493f547fd7 GREEN
 EcoreSerializerBase.java 0a0c2969d793d2e68094c55c8f7b0a662ef6e5d5 GREEN
 EcoreUtils.java 18416b5c214410a02eb35596fd807a1cc27d6b35 GREEN
@@ -10,6 +9,6 @@ JavaUtils.java 65cdadfb9137a240ad59992eacf53a15b7f20804 GREEN
 KernelModelElementUtils.java fded09befe7e543fc04ea5184ffc1c8a309d7a66 GREEN
 LoggingUtils.java 0e0aa5d466d80ea29cfc7e91178b23a5cdd4ddf7 GREEN
 PrototypesUtils.java ec75bed75cfc5103f1f38e3a29df86f729428775 GREEN
-ResourceUtils.java 698c7db34acb4f1a258a1953e6afcca9823763a8 GREEN
+ResourceUtils.java 7f4941a83115dfbed75eb58b79c0a372fe1cbb94 GREEN
 TransformationUtils.java 552d3a9d56d34450be781af828efe0b8aa5d359e GREEN
 UniqueIDUtils.java 665955b1790c1bd1c2087e23114da920bfec2265 GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ConstraintsUtils.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ConstraintsUtils.java
deleted file mode 100644
index 0f8be020f2ca4bb08931c32452163c04a28e30ce..0000000000000000000000000000000000000000
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ConstraintsUtils.java
+++ /dev/null
@@ -1,224 +0,0 @@
-/*-------------------------------------------------------------------------+
-| Copyright 2011 fortiss GmbH                                              |
-|                                                                          |
-| Licensed under the Apache License, Version 2.0 (the "License");          |
-| you may not use this file except in compliance with the License.         |
-| You may obtain a copy of the License at                                  |
-|                                                                          |
-|    http://www.apache.org/licenses/LICENSE-2.0                            |
-|                                                                          |
-| Unless required by applicable law or agreed to in writing, software      |
-| distributed under the License is distributed on an "AS IS" BASIS,        |
-| WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
-| See the License for the specific language governing permissions and      |
-| limitations under the License.                                           |
-+--------------------------------------------------------------------------*/
-package org.fortiss.tooling.kernel.utils;
-
-import java.util.NoSuchElementException;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.fortiss.tooling.kernel.extension.IConstraint;
-import org.fortiss.tooling.kernel.model.IIdLabeled;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintInstance;
-import org.fortiss.tooling.kernel.model.constraints.ConstraintsFactory;
-import org.fortiss.tooling.kernel.model.constraints.ErrorConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.FailedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.IConstrained;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceContainer;
-import org.fortiss.tooling.kernel.model.constraints.IConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.OutdatedConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.model.constraints.SuccessConstraintInstanceStatus;
-import org.fortiss.tooling.kernel.service.IConstraintService;
-
-/**
- * Utility methods for dealing with constraints.
- * 
- * @author aravantinos
- */
-public class ConstraintsUtils {
-
-	/**
-	 * Returns the container of <code>ci</code>. Assumes that it is of type
-	 * {@link IConstraintInstanceContainer}!
-	 */
-	public static IConstraintInstanceContainer
-			getConstraintInstanceContainer(ConstraintInstance ci) {
-		return (IConstraintInstanceContainer)ci.eContainer();
-	}
-
-	/**
-	 * Defines <code>constrained</code> as the <code>i</code>-th constrained model element of
-	 * <code>ci</code>. Leaves the other elements as they are if they exist, fill them with
-	 * <code>constrained</code> till <code>i</code> otherwise (we cannot set to <code>null</code>).
-	 */
-	public static void setConstrainedElement(ConstraintInstance ci, IConstrained constrained,
-			int i) {
-		EList<IConstrained> constraineds = ci.getConstraineds();
-		for(int j = constraineds.size(); j <= i; j++) {
-			constraineds.add(j, constrained);
-		}
-		if(!constrained.getConstraintInstances().contains(ci)) {
-			constrained.getConstraintInstances().add(ci);
-		}
-	}
-
-	/** @return the first constraint instance of type <code>cstr</code> in <code>c</code>. */
-	public static ConstraintInstance getConstraintInstanceOfType(IConstrained c, IConstraint cstr) {
-		return getConstraintInstanceOfType(c, cstr.getClass());
-	}
-
-	/** @return the first constraint instance of type <code>cstr</code> in <code>c</code>. */
-	public static ConstraintInstance getConstraintInstanceOfType(IConstrained c,
-			Class<? extends IConstraint> cstrClass) {
-		try {
-			String name = cstrClass.getName();
-			return c.getConstraintInstances().stream()
-					.filter(x -> name.equals(x.getConstraintName())).findFirst().get();
-		} catch(NoSuchElementException e) {
-			return null;
-		}
-	}
-
-	/** Exception which embeds a constraint error status. */
-	public static class ErrorEmbeddingException extends RuntimeException {
-
-		/** The embedded error. */
-		public ErrorConstraintInstanceStatus error;
-
-		/** Constructor. */
-		public ErrorEmbeddingException(ErrorConstraintInstanceStatus error) {
-			super();
-			this.error = error;
-		}
-	}
-
-	/** @return A "success" status. */
-	public static SuccessConstraintInstanceStatus createSuccessStatus() {
-		return ConstraintsFactory.eINSTANCE.createSuccessConstraintInstanceStatus();
-	}
-
-	/** @return A "outdated" status for <code>ci</code>. */
-	public static OutdatedConstraintInstanceStatus createOutdatedStatus(ConstraintInstance ci) {
-		OutdatedConstraintInstanceStatus status;
-		if(ci.getStatus() instanceof OutdatedConstraintInstanceStatus) {
-			status = (OutdatedConstraintInstanceStatus)ci.getStatus();
-		} else {
-			status = ConstraintsFactory.eINSTANCE.createOutdatedConstraintInstanceStatus();
-			ci.setStatus(status);
-		}
-		return status;
-	}
-
-	/** @return A "outdated" status. */
-	public static OutdatedConstraintInstanceStatus createOutdatedStatus() {
-		return ConstraintsFactory.eINSTANCE.createOutdatedConstraintInstanceStatus();
-	}
-
-	/** @return A "fail" status. */
-	public static FailedConstraintInstanceStatus createFailStatus() {
-		return ConstraintsFactory.eINSTANCE.createFailedConstraintInstanceStatus();
-	}
-
-	/** @return An "error" status. */
-	public static ErrorConstraintInstanceStatus createErrorStatus() {
-		return ConstraintsFactory.eINSTANCE.createErrorConstraintInstanceStatus();
-	}
-
-	/** @return the first element constrained by <code>ci</code> */
-	public static IConstrained getFirstConstrained(ConstraintInstance ci) {
-		try {
-			// get(0) because the constraint instance shall contain at least one constrained element
-			// (responsibility of the caller!) and because we want the first element.
-			return ci.getConstraineds().get(0);
-		} catch(IndexOutOfBoundsException e) {
-			return null;
-		}
-	}
-
-	/** Sets the first constrained element of <code>ci</code> to <code>constrained</code>. */
-	public static void setFirstConstrained(ConstraintInstance ci, IConstrained constrained) {
-		setConstrainedElement(ci, constrained, 0);
-	}
-
-	/** @return the second element constrained by <code>ci</code> */
-	public static IConstrained getSecondConstrained(ConstraintInstance ci) {
-		try {
-			// get(1) because the constraint instance shall contain at least one constrained element
-			// (responsibility of the caller!) and because we want the first element.
-			return ci.getConstraineds().get(1);
-		} catch(IndexOutOfBoundsException e) {
-			return null;
-		}
-	}
-
-	/** Sets the second constrained element of <code>ci</code> to <code>constrained</code>. */
-	public static void setSecondConstrained(ConstraintInstance ci, IConstrained constrained) {
-		setConstrainedElement(ci, constrained, 1);
-	}
-
-	/**
-	 * @return the element constrained by <code>ci</code>.
-	 *         Use this function if your constraint constrains only one element!
-	 */
-	public static IConstrained getConstrained(ConstraintInstance ci) {
-		return getFirstConstrained(ci);
-	}
-
-	/**
-	 * Sets the constrained element of <code>ci</code> to <code>constrained</code>.
-	 * Use this function if your constraint constrains only one element!
-	 */
-	public static void setConstrained(ConstraintInstance ci, IConstrained constrained) {
-		setConstrainedElement(ci, constrained, 0);
-	}
-
-	/**
-	 * @return a constraint instance of type <code>cstrClass</code> constraining
-	 *         <code>constrained</code>
-	 */
-	public static ConstraintInstance createConstraintInstance(
-			Class<? extends IConstraint> cstrClass, IConstrained constrained) {
-		ConstraintInstance ci = ConstraintsFactory.eINSTANCE.createConstraintInstance();
-		ci.setConstraintName(cstrClass.getName());
-		setConstrained(ci, constrained);
-		createOutdatedStatus(ci);
-		return ci;
-	}
-
-	/**
-	 * @return a constraint instance of type <code>cstrClass</code> constraining
-	 *         <code>constrained1</code> and <code>constrained2</code>.
-	 */
-	public static ConstraintInstance createConstraintInstance(
-			Class<? extends IConstraint> cstrClass, IConstrained constrained1,
-			IConstrained constrained2) {
-		ConstraintInstance c = ConstraintsFactory.eINSTANCE.createConstraintInstance();
-		c.setConstraintName(IConstraintService.getInstance().getName(cstrClass));
-		setFirstConstrained(c, constrained1);
-		setSecondConstrained(c, constrained2);
-		createOutdatedStatus(c);
-		return c;
-	}
-
-	/** @return a successful status if <code>b</code> is true, a fail status otherwise */
-	static public IConstraintInstanceStatus successIfTrue(boolean b) {
-		return b ? createSuccessStatus() : createFailStatus();
-	}
-
-	/** Removes the IDs of the given object and of its sub-elements. */
-	public static void filterIDs(EObject obj) {
-		if(obj instanceof IIdLabeled) {
-			((IIdLabeled)obj).setId(0);
-		}
-		TreeIterator<EObject> it = obj.eAllContents();
-		while(it.hasNext()) {
-			EObject elt = it.next();
-			if(elt instanceof IIdLabeled) {
-				((IIdLabeled)elt).setId(0);
-			}
-		}
-	}
-}
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ResourceUtils.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ResourceUtils.java
index 698c7db34acb4f1a258a1953e6afcca9823763a8..7f4941a83115dfbed75eb58b79c0a372fe1cbb94 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ResourceUtils.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/ResourceUtils.java
@@ -51,6 +51,11 @@ import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceFactoryImpl;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
 import org.eclipse.emf.ecore.xmi.PackageNotFoundException;
+import org.eclipse.emf.ecore.xmi.XMLHelper;
+import org.eclipse.emf.ecore.xmi.XMLLoad;
+import org.eclipse.emf.ecore.xmi.XMLResource;
+import org.eclipse.emf.ecore.xmi.impl.SAXXMIHandler;
+import org.eclipse.emf.ecore.xmi.impl.XMILoadImpl;
 import org.eclipse.emf.ecore.xmi.impl.XMIResourceImpl;
 import org.eclipse.emf.ecore.xmi.impl.XMLResourceFactoryImpl;
 import org.eclipse.emf.ecore.xml.type.AnyType;
@@ -58,6 +63,7 @@ import org.fortiss.tooling.kernel.ToolingKernelActivator;
 import org.fortiss.tooling.kernel.extension.data.ITopLevelElement;
 import org.fortiss.tooling.kernel.model.IIdLabeled;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
+import org.xml.sax.helpers.DefaultHandler;
 
 /**
  * Utility class for dealing with EMF {@link Resource}s.
@@ -77,12 +83,79 @@ public final class ResourceUtils {
 	 */
 	public static class KernelResourceFactory extends ResourceFactoryImpl {
 
+		/**
+		 * XMIHandler that cleans up dangling references when loading models with unknown types
+		 * instead of throwing an exception.
+		 */
+		private final class DanglingReferencesCleanupXMIHandler extends SAXXMIHandler {
+			/** Constructor. */
+			private DanglingReferencesCleanupXMIHandler(XMLResource xmiResource, XMLHelper helper,
+					Map<?, ?> options) {
+				super(xmiResource, helper, options);
+			}
+
+			/** {@inheritDoc} */
+			@Override
+			protected void handleForwardReferences(boolean isEndDocument) {
+				List<SingleReference> toRemoveFwdSingleRefs = new ArrayList<>();
+				for(SingleReference ref : forwardSingleReferences) {
+					EObject obj;
+					try {
+						obj = xmlResource.getEObject((String)ref.getValue());
+					} catch(RuntimeException exception) {
+						obj = null;
+					}
+					if(obj == null || obj instanceof AnyType) {
+						warnRefWithUnknownType((AnyType)obj, ref.getLineNumber(),
+								ref.getColumnNumber());
+						toRemoveFwdSingleRefs.add(ref);
+					}
+				}
+				forwardSingleReferences.removeAll(toRemoveFwdSingleRefs);
+
+				List<ManyReference> toRemoveFwdManyRefs = new ArrayList<>();
+				for(ManyReference ref : forwardManyReferences) {
+					Object[] values = ref.getValues();
+
+					for(Object id : values) {
+
+						EObject obj;
+						try {
+							obj = xmlResource.getEObject((String)id);
+						} catch(RuntimeException exception) {
+							obj = null;
+						}
+						if(obj == null || obj instanceof AnyType) {
+							warnRefWithUnknownType((AnyType)obj, ref.getLineNumber(),
+									ref.getColumnNumber());
+							toRemoveFwdManyRefs.add(ref);
+							break;
+						}
+					}
+				}
+				forwardManyReferences.removeAll(toRemoveFwdManyRefs);
+
+				super.handleForwardReferences(isEndDocument);
+			}
+
+			/** Issues a warning for a given {@link AnyType}d object. */
+			private void warnRefWithUnknownType(AnyType obj, int line, int col) {
+				String message = "Removing reference to element with unknown type" +
+						(obj != null ? " \"" + obj.eClass().getName() + "\"" : "") + " in line " +
+						line + ", column " + col + ".";
+
+				// Static inline not possible: name clash with XMLHandler::warning()
+				LoggingUtils.warning(ToolingKernelActivator.getDefault(), message);
+			}
+		}
+
 		/**
 		 * {@link XMIResourceImpl} used to persist models managed by the tooling kernel.
 		 * 
 		 * @author barner
 		 */
 		private final class KernelXMIResource extends XMIResourceImpl {
+
 			/** Constructs a new {@link KernelXMIResource}. */
 			private KernelXMIResource(URI uri) {
 				super(uri);
@@ -99,7 +172,7 @@ public final class ResourceUtils {
 			public String getID(EObject eObject) {
 				String id = super.getID(eObject);
 				if(id == null && eObject instanceof IIdLabeled) {
-					id = new Integer(((IIdLabeled)eObject).getId()).toString();
+					id = String.valueOf(((IIdLabeled)eObject).getId());
 					setID(eObject, id);
 				}
 				return id;
@@ -140,6 +213,18 @@ public final class ResourceUtils {
 				}
 				return eObjectToExtensionMap;
 			}
+
+			/** {@inheritDoc} */
+			@Override
+			protected XMLLoad createXMLLoad() {
+				return new XMILoadImpl(createXMLHelper()) {
+					/** {@inheritDoc} */
+					@Override
+					protected DefaultHandler makeDefaultHandler() {
+						return new DanglingReferencesCleanupXMIHandler(resource, helper, options);
+					}
+				};
+			}
 		}
 
 		/** {@inheritDoc} */
@@ -196,13 +281,13 @@ public final class ResourceUtils {
 
 	/**
 	 * <p>
-	 * Determines the {@link ITopLevelElement} which shares the same {@link ResourceSet} as the a
-	 * {@link Resource} with the specified {@link URI}. If no such {@link Resource} has been loaded,
-	 * {@code null} is returned.
+	 * Determines the {@link ITopLevelElement} which shares the same {@link ResourceSet} as the
+	 * a {@link Resource} with the specified {@link URI}. If no such {@link Resource} has been
+	 * loaded, {@code null} is returned.
 	 * </p>
 	 * <p>
-	 * This is useful to determine to which model managed by the Kernel a given (external) model is
-	 * linked.
+	 * This is useful to determine to which model managed by the Kernel a given (external) model
+	 * is linked.
 	 * </p>
 	 * 
 	 * @param uri
@@ -226,8 +311,8 @@ public final class ResourceUtils {
 	}
 
 	/**
-	 * Obtains a model of a given type from a {@code resourceSet}, or {@code null} if it could not
-	 * be found.
+	 * Obtains a model of a given type from a {@code resourceSet}, or {@code null} if it could
+	 * not be found.
 	 * 
 	 * @param resourceSet
 	 *            {@link ResourceSet} from which model of given type should be determined
@@ -251,25 +336,30 @@ public final class ResourceUtils {
 	}
 
 	/**
-	 * Obtains a model of a given type from a {@code resourceSet}, and creates the model if it does
-	 * not exist yet (and adds it to the given {@code resourceSet}). Returns {@code null} if the
-	 * model could not be created.
+	 * Obtains a model of a given type from a {@code resourceSet}, and creates the model if it
+	 * does not exist yet (and adds it to the given {@code resourceSet}). Returns {@code null} if
+	 * the model could not be created.
 	 * 
 	 * @param resourceSet
 	 *            {@link ResourceSet} from which model of given type should be determined
 	 * @param clazz
 	 *            Type of model to be returned.
 	 * @param factory
-	 *            {@link EFactory} to create root model element in case the model does not exist in
+	 *            {@link EFactory} to create root model element in case the model does not exist
+	 *            in
 	 *            the {@code resourceSet} yet.
 	 * @param fileExtension
-	 *            File extension to be used in case a new resource has to be created and added to
-	 *            the given given {@code resourceSet}. In case this parameter is {@code null}, this
+	 *            File extension to be used in case a new resource has to be created and added
+	 *            to
+	 *            the given given {@code resourceSet}. In case this parameter is {@code null},
+	 *            this
 	 *            method effectively behaves like {@link #getModel(ResourceSet, Class)}.
 	 * @param referenceClazz
-	 *            Type of root model element whose {@link Resource} {@link URI} should be used to
+	 *            Type of root model element whose {@link Resource} {@link URI} should be used
+	 *            to
 	 *            derive the base name in case a new {@link Resource} has to be created. In case
-	 *            this parameter is {@code null}, the {@link URI} of the first {@link Resource} in
+	 *            this parameter is {@code null}, the {@link URI} of the first {@link Resource}
+	 *            in
 	 *            the given {@link ResourceSet} is used.
 	 * 
 	 * @return Model of a given type, or {@code null} if it could not be created.
@@ -368,12 +458,14 @@ public final class ResourceUtils {
 	 *            {@link Resource} for which {@link URI}s of directly or indirectly referencing
 	 *            resources should be determined.
 	 * @param includeSelf
-	 *            Flag if the {@link URI} of the given {@code resource} should be contained in the
+	 *            Flag if the {@link URI} of the given {@code resource} should be contained in
+	 *            the
 	 *            result.
 	 * @param progressMonitor
 	 *            {@link IProgressMonitor} (may be {@code null}). Loading all resources in a
 	 *            directory may be a long-running operation.
-	 * @return {@link URI}s of directly or indirectly referencing resources, possibly including the
+	 * @return {@link URI}s of directly or indirectly referencing resources, possibly including
+	 *         the
 	 *         {@link URI} of the given {@code resource} itself (see {@code includeSelf}).
 	 */
 	public static Collection<URI> getReferencingResourceURIs(Resource resource, boolean includeSelf,
diff --git a/org.fortiss.tooling.spiderchart.ui/.settings b/org.fortiss.tooling.spiderchart.ui/.settings
index d117b3db1742a745f515d2b6c52cc9a02e57c299..310d1c04f28f6252d5a02dd8fde1b76ae4a4da51 160000
--- a/org.fortiss.tooling.spiderchart.ui/.settings
+++ b/org.fortiss.tooling.spiderchart.ui/.settings
@@ -1 +1 @@
-Subproject commit d117b3db1742a745f515d2b6c52cc9a02e57c299
+Subproject commit 310d1c04f28f6252d5a02dd8fde1b76ae4a4da51