diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/.ratings b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/.ratings
index abd9b93500271c14d2d69255ad99564476ccb34c..1a992f1c696d0cfd2b15bd63911f26e4777fb3c8 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/.ratings
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/.ratings
@@ -1,4 +1,4 @@
-EMFTypeMap.java b6c39465568f0edbfbd5c90400a4f519c042d423 GREEN
-EMFTypeToTypeMap.java 294abe02e7af4ad751d8760b6c6286a3c1f6d73f GREEN
-EMFTypeToTypeSetMap.java d131702e4f04ef8d8a2c70113dce2c628ce65c3d GREEN
+EMFTypeMap.java 99a70a6c5db0cb283a1e0614f4f455422047e14d YELLOW
+EMFTypeToTypeMap.java 792b6f10042562983b192cfe2a2547221391e701 YELLOW
+EMFTypeToTypeSetMap.java e7572738d19c81fd507bc8ca88a3408058d88bf0 YELLOW
 TypeSet.java e18e66236b223eaf4c22037459779b421a0c2703 GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeMap.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeMap.java
index b6c39465568f0edbfbd5c90400a4f519c042d423..99a70a6c5db0cb283a1e0614f4f455422047e14d 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeMap.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeMap.java
@@ -15,47 +15,29 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.service.types;
 
+import static org.fortiss.tooling.kernel.utils.EcoreUtils.getInterfaceType;
+
 import java.util.Comparator;
 import java.util.TreeMap;
 
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 
 /**
  * Base class to map an EMF type to a target type. For a given {@link EClass} {@code Foo}, the
  * map considers the generated interface class {@code Foo} and the corresponding implementation
  * class {@code FooImpl} identical.
  */
-public class EMFTypeMap<S, T> extends TreeMap<Class<? extends S>, T> {
-
-	/**
-	 * Suffix used by EMF to denote implementation classes of the Java interfaces corresponding
-	 * to EClasses.
-	 */
-	private static final String IMPL_CLASS_SUFFIX = "Impl";
+public class EMFTypeMap<S extends EObject, T> extends TreeMap<Class<? extends S>, T> {
 
 	/** Constructor. */
 	public EMFTypeMap() {
 		super(new Comparator<Class<? extends S>>() {
-			@SuppressWarnings("unchecked")
-			private Class<? extends S> getInterfaceType(Class<? extends S> c) {
-				final String className = c.getSimpleName();
-				if(className.endsWith(IMPL_CLASS_SUFFIX)) {
-					final String ifaceName =
-							className.substring(0, className.length() - IMPL_CLASS_SUFFIX.length());
-					for(Class<?> iFace : c.getInterfaces()) {
-						if(iFace.getSimpleName().equals(ifaceName)) {
-							return (Class<? extends S>)iFace;
-						}
-					}
-				}
-				return c;
-			}
-
 			/** {@inheritDoc} */
 			@Override
 			public int compare(Class<? extends S> c1, Class<? extends S> c2) {
 				Class<? extends S> i1 = getInterfaceType(c1);
-				Class<? extends S> i2 = getInterfaceType(c2);
+				Class<? extends S> i2 = getInterfaceType(c1);
 
 				if(i1 == i2) {
 					return 0;
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeMap.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeMap.java
index 294abe02e7af4ad751d8760b6c6286a3c1f6d73f..792b6f10042562983b192cfe2a2547221391e701 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeMap.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeMap.java
@@ -15,7 +15,9 @@
 +--------------------------------------------------------------------------*/
 package org.fortiss.tooling.kernel.service.types;
 
+import org.eclipse.emf.ecore.EObject;
+
 /** Maps a given EMF type to another type. */
-public class EMFTypeToTypeMap<S, T> extends EMFTypeMap<S, Class<? extends T>> {
+public class EMFTypeToTypeMap<S extends EObject, T> extends EMFTypeMap<S, Class<? extends T>> {
 	// Nothing to do
 }
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeSetMap.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeSetMap.java
index d131702e4f04ef8d8a2c70113dce2c628ce65c3d..e7572738d19c81fd507bc8ca88a3408058d88bf0 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeSetMap.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/service/types/EMFTypeToTypeSetMap.java
@@ -23,8 +23,10 @@ import java.util.Collection;
 import java.util.Set;
 import java.util.function.Predicate;
 
+import org.eclipse.emf.ecore.EObject;
+
 /** Maps a given EMF type to a {@link Set} of types. */
-public class EMFTypeToTypeSetMap<S, T> extends EMFTypeMap<S, TypeSet<T>> {
+public class EMFTypeToTypeSetMap<S extends EObject, T> extends EMFTypeMap<S, TypeSet<T>> {
 
 	/** Adds the given {@code targetType} to the mapped types of the given {@code sourceType}. */
 	public void addTypeSetEntry(Class<? extends S> sourceType, Class<? extends T> targetType) {
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 f61486976ec968eb451c6149467be9a38b3b296b..7a99fec76dd36f7c10b68142b1618ba02b44d35a 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
@@ -2,7 +2,7 @@ CompositionUtils.java 34c0a191bd0fb4176c94b4d61abb5c88a679d5e8 GREEN
 ConstraintsUtils.java 0f8be020f2ca4bb08931c32452163c04a28e30ce GREEN
 EMFResourceUtils.java 979d0e1f4f66a2b3e715d2da0ebef6493f547fd7 GREEN
 EcoreSerializerBase.java 0a0c2969d793d2e68094c55c8f7b0a662ef6e5d5 GREEN
-EcoreUtils.java 95ee8d9c99ea5369ea788f517ebc8dc6f864f4ac GREEN
+EcoreUtils.java 36a464aeda8c9e4f658bf7305f70892052d83096 YELLOW
 ExtensionPointUtils.java 7ce63242b49eb9a7cd4eaadd223f5ebce1dfd75b GREEN
 HierarchicalNameComparator.java 6face1b673126701a0721af48ead2f9766c17d46 GREEN
 IdentifierUtils.java fff43dc4e84cdd89c3ece4f5d9d89aec4b0749c2 GREEN
diff --git a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreUtils.java b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreUtils.java
index 95ee8d9c99ea5369ea788f517ebc8dc6f864f4ac..36a464aeda8c9e4f658bf7305f70892052d83096 100644
--- a/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreUtils.java
+++ b/org.fortiss.tooling.kernel/src/org/fortiss/tooling/kernel/utils/EcoreUtils.java
@@ -77,6 +77,12 @@ public class EcoreUtils {
 	private static final Notification refreshNotification =
 			new NotificationImpl(EVENT_TYPE_COUNT + 1, null, null);
 
+	/**
+	 * Suffix used by EMF to denote implementation classes of the Java interfaces corresponding
+	 * to EClasses.
+	 */
+	private static final String IMPL_CLASS_SUFFIX = "Impl";
+
 	/**
 	 * Same as org.fortiss.tooling.kernel.utils.JavaUtils.convertList(Class<T>, List<S>) but with
 	 * {@link EList} instead of {@link List}.
@@ -306,7 +312,8 @@ public class EcoreUtils {
 	}
 
 	/**
-	 * Returns a list of all parent {@link EObject}s that satisfy the given {@link Predicate}. If none
+	 * Returns a list of all parent {@link EObject}s that satisfy the given {@link Predicate}. If
+	 * none
 	 * are found, an empty list is returned.
 	 * 
 	 * @param child
@@ -747,4 +754,37 @@ public class EcoreUtils {
 	public static <T> EList<T> collectToEList(Stream<T> s) {
 		return new BasicEList<T>(s.collect(Collectors.toList()));
 	}
+
+	/**
+	 * Returns the interface type of the EMF class that can be either the interface itself or its
+	 * implementation class.
+	 * 
+	 * @param c
+	 *            interface or impl class.
+	 * @return interface class.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <T extends EObject> Class<T> getInterfaceType(Class<? extends T> c) {
+		final String className = c.getSimpleName();
+		if(className.endsWith(IMPL_CLASS_SUFFIX)) {
+			final String ifaceName =
+					className.substring(0, className.length() - IMPL_CLASS_SUFFIX.length());
+			for(Class<?> iFace : c.getInterfaces()) {
+				if(iFace.getSimpleName().equals(ifaceName)) {
+					return (Class<T>)iFace;
+				}
+			}
+		}
+		return (Class<T>)c;
+	}
+
+	/**
+	 * Returns the interface type of the given EMF object.
+	 * 
+	 * @return interface class.
+	 */
+	@SuppressWarnings("unchecked")
+	public static <S extends EObject> Class<? super S> getInterfaceType(S instance) {
+		return (Class<? super S>)getInterfaceType(instance.getClass());
+	}
 }