diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java
index 85b6d6f18a280f477acc55188d7f17a81091a941..e99261f98f4f3e88a400950f133e30ad61ca2613 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/internal/ConstraintVerificationUIService.java
@@ -1,8 +1,10 @@
 package org.fortiss.tooling.kernel.ui.internal;
 
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 import org.eclipse.emf.common.notify.Adapter;
 import org.eclipse.emf.common.notify.Notification;
@@ -18,16 +20,18 @@ import org.fortiss.tooling.kernel.model.constraints.ConstrainedWithChecksum;
 import org.fortiss.tooling.kernel.model.constraints.ConstraintsPackage;
 import org.fortiss.tooling.kernel.model.constraints.IConstrained;
 import org.fortiss.tooling.kernel.model.constraints.IConstraint;
+import org.fortiss.tooling.kernel.model.constraints.IConstraintContainer;
 import org.fortiss.tooling.kernel.model.constraints.IConstraintVerificationStatus;
+import org.fortiss.tooling.kernel.model.constraints.OutdatedVerificationStatus;
 import org.fortiss.tooling.kernel.service.IConstraintVerificationService;
 import org.fortiss.tooling.kernel.service.IKernelIntrospectionSystemService;
 import org.fortiss.tooling.kernel.service.IPersistencyService;
 import org.fortiss.tooling.kernel.service.base.EObjectAwareServiceBase;
+import org.fortiss.tooling.kernel.ui.ToolingKernelUIActivator;
 import org.fortiss.tooling.kernel.ui.extension.IConstraintVerifierUI;
 import org.fortiss.tooling.kernel.ui.internal.introspection.items.ConstraintVerificationUIServiceIntrospectionDetailsItem;
 import org.fortiss.tooling.kernel.ui.service.IConstraintVerificationUIService;
 import org.fortiss.tooling.kernel.ui.util.ConstraintsUIUtils;
-import org.fortiss.tooling.kernel.utils.ConstraintsUtils;
 import org.fortiss.tooling.kernel.utils.EcoreUtils;
 import org.fortiss.tooling.kernel.utils.LoggingUtils;
 
@@ -37,7 +41,7 @@ import org.fortiss.tooling.kernel.utils.LoggingUtils;
  * @author aravantinos
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: DFD84F252FBC3A66B43232EFD9AE172A
+ * @ConQAT.Rating YELLOW Hash: 4D293B01D041A43D10556052E8754848
  */
 public final class ConstraintVerificationUIService extends
 		EObjectAwareServiceBase<IConstraintVerifierUI<IConstraint>> implements
@@ -50,21 +54,13 @@ public final class ConstraintVerificationUIService extends
 		return INSTANCE;
 	}
 
+	/** Activates logging to observe when constraints get outdated. */
+	private static final boolean DEBUG = false;
+
 	/** {@inheritDoc} */
 	@Override
 	public void startService() {
 		IKernelIntrospectionSystemService.getInstance().registerService(this);
-	}
-
-	/** Map ID -> Verifier. */
-	private HashMap<String, IConstraintVerifierUI<IConstraint>> idMap = new HashMap<>();
-
-	/** Registers the verifier UI part with the service. */
-	@Override
-	@SuppressWarnings("unchecked")
-	public <T extends IConstraint> void registerConstraintVerifierUI(
-			IConstraintVerifierUI<T> verifier, Class<T> constraintElementClass) {
-		addHandler(constraintElementClass, (IConstraintVerifierUI<IConstraint>)verifier);
 		List<ITopLevelElement> tops = IPersistencyService.getInstance().getTopLevelElements();
 		for(ITopLevelElement top : tops) {
 			TreeIterator<EObject> tree = top.getRootModelElement().eAllContents();
@@ -77,12 +73,12 @@ public final class ConstraintVerificationUIService extends
 		}
 	}
 
-	/** {@inheritDoc} */
+	/** Registers the verifier UI part with the service. */
 	@Override
-	protected void
-			addHandler(Class<?> modelElementClass, IConstraintVerifierUI<IConstraint> handler) {
-		super.addHandler(modelElementClass, handler);
-		idMap.put(handler.getID(), handler);
+	@SuppressWarnings("unchecked")
+	public <T extends IConstraint> void registerConstraintVerifierUI(
+			IConstraintVerifierUI<T> verifier, Class<T> constraintElementClass) {
+		addHandler(constraintElementClass, (IConstraintVerifierUI<IConstraint>)verifier);
 	}
 
 	/** {@inheritDoc} */
@@ -131,33 +127,28 @@ public final class ConstraintVerificationUIService extends
 
 	/** {@inheritDoc} */
 	@Override
-	public void openStatus(IConstraintVerificationStatus status) {
-		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(status.getConstraint());
-		verifier.openStatus(status);
-		ConstraintsUIUtils.triggerMarkersRefresh(status.getConstraint());
+	public void openStatus(IConstraint c) {
+		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(c);
+		verifier.openStatus(c, getStatus(c));
+		ConstraintsUIUtils.triggerMarkersRefresh(c);
 	}
 
 	/** {@inheritDoc} */
 	@Override
-	public boolean canOpen(IConstraintVerificationStatus status) {
-		if(status != null) {
-			IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(status.getConstraint());
-			return verifier.canOpen(status);
-		}
-		return false;
+	public boolean canOpen(IConstraint c) {
+		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(c);
+		return verifier.canOpen(c, getStatus(c));
 	}
 
 	/** {@inheritDoc} */
 	@Override
 	public void install(IConstraint constraint) {
-		if(constraint.getVerificationStatus() == null) {
-			ConstraintsUtils.createOutdatedVerificationStatus(constraint);
-		}
-		if(constraint.getVerificationStatus().getConstraint() == null) {
-			constraint.getVerificationStatus().setConstraint(constraint);
+		if(constraint.getVerificationStatus() != null &&
+				constraint.getVerificationStatus().getConstraint() == null) {
+			ITopLevelElement top =
+					IPersistencyService.getInstance().getTopLevelElementFor(constraint);
+			top.runAsCommand(() -> constraint.getVerificationStatus().setConstraint(constraint));
 		}
-		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraint);
-		verifier.onOutdate(constraint);
 		ConstraintsUIUtils.triggerMarkersRefresh(constraint);
 		new ConstrainedAdapters(constraint);
 	}
@@ -206,6 +197,10 @@ public final class ConstraintVerificationUIService extends
 				return false;
 			}
 			if(!IConstraintVerificationService.getInstance().isUpToDate(constraint)) {
+				if(DEBUG) {
+					String msg = "Constraint " + constraint.toString() + " is outdated.";
+					LoggingUtils.info(ToolingKernelUIActivator.getDefault(), msg);
+				}
 				IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraint);
 				verifier.onOutdate(constraint);
 				return true;
@@ -313,21 +308,78 @@ public final class ConstraintVerificationUIService extends
 		return "Constraint Verification UI Service";
 	}
 
+	/** Activated constraints per top loevel element. */
+	private static Map<ITopLevelElement, Set<Class<IConstraint>>> activatedConstraints =
+			new HashMap<>();
+
 	/** {@inheritDoc} */
 	@Override
-	public <T extends IConstraint> void activate(String id, EObject context) {
-		IConstraintVerifierUI<IConstraint> verifier = this.idMap.get(id);
-		if(verifier != null) {
-			verifier.activate(context);
+	public IConstraintVerificationStatus getStatus(IConstraint constraint) {
+		ITopLevelElement top = IPersistencyService.getInstance().getTopLevelElementFor(constraint);
+		boolean isActivated = false;
+		Set<Class<IConstraint>> set = activatedConstraints.get(top);
+		if(set != null) {
+			for(Class<IConstraint> activeCstrType : set) {
+				if(activeCstrType.isAssignableFrom(constraint.getClass())) {
+					isActivated = true;
+				}
+			}
+		}
+		return isActivated ? constraint.getVerificationStatus() : null;
+	}
+
+	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
+	@Override
+	public Set<Class<IConstraint>> getAvailableConstraintTypes() {
+		// In principle, we do could return <code>handlerMap.keySet()</code> directly but we miss
+		// the type information to satisfy Java's type checker.
+		HashSet<Class<IConstraint>> res = new HashSet<Class<IConstraint>>();
+		for(Class<?> type : handlerMap.keySet()) {
+			res.add((Class<IConstraint>)type);
 		}
+		return res;
 	}
 
 	/** {@inheritDoc} */
+	@SuppressWarnings("unchecked")
 	@Override
-	public <T extends IConstraint> void deactivate(String id, EObject context) {
-		IConstraintVerifierUI<IConstraint> verifier = this.idMap.get(id);
-		if(verifier != null) {
-			verifier.deactivate(context);
+	public <T extends IConstraint> void activate(Class<T> constraintType,
+			IConstraintContainer cstrContainer) {
+		ITopLevelElement top =
+				IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer);
+		if(!activatedConstraints.containsKey(top)) {
+			activatedConstraints.put(top, new HashSet<>());
+		}
+		activatedConstraints.get(top).add((Class<IConstraint>)constraintType);
+		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraintType);
+		verifier.onActivate(cstrContainer);
+		for(IConstraint c : cstrContainer.getConstraints()) {
+			if(constraintType.isInstance(c)) {
+				if(!IConstraintVerificationService.getInstance().isUpToDate(c) ||
+						c.getVerificationStatus() == null ||
+						c.getVerificationStatus() instanceof OutdatedVerificationStatus) {
+					verifier.onOutdate(c);
+				}
+			}
 		}
+		ConstraintsUIUtils.triggerMarkerRefresh(constraintType, cstrContainer);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public <T extends IConstraint> void deactivate(Class<T> constraintType,
+			IConstraintContainer cstrContainer) {
+		ITopLevelElement top =
+				IPersistencyService.getInstance().getTopLevelElementFor(cstrContainer);
+		activatedConstraints.get(top).remove(constraintType);
+		ConstraintsUIUtils.triggerMarkerRefresh(constraintType, cstrContainer);
+	}
+
+	/** {@inheritDoc} */
+	@Override
+	public <T extends IConstraint> String getDescription(Class<T> constraintType) {
+		IConstraintVerifierUI<IConstraint> verifier = getFirstVerifier(constraintType);
+		return verifier == null ? null : verifier.getDescription();
 	}
 }
diff --git a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java
index 36b812c48264a54700e60a7aec4fad1e23e428df..b609e9018a112dfea806113dfa2c366b5e48f5b6 100644
--- a/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java
+++ b/org.fortiss.tooling.kernel.ui/trunk/src/org/fortiss/tooling/kernel/ui/service/IConstraintVerificationUIService.java
@@ -1,7 +1,9 @@
 package org.fortiss.tooling.kernel.ui.service;
 
-import org.eclipse.emf.ecore.EObject;
+import java.util.Set;
+
 import org.fortiss.tooling.kernel.model.constraints.IConstraint;
+import org.fortiss.tooling.kernel.model.constraints.IConstraintContainer;
 import org.fortiss.tooling.kernel.model.constraints.IConstraintVerificationStatus;
 import org.fortiss.tooling.kernel.service.IConstraintVerificationService;
 import org.fortiss.tooling.kernel.ui.extension.IConstraintVerifierUI;
@@ -13,7 +15,7 @@ import org.fortiss.tooling.kernel.ui.internal.ConstraintVerificationUIService;
  * @author aravantinos
  * @author $Author$
  * @version $Rev$
- * @ConQAT.Rating YELLOW Hash: 7219766068C024D972B4871A0891118D
+ * @ConQAT.Rating YELLOW Hash: 088353619375F645ACA70AD1C2990CE1
  */
 public interface IConstraintVerificationUIService {
 	/** Returns the service instance. */
@@ -21,11 +23,11 @@ public interface IConstraintVerificationUIService {
 		return ConstraintVerificationUIService.getInstance();
 	}
 
-	/** Action to take when trying to open the given status. */
-	void openStatus(IConstraintVerificationStatus status);
+	/** Action to take when trying to open the (status of the given) constraint. */
+	void openStatus(IConstraint c);
 
-	/** True if the given status can be open. */
-	boolean canOpen(IConstraintVerificationStatus status);
+	/** True if the (status of the) the given constraint can be open. */
+	boolean canOpen(IConstraint c);
 
 	/** Install the given constraint: install notifiers and triggers an "onOutdate" event. */
 	void install(IConstraint constraint);
@@ -40,9 +42,23 @@ public interface IConstraintVerificationUIService {
 	 * EXPERIMENTAL.
 	 */
 
-	/** Activates the constraint type. */
-	<T extends IConstraint> void activate(String id, EObject context);
+	/**
+	 * Returns the status of the constraint, possibly returns <code>null</code> if the constraint is
+	 * not activated.
+	 */
+	IConstraintVerificationStatus getStatus(IConstraint constraint);
+
+	/** Returns a list of all available constraint types. */
+	Set<Class<IConstraint>> getAvailableConstraintTypes();
+
+	/** Activates the constraint type in the context of the given constraints container. */
+	<T extends IConstraint> void activate(Class<T> constraintType,
+			IConstraintContainer cstrContainer);
+
+	/** Deactivates the constraint type in the context of the given constraints container. */
+	<T extends IConstraint> void deactivate(Class<T> constraintType,
+			IConstraintContainer cstrContainer);
 
-	/** Deactivates the constraint type. */
-	<T extends IConstraint> void deactivate(String id, EObject context);
+	/** Returns a description for the given constraint type. */
+	<T extends IConstraint> String getDescription(Class<T> constraintType);
 }