Added support for ClassTypes in EMF filter services.

Change-Id: I91b8e8a32effc98150571e8babc51dadd679d91a
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/ValidationServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/ValidationServices.java
index b07e82c..89033dc 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/ValidationServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/runtime/impl/ValidationServices.java
@@ -37,6 +37,7 @@
 import org.eclipse.acceleo.query.validation.type.SetType;
 import org.eclipse.emf.common.util.Diagnostic;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EClassifier;
 import org.eclipse.emf.ecore.EcorePackage;
 
 /**
@@ -497,4 +498,33 @@
 		return result;
 	}
 
+	/**
+	 * Gets the {@link Set} of {@link EClass} form the given {@link IType}.
+	 * 
+	 * @param queryEnvironment
+	 *            the {@link IReadOnlyQueryEnvironment}
+	 * @param type
+	 *            the {@link IType}
+	 * @return the {@link Set} of {@link EClass} form the given {@link IType}
+	 */
+	public Set<EClass> getEClasses(IReadOnlyQueryEnvironment queryEnvironment, IType type) {
+		final Set<EClass> result = new LinkedHashSet<EClass>();
+
+		if (type.getType() instanceof EClass) {
+			result.add((EClass)type.getType());
+		} else if (type.getType() instanceof Class) {
+			final Set<EClassifier> eClassifiers = queryEnvironment.getEPackageProvider().getEClassifiers(
+					(Class<?>)type.getType());
+			if (eClassifiers != null) {
+				for (EClassifier eClassifier : eClassifiers) {
+					if (eClassifier instanceof EClass) {
+						result.add((EClass)eClassifier);
+					}
+				}
+			}
+		}
+
+		return result;
+	}
+
 }
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EAllContentsService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EAllContentsService.java
index ceab9a4..f9eccb4 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EAllContentsService.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EAllContentsService.java
@@ -53,32 +53,13 @@
 			IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 		final Set<IType> result = new LinkedHashSet<IType>();
 
-		final IType receiverType = argTypes.get(0);
-		final Set<EClass> receiverEClasses = new LinkedHashSet<EClass>();
-		if (receiverType.getType() instanceof EClass) {
-			receiverEClasses.add((EClass)receiverType.getType());
-		} else if (receiverType.getType() instanceof Class) {
-			final Set<EClassifier> eClassifiers = queryEnvironment.getEPackageProvider().getEClassifiers(
-					(Class<?>)receiverType.getType());
-			if (eClassifiers != null) {
-				for (EClassifier eCls : eClassifiers) {
-					if (eCls instanceof EClass) {
-						receiverEClasses.add((EClass)eCls);
-					}
-				}
-			}
-		} else {
-			throw new IllegalStateException("don't know what to do with " + receiverType.getType());
-		}
-
-		if (receiverEClasses.isEmpty()) {
-			result.add(new SequenceType(queryEnvironment, services.nothing(
-					"Only EClass can contain other EClasses not %s", argTypes.get(0))));
-		} else {
-			for (EClass eCls : receiverEClasses) {
+		final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+		if (!eClasses.isEmpty()) {
+			for (EClass eCls : eClasses) {
 				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
 					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
+						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
+								eCls)));
 					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
 						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
 								((EClassifierLiteralType)argTypes.get(1)).getType())));
@@ -96,6 +77,9 @@
 					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			}
+		} else {
+			result.add(new SequenceType(queryEnvironment, services.nothing(
+					"Only EClass can contain other EClasses not %s", argTypes.get(0))));
 		}
 
 		return result;
@@ -135,7 +119,8 @@
 		} else if (argTypes.size() == 2) {
 			final Set<IType> filterTypes = new LinkedHashSet<IType>();
 			if (argTypes.get(1) instanceof EClassifierSetLiteralType) {
-				for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1)).getEClassifiers()) {
+				for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
+						.getEClassifiers()) {
 					filterTypes.add(new EClassifierType(queryEnvironment, eClassifier));
 				}
 			} else if (argTypes.get(1) instanceof EClassifierLiteralType) {
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EObjectServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EObjectServices.java
index 789497f..2114bc7 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EObjectServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/EObjectServices.java
@@ -217,35 +217,12 @@
 				IReadOnlyQueryEnvironment queryEnvironment, IType receiverType, String featureName) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			final Set<EClass> receiverEClasses = new LinkedHashSet<EClass>();
-			if (receiverType.getType() instanceof EClass) {
-				receiverEClasses.add((EClass)receiverType.getType());
-			} else if (receiverType.getType() instanceof Class) {
-				final Set<EClassifier> eClassifiers = queryEnvironment.getEPackageProvider().getEClassifiers(
-						(Class<?>)receiverType.getType());
-				if (eClassifiers != null) {
-					for (EClassifier eCls : eClassifiers) {
-						if (eCls instanceof EClass) {
-							receiverEClasses.add((EClass)eCls);
-						}
-					}
-				}
-			} else if (receiverType.getType() != null) {
-				throw new IllegalStateException(DON_T_KNOW_WHAT_TO_DO_WITH + receiverType.getType());
-			}
-
-			if (receiverEClasses.isEmpty()) {
-				if (receiverType.getType() != null) {
-					result.add(services.nothing(NON_EOBJECT_FEATURE_ACCESS, featureName, receiverType
-							.getType().toString()));
-				} else {
-					result.add(services.nothing(NON_EOBJECT_FEATURE_ACCESS, featureName, "null"));
-				}
-			} else {
-				for (EClass eClass : receiverEClasses) {
-					EStructuralFeature feature = eClass.getEStructuralFeature(featureName);
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, receiverType);
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					EStructuralFeature feature = eCls.getEStructuralFeature(featureName);
 					if (feature == null) {
-						result.add(services.nothing(UNKNOWN_FEATURE, featureName, eClass.getName()));
+						result.add(services.nothing(UNKNOWN_FEATURE, featureName, eCls.getName()));
 					} else {
 						final EClassifierType featureBasicType = new EClassifierType(queryEnvironment, feature
 								.getEType());
@@ -256,6 +233,13 @@
 						}
 					}
 				}
+			} else {
+				if (receiverType.getType() != null) {
+					result.add(services.nothing(NON_EOBJECT_FEATURE_ACCESS, featureName, receiverType
+							.getType().toString()));
+				} else {
+					result.add(services.nothing(NON_EOBJECT_FEATURE_ACCESS, featureName, "null"));
+				}
 			}
 
 			return result;
@@ -350,17 +334,19 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(argTypes.get(0));
-					} else if (argTypes.size() == 2) {
-						result.add(new EClassifierType(queryEnvironment, ((EClassifierLiteralType)argTypes
-								.get(1)).getType()));
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
+							result.add(new EClassifierType(queryEnvironment, eCls));
+						} else if (argTypes.size() == 2) {
+							result.add(new EClassifierType(queryEnvironment, ((EClassifierLiteralType)argTypes
+									.get(1)).getType()));
+						}
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(services.nothing(ONLY_E_CLASS_CAN_BE_CONTAINED_INTO_OTHER_E_CLASSES_NOT_S, argTypes
@@ -451,13 +437,15 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					result.add(new EClassifierType(queryEnvironment, ((EClassifierLiteralType)argTypes.get(1))
-							.getType()));
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						result.add(new EClassifierType(queryEnvironment, ((EClassifierLiteralType)argTypes
+								.get(1)).getType()));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
+					}
 				}
 			} else {
 				result.add(services.nothing(ONLY_E_CLASS_CAN_BE_CONTAINED_INTO_OTHER_E_CLASSES_NOT_S, argTypes
@@ -534,26 +522,31 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
-						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierSetLiteralType) {
-						for (EClassifier eClsFilter : ((EClassifierSetLiteralType)argTypes.get(1))
-								.getEClassifiers()) {
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
 							result.add(new SequenceType(queryEnvironment, new EClassifierType(
-									queryEnvironment, eClsFilter)));
+									queryEnvironment, eCls)));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierLiteralType) {
+							result.add(new SequenceType(queryEnvironment, new EClassifierType(
+									queryEnvironment, ((EClassifierLiteralType)argTypes.get(1)).getType())));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierSetLiteralType) {
+							for (EClassifier eClsFilter : ((EClassifierSetLiteralType)argTypes.get(1))
+									.getEClassifiers()) {
+								result.add(new SequenceType(queryEnvironment, new EClassifierType(
+										queryEnvironment, eClsFilter)));
+							}
+						} else if (argTypes.size() == 2) {
+							result.addAll(super.getType(call, services, validationResult, queryEnvironment,
+									argTypes));
 						}
-					} else if (argTypes.size() == 2) {
-						result.addAll(super.getType(call, services, validationResult, queryEnvironment,
-								argTypes));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SequenceType(queryEnvironment, services.nothing(
@@ -722,17 +715,21 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1 || !(argTypes.get(1).getType() instanceof EClass)) {
-						result.add(new SetType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2) {
-						result.add(new SetType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1 || !(argTypes.get(1).getType() instanceof EClass)) {
+							result.add(new SetType(queryEnvironment, new EClassifierType(queryEnvironment,
+									eCls)));
+						} else if (argTypes.size() == 2) {
+							result.add(new SetType(queryEnvironment, new EClassifierType(queryEnvironment,
+									((EClassifierLiteralType)argTypes.get(1)).getType())));
+						}
+					} else {
+						result.addAll(getTypeForSpecificType(call, services, queryEnvironment, argTypes,
+								eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(call, services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SetType(queryEnvironment, services.nothing(
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/XPathServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/XPathServices.java
index a99590a..310d55e 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/XPathServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/XPathServices.java
@@ -84,26 +84,31 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
-						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierSetLiteralType) {
-						for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
-								.getEClassifiers()) {
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
 							result.add(new SequenceType(queryEnvironment, new EClassifierType(
-									queryEnvironment, eClassifier)));
+									queryEnvironment, eCls)));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierLiteralType) {
+							result.add(new SequenceType(queryEnvironment, new EClassifierType(
+									queryEnvironment, ((EClassifierLiteralType)argTypes.get(1)).getType())));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierSetLiteralType) {
+							for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
+									.getEClassifiers()) {
+								result.add(new SequenceType(queryEnvironment, new EClassifierType(
+										queryEnvironment, eClassifier)));
+							}
+						} else if (argTypes.size() == 2) {
+							result.addAll(super.getType(call, services, validationResult, queryEnvironment,
+									argTypes));
 						}
-					} else if (argTypes.size() == 2) {
-						result.addAll(super.getType(call, services, validationResult, queryEnvironment,
-								argTypes));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SequenceType(queryEnvironment, services.nothing(
@@ -200,26 +205,31 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
-						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierSetLiteralType) {
-						for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
-								.getEClassifiers()) {
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
 							result.add(new SequenceType(queryEnvironment, new EClassifierType(
-									queryEnvironment, eClassifier)));
+									queryEnvironment, eCls)));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierLiteralType) {
+							result.add(new SequenceType(queryEnvironment, new EClassifierType(
+									queryEnvironment, ((EClassifierLiteralType)argTypes.get(1)).getType())));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierSetLiteralType) {
+							for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
+									.getEClassifiers()) {
+								result.add(new SequenceType(queryEnvironment, new EClassifierType(
+										queryEnvironment, eClassifier)));
+							}
+						} else if (argTypes.size() == 2) {
+							result.addAll(super.getType(call, services, validationResult, queryEnvironment,
+									argTypes));
 						}
-					} else if (argTypes.size() == 2) {
-						result.addAll(super.getType(call, services, validationResult, queryEnvironment,
-								argTypes));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SequenceType(queryEnvironment, services.nothing(
@@ -313,26 +323,31 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
-						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierSetLiteralType) {
-						for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
-								.getEClassifiers()) {
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
 							result.add(new SequenceType(queryEnvironment, new EClassifierType(
-									queryEnvironment, eClassifier)));
+									queryEnvironment, eCls)));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierLiteralType) {
+							result.add(new SequenceType(queryEnvironment, new EClassifierType(
+									queryEnvironment, ((EClassifierLiteralType)argTypes.get(1)).getType())));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierSetLiteralType) {
+							for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
+									.getEClassifiers()) {
+								result.add(new SequenceType(queryEnvironment, new EClassifierType(
+										queryEnvironment, eClassifier)));
+							}
+						} else if (argTypes.size() == 2) {
+							result.addAll(super.getType(call, services, validationResult, queryEnvironment,
+									argTypes));
 						}
-					} else if (argTypes.size() == 2) {
-						result.addAll(super.getType(call, services, validationResult, queryEnvironment,
-								argTypes));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SequenceType(queryEnvironment, services.nothing(
@@ -426,26 +441,31 @@
 				IReadOnlyQueryEnvironment queryEnvironment, List<IType> argTypes) {
 			final Set<IType> result = new LinkedHashSet<IType>();
 
-			if (argTypes.get(0).getType() instanceof EClass) {
-				final EClass eCls = (EClass)argTypes.get(0).getType();
-				if (eCls == EcorePackage.eINSTANCE.getEObject()) {
-					if (argTypes.size() == 1) {
-						result.add(new SequenceType(queryEnvironment, argTypes.get(0)));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierLiteralType) {
-						result.add(new SequenceType(queryEnvironment, new EClassifierType(queryEnvironment,
-								((EClassifierLiteralType)argTypes.get(1)).getType())));
-					} else if (argTypes.size() == 2 && argTypes.get(1) instanceof EClassifierSetLiteralType) {
-						for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
-								.getEClassifiers()) {
+			final Set<EClass> eClasses = services.getEClasses(queryEnvironment, argTypes.get(0));
+			if (!eClasses.isEmpty()) {
+				for (EClass eCls : eClasses) {
+					if (eCls == EcorePackage.eINSTANCE.getEObject()) {
+						if (argTypes.size() == 1) {
 							result.add(new SequenceType(queryEnvironment, new EClassifierType(
-									queryEnvironment, eClassifier)));
+									queryEnvironment, eCls)));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierLiteralType) {
+							result.add(new SequenceType(queryEnvironment, new EClassifierType(
+									queryEnvironment, ((EClassifierLiteralType)argTypes.get(1)).getType())));
+						} else if (argTypes.size() == 2 && argTypes.get(
+								1) instanceof EClassifierSetLiteralType) {
+							for (EClassifier eClassifier : ((EClassifierSetLiteralType)argTypes.get(1))
+									.getEClassifiers()) {
+								result.add(new SequenceType(queryEnvironment, new EClassifierType(
+										queryEnvironment, eClassifier)));
+							}
+						} else if (argTypes.size() == 2) {
+							result.addAll(super.getType(call, services, validationResult, queryEnvironment,
+									argTypes));
 						}
-					} else if (argTypes.size() == 2) {
-						result.addAll(super.getType(call, services, validationResult, queryEnvironment,
-								argTypes));
+					} else {
+						result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 					}
-				} else {
-					result.addAll(getTypeForSpecificType(services, queryEnvironment, argTypes, eCls));
 				}
 			} else {
 				result.add(new SequenceType(queryEnvironment, services.nothing(
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
index b235d6b..fde5e6a 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/EObjectServicesValidationTest.java
@@ -20,6 +20,7 @@
 import org.eclipse.acceleo.query.runtime.ServiceUtils;
 import org.eclipse.acceleo.query.services.EObjectServices;
 import org.eclipse.acceleo.query.tests.anydsl.AnydslPackage;
+import org.eclipse.acceleo.query.validation.type.ClassType;
 import org.eclipse.acceleo.query.validation.type.EClassifierLiteralType;
 import org.eclipse.acceleo.query.validation.type.EClassifierType;
 import org.eclipse.acceleo.query.validation.type.IType;
@@ -94,6 +95,23 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredSetOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -112,6 +130,23 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredSetOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContents() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -138,6 +173,31 @@
 	}
 
 	@Test
+	public void testEAllContentsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())), sequenceType(
+							eClassifierType(EcorePackage.eINSTANCE.getETypeParameter())), sequenceType(
+									eClassifierType(EcorePackage.eINSTANCE.getEOperation())), sequenceType(
+											eClassifierType(EcorePackage.eINSTANCE.getEStructuralFeature())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEGenericType())), sequenceType(
+							eClassifierType(EcorePackage.eINSTANCE.getEEnumLiteral())), sequenceType(
+									eClassifierType(EcorePackage.eINSTANCE.getEParameter())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -154,6 +214,21 @@
 	}
 
 	@Test
+	public void testEAllContentsOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredNoContainingEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -198,6 +273,22 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredEClassifierLiteralClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEPackage()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -214,6 +305,22 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEPackage()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredEClassifier() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -240,6 +347,32 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredEClassifierClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())), sequenceType(
+							eClassifierType(EcorePackage.eINSTANCE.getETypeParameter())), sequenceType(
+									eClassifierType(EcorePackage.eINSTANCE.getEOperation())), sequenceType(
+											eClassifierType(EcorePackage.eINSTANCE.getEStructuralFeature())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEGenericType())), sequenceType(
+							eClassifierType(EcorePackage.eINSTANCE.getEEnumLiteral())), sequenceType(
+									eClassifierType(EcorePackage.eINSTANCE.getEParameter())), };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -268,6 +401,34 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEModelElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEModelElement())), sequenceType(
+													eClassifierType(EcorePackage.eINSTANCE
+															.getETypeParameter())), sequenceType(
+																	eClassifierType(EcorePackage.eINSTANCE
+																			.getEOperation())), sequenceType(
+																					eClassifierType(
+																							EcorePackage.eINSTANCE
+																									.getEStructuralFeature())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEEnumLiteral())), sequenceType(
+							eClassifierType(EcorePackage.eINSTANCE.getEParameter())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -284,6 +445,22 @@
 	}
 
 	@Test
+	public void testEAllContentsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEAllContentsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -332,6 +509,20 @@
 	}
 
 	@Test
+	public void testEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class) };
+			final IType[] expectedReturnTypes = new IType[] {classType(EClass.class) };
+
+			assertValidation(expectedReturnTypes, "eClass", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerNotContainedEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -380,6 +571,27 @@
 	}
 
 	@Test
+	public void testEContainerClassType() {
+		final IService<?> service = serviceLookUp("eContainer", new Object[] {EcorePackage.eINSTANCE
+				.eClass() });
+		assertTrue(service != null);
+		final List<IType> argTypes = new ArrayList<IType>();
+		argTypes.add(new ClassType(getQueryEnvironment(), EClass.class));
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEPackage()), eClassifierType(EcorePackage.eINSTANCE.getEAnnotation()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOnEStringToStringMapEntryBasicMapping() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -394,6 +606,24 @@
 	}
 
 	@Test
+	public void testEContainerOnEStringToStringMapEntryBasicMappingClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {new ClassType(getQueryEnvironment(),
+					EStringToStringMapEntryImpl.class) };
+			final IType[] expectedReturnTypes = new IType[] {nothingType(
+					"Only EClass can be contained into other EClasses not org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl") };
+			final IType[] expectedAllReturnTypes = new IType[] {nothingType(
+					"Nothing will be left after calling eContainer:\nOnly EClass can be contained into other EClasses not org.eclipse.emf.ecore.impl.EStringToStringMapEntryImpl") };
+
+			assertValidation(expectedReturnTypes, expectedAllReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOnEStringToStringMapEntryCustomMapping() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -412,6 +642,24 @@
 	}
 
 	@Test
+	public void testEContainerOnEStringToStringMapEntryCustomMappingClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+			getQueryEnvironment().registerCustomClassMapping(EcorePackage.eINSTANCE
+					.getEStringToStringMapEntry(), EStringToStringMapEntryImpl.class);
+
+			final IType[] parameterTypes = new IType[] {new ClassType(getQueryEnvironment(),
+					EStringToStringMapEntryImpl.class) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEAnnotation()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -428,6 +676,21 @@
 	}
 
 	@Test
+	public void testEContainerOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEObject()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerFilteredNotContainedEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -472,6 +735,22 @@
 	}
 
 	@Test
+	public void testEContainerFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -488,6 +767,22 @@
 	}
 
 	@Test
+	public void testEContainerFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerFilteredLoweredByTypes() {
 		final IService<?> service = serviceLookUp("eContainer", new Object[] {EcorePackage.eINSTANCE,
 				EcorePackage.eINSTANCE.getEModelElement() });
@@ -512,6 +807,30 @@
 	}
 
 	@Test
+	public void testEContainerFilteredLoweredByTypesClassType() {
+		final IService<?> service = serviceLookUp("eContainer", new Object[] {EcorePackage.eINSTANCE,
+				EcorePackage.eINSTANCE.getEModelElement() });
+		assertTrue(service != null);
+		final List<IType> argTypes = new ArrayList<IType>();
+		argTypes.add(new ClassType(getQueryEnvironment(), EPackage.class));
+		argTypes.add(new EClassifierLiteralType(getQueryEnvironment(), EcorePackage.eINSTANCE
+				.getETypedElement()));
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE.getEPackage()),
+					eClassifierLiteralType(EcorePackage.eINSTANCE.getETypedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getETypedElement()), eClassifierType(EcorePackage.eINSTANCE.getEOperation()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -528,6 +847,22 @@
 	}
 
 	@Test
+	public void testEContainerFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainer", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -605,6 +940,22 @@
 	}
 
 	@Test
+	public void testEContainerOrSelfFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainerOrSelf", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOrSelfFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -621,6 +972,22 @@
 	}
 
 	@Test
+	public void testEContainerOrSelfFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainerOrSelf", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOrSelfFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -637,6 +1004,22 @@
 	}
 
 	@Test
+	public void testEContainerOrSelfFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getETypedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getETypedElement()), eClassifierType(EcorePackage.eINSTANCE.getEOperation()) };
+
+			assertValidation(expectedReturnTypes, "eContainerOrSelf", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOrSelfFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -653,6 +1036,22 @@
 	}
 
 	@Test
+	public void testEContainerOrSelfFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE
+					.getEClass()) };
+
+			assertValidation(expectedReturnTypes, "eContainerOrSelf", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContainerOrSelfFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -731,6 +1130,23 @@
 	}
 
 	@Test
+	public void testEContentsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -747,6 +1163,21 @@
 	}
 
 	@Test
+	public void testEContentsOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredNoContainingEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -791,6 +1222,22 @@
 	}
 
 	@Test
+	public void testEContentsFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEPackage()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -809,6 +1256,23 @@
 	}
 
 	@Test
+	public void testEContentsFilteredSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilterEClass() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -827,6 +1291,24 @@
 	}
 
 	@Test
+	public void testEContentsFilterEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilterSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -845,6 +1327,24 @@
 	}
 
 	@Test
+	public void testEContentsFilterSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), setType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredSetOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -863,6 +1363,23 @@
 	}
 
 	@Test
+	public void testEContentsFilteredSetOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -879,6 +1396,22 @@
 	}
 
 	@Test
+	public void testEContentsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEPackage()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -897,6 +1430,24 @@
 	}
 
 	@Test
+	public void testEContentsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEModelElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -913,6 +1464,22 @@
 	}
 
 	@Test
+	public void testEContentsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEContentsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -962,6 +1529,21 @@
 	}
 
 	@Test
+	public void testEInverseFeatureNameEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), classType(String.class) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseFiltered() {
 		final IService<?> service = serviceLookUp("eInverse", new Object[] {EcorePackage.eINSTANCE,
 				EcorePackage.eINSTANCE.eClass() });
@@ -985,6 +1567,29 @@
 	}
 
 	@Test
+	public void testEInverseFilteredClassType() {
+		final IService<?> service = serviceLookUp("eInverse", new Object[] {EcorePackage.eINSTANCE,
+				EcorePackage.eINSTANCE.eClass() });
+		assertTrue(service != null);
+		final List<IType> argTypes = new ArrayList<IType>();
+		argTypes.add(new ClassType(getQueryEnvironment(), EPackage.class));
+		argTypes.add(new EClassifierLiteralType(getQueryEnvironment(), EcorePackage.eINSTANCE.getEPackage()));
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE.getEPackage()),
+					eClassifierLiteralType(EcorePackage.eINSTANCE.getEPackage()) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEPackage())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1001,6 +1606,22 @@
 	}
 
 	@Test
+	public void testEInverseFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEEnum()) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEEnum())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1019,6 +1640,24 @@
 	}
 
 	@Test
+	public void testEInverseFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEModelElement()) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEClassifier())), setType(eClassifierType(EcorePackage.eINSTANCE.getEFactory())),
+					setType(eClassifierType(EcorePackage.eINSTANCE.getEPackage())), setType(eClassifierType(
+							EcorePackage.eINSTANCE.getEAnnotation())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1035,6 +1674,21 @@
 	}
 
 	@Test
+	public void testEInverseOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1051,6 +1705,22 @@
 	}
 
 	@Test
+	public void testEInverseFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEEnum()) };
+			final IType[] expectedReturnTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
+					.getEEnum())) };
+
+			assertValidation(expectedReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testEInverseFilteredNoType() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1069,6 +1739,24 @@
 	}
 
 	@Test
+	public void testEInverseFilteredNoTypeClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEOperation()) };
+			final IType[] expectedReturnTypes = new IType[] {setType(nothingType(
+					"org.eclipse.emf.ecore.EPackage don't have inverse to EClassifierLiteral=EOperation")) };
+			final IType[] expectedAllReturnTypes = new IType[] {setType(nothingType(
+					"Nothing will be left after calling eInverse:\norg.eclipse.emf.ecore.EPackage don't have inverse to EClassifierLiteral=EOperation")) };
+
+			assertValidation(expectedReturnTypes, expectedAllReturnTypes, "eInverse", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAllInstancesNoRootProviderEClassLiteral() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1104,6 +1792,23 @@
 	}
 
 	@Test
+	public void testAllInstancesNoRootProviderEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType(
+					"No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType(
+					"Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
+
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAllInstancesNoRootProviderEClassSetLiteral() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1140,6 +1845,23 @@
 	}
 
 	@Test
+	public void testAllInstancesNoRootProviderSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {setType(classType(EClass.class)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType(
+					"No IRootEObjectProvider registered")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType(
+					"Nothing will be left after calling allInstances:\nNo IRootEObjectProvider registered")) };
+
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAllInstancesEClassLiteral() {
 		try {
 			setQueryEnvironment(Query.newEnvironmentWithDefaultServices(null, new RootEObjectProvider(
@@ -1174,6 +1896,22 @@
 	}
 
 	@Test
+	public void testAllInstancesEClassClassType() {
+		try {
+			setQueryEnvironment(Query.newEnvironmentWithDefaultServices(null, new RootEObjectProvider(
+					EcorePackage.eINSTANCE, AnydslPackage.eINSTANCE)));
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EObject.class)) };
+
+			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAllInstancesEClassSetLiteral() {
 		try {
 			setQueryEnvironment(Query.newEnvironmentWithDefaultServices(null, new RootEObjectProvider(
@@ -1209,4 +1947,20 @@
 		}
 	}
 
+	@Test
+	public void testAllInstancesSetClassType() {
+		try {
+			setQueryEnvironment(Query.newEnvironmentWithDefaultServices(null, new RootEObjectProvider(
+					EcorePackage.eINSTANCE, AnydslPackage.eINSTANCE)));
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {setType(classType(EClass.class)) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(classType(EObject.class)) };
+
+			assertValidation(expectedReturnTypes, "allInstances", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
 }
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
index 2632f46..6f82856 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/XPathServicesValidationTest.java
@@ -21,6 +21,7 @@
 import org.eclipse.acceleo.query.validation.type.EClassifierType;
 import org.eclipse.acceleo.query.validation.type.IType;
 import org.eclipse.emf.ecore.EClass;
+import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.emf.ecore.EcorePackage;
@@ -97,6 +98,31 @@
 	}
 
 	@Test
+	public void testAncestorsFilterEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEModelElement())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEEnum())), sequenceType(eClassifierType(
+													EcorePackage.eINSTANCE.getEClass())), sequenceType(
+															eClassifierType(EcorePackage.eINSTANCE
+																	.getEOperation())), sequenceType(
+																			eClassifierType(
+																					EcorePackage.eINSTANCE
+																							.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilterSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -122,6 +148,31 @@
 	}
 
 	@Test
+	public void testAncestorsFilterSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), setType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEModelElement())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEEnum())), sequenceType(eClassifierType(
+													EcorePackage.eINSTANCE.getEClass())), sequenceType(
+															eClassifierType(EcorePackage.eINSTANCE
+																	.getEOperation())), sequenceType(
+																			eClassifierType(
+																					EcorePackage.eINSTANCE
+																							.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestors() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -146,6 +197,30 @@
 	}
 
 	@Test
+	public void testAncestorsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEModelElement())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEEnum())), sequenceType(eClassifierType(
+													EcorePackage.eINSTANCE.getEClass())), sequenceType(
+															eClassifierType(EcorePackage.eINSTANCE
+																	.getEOperation())), sequenceType(
+																			eClassifierType(
+																					EcorePackage.eINSTANCE
+																							.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredSet() {
 
 		try {
@@ -165,6 +240,24 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredSetClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredSetOnEObject() {
 
 		try {
@@ -184,6 +277,24 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredSetOnEObjectClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -200,6 +311,21 @@
 	}
 
 	@Test
+	public void testAncestorsOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredNotContainedEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -244,6 +370,22 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -260,6 +402,22 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -277,6 +435,23 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getETypedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getETypedElement())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEOperation())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -293,6 +468,22 @@
 	}
 
 	@Test
+	public void testAncestorsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testAncestorsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -368,6 +559,23 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilterEClass() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -385,6 +593,23 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilterEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilterSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -402,6 +627,23 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilterSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), setType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFollowingFilteredSet() {
 
 		try {
@@ -421,6 +663,24 @@
 	}
 
 	@Test
+	public void testSiblingsFollowingFilteredSetClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFollowingFilteredSetOnEObject() {
 
 		try {
@@ -440,6 +700,24 @@
 	}
 
 	@Test
+	public void testSiblingsFollowingFilteredSetOnEObjectClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -456,6 +734,21 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilteredNotContainedEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -497,6 +790,22 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClassifier()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -513,6 +822,22 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -530,6 +855,23 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getENamedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getENamedElement())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -546,6 +888,22 @@
 	}
 
 	@Test
+	public void testFollowingSiblingsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testFollowingSiblingsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -619,6 +977,24 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEStringToStringMapEntry())), sequenceType(
+											eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilterEClass() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -639,6 +1015,26 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilterEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilterSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -659,6 +1055,26 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilterSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), setType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredSet() {
 
 		try {
@@ -678,6 +1094,24 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredSetClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredSetOnEObject() {
 
 		try {
@@ -697,6 +1131,24 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredSetOnEObjectClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -754,6 +1206,22 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClassifier()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -770,6 +1238,22 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -788,6 +1272,24 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getENamedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getENamedElement())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -804,6 +1306,22 @@
 	}
 
 	@Test
+	public void testPrecedingSiblingsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testPrecedingSiblingsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -878,6 +1396,25 @@
 	}
 
 	@Test
+	public void testSiblingsClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EClass.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilterEClass() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -898,6 +1435,26 @@
 	}
 
 	@Test
+	public void testSiblingsFilterEClassClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilterSet() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -918,6 +1475,26 @@
 	}
 
 	@Test
+	public void testSiblingsFilterSetClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), setType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEAnnotation())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+											EcorePackage.eINSTANCE.getEStringToStringMapEntry())),
+					sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -934,6 +1511,21 @@
 	}
 
 	@Test
+	public void testSiblingsOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEObject())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredNotContainedEClass() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");
@@ -976,6 +1568,23 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClassifier()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredSet() {
 
 		try {
@@ -995,6 +1604,24 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredSetClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredSetOnEObject() {
 
 		try {
@@ -1014,6 +1641,24 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredSetOnEObjectClassType() {
+
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierSetLiteralType(
+					EcorePackage.eINSTANCE.getEPackage(), EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredOnEObject() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1030,6 +1675,22 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredOnEObjectClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EObject.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredLoweredByTypes() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1048,6 +1709,24 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredLoweredByTypesClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getENamedElement()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClassifier())), sequenceType(eClassifierType(
+							EcorePackage.eINSTANCE.getEPackage())), sequenceType(eClassifierType(
+									EcorePackage.eINSTANCE.getENamedElement())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredLoweredByFilter() {
 		try {
 			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
@@ -1064,6 +1743,22 @@
 	}
 
 	@Test
+	public void testSiblingsFilteredLoweredByFilterClassType() {
+		try {
+			getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+
+			final IType[] parameterTypes = new IType[] {classType(EPackage.class), eClassifierLiteralType(
+					EcorePackage.eINSTANCE.getEClass()) };
+			final IType[] expectedReturnTypes = new IType[] {sequenceType(eClassifierType(
+					EcorePackage.eINSTANCE.getEClass())) };
+
+			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+		} finally {
+			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE);
+		}
+	}
+
+	@Test
 	public void testSiblingsFilteredNoType() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 		ePkg.setName("ePkg");