diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
index e7fe1bc..44b5d55 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/parser/AstValidator.java
@@ -84,6 +84,11 @@
 	private static final String VARIABLE_OVERRIDES_AN_EXISTING_VALUE = "Variable %s overrides an existing value.";
 
 	/**
+	 * Message used when an {@link EClassifierType} is not registered.
+	 */
+	private static final String ECLASSIFIER_NOT_REGISTERED = "%s is not registered in the current environment";
+
+	/**
 	 * Should never happen message.
 	 */
 	private static final String SHOULD_NEVER_HAPPEN = "should never happen";
@@ -134,20 +139,28 @@
 		final Set<IType> validationTypes = new LinkedHashSet<IType>();
 		final List<ValidationMessage> msgs = new ArrayList<ValidationMessage>();
 		for (IType type : types) {
-			if (type instanceof NothingType) {
-				final AstResult astResult = validationResult.getAstResult();
-				final int startPostion;
-				if (expression instanceof Call) {
-					startPostion = astResult.getEndPosition(((Call)expression).getArguments().get(0));
-				} else if (expression instanceof FeatureAccess) {
-					startPostion = astResult.getEndPosition(((FeatureAccess)expression).getTarget());
-				} else {
-					startPostion = astResult.getStartPosition(expression);
-				}
-				final int endPosition = astResult.getEndPosition(expression);
+			final AstResult astResult = validationResult.getAstResult();
+			final int startPostion;
+			if (expression instanceof Call) {
+				startPostion = astResult.getEndPosition(((Call)expression).getArguments().get(0));
+			} else if (expression instanceof FeatureAccess) {
+				startPostion = astResult.getEndPosition(((FeatureAccess)expression).getTarget());
+			} else {
+				startPostion = astResult.getStartPosition(expression);
+			}
+			final int endPosition = astResult.getEndPosition(expression);
 
+			if (type instanceof NothingType) {
 				msgs.add(new ValidationMessage(ValidationMessageLevel.WARNING, ((NothingType)type)
 						.getMessage(), startPostion, endPosition));
+			} else if (type instanceof EClassifierType) {
+				if (services.getQueryEnvironment().getEPackageProvider().isRegistered(((EClassifierType)type)
+						.getType())) {
+					result.add(type);
+				} else {
+					msgs.add(new ValidationMessage(ValidationMessageLevel.WARNING, String.format(
+							ECLASSIFIER_NOT_REGISTERED, type), startPostion, endPosition));
+				}
 			} else {
 				result.add(type);
 			}
@@ -165,6 +178,7 @@
 		validationResult.addTypes(expression, validationTypes);
 
 		return result;
+
 	}
 
 	/**
@@ -472,8 +486,8 @@
 											.getVariableName(), originalType, argType));
 						} else {
 							messageWhenTrue.append(String.format(
-									"\nNothing inferred when %s (%s) is type of %s",
-									varRef.getVariableName(), originalType, argType));
+									"\nNothing inferred when %s (%s) is type of %s", varRef.getVariableName(),
+									originalType, argType));
 							inferredFalseTypes.add(originalType);
 						}
 					}
@@ -552,7 +566,8 @@
 	private Map<String, Set<IType>> unionInferredTypes(Map<String, Set<IType>> inferredLeftVariableTypes,
 			Map<String, Set<IType>> inferredRightVariableTypes) {
 		final Map<String, Set<IType>> result = new HashMap<String, Set<IType>>();
-		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(inferredRightVariableTypes);
+		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(
+				inferredRightVariableTypes);
 
 		for (Entry<String, Set<IType>> entry : inferredLeftVariableTypes.entrySet()) {
 			final Set<IType> inferredTypes = new LinkedHashSet<IType>(entry.getValue());
@@ -616,7 +631,8 @@
 			final Map<String, Set<IType>> inferredRightVariableTypes) {
 		final Map<String, Set<IType>> result = new HashMap<String, Set<IType>>();
 
-		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(inferredRightVariableTypes);
+		final Map<String, Set<IType>> rightLocal = new HashMap<String, Set<IType>>(
+				inferredRightVariableTypes);
 		for (Entry<String, Set<IType>> entry : inferredLeftVariableTypes.entrySet()) {
 			final Set<IType> inferredTypes = new LinkedHashSet<IType>();
 			final Set<IType> inferredRightTypes = rightLocal.remove(entry.getKey());
@@ -666,8 +682,8 @@
 	@Override
 	public Set<IType> caseEnumLiteral(EnumLiteral object) {
 		final Set<IType> possibleTypes = new LinkedHashSet<IType>();
-		possibleTypes
-				.add(new EClassifierType(services.getQueryEnvironment(), object.getLiteral().getEEnum()));
+		possibleTypes.add(new EClassifierType(services.getQueryEnvironment(), object.getLiteral()
+				.getEEnum()));
 		return checkWarningsAndErrors(object, possibleTypes);
 	}
 
@@ -928,8 +944,8 @@
 				}
 			}
 		} else {
-			possibleTypes.add(new SetType(services.getQueryEnvironment(), services
-					.nothing("Empty OrderedSet defined in extension")));
+			possibleTypes.add(new SetType(services.getQueryEnvironment(), services.nothing(
+					"Empty OrderedSet defined in extension")));
 		}
 
 		return checkWarningsAndErrors(object, possibleTypes);
@@ -951,8 +967,8 @@
 				}
 			}
 		} else {
-			possibleTypes.add(new SetType(services.getQueryEnvironment(), services
-					.nothing("Empty Sequence defined in extension")));
+			possibleTypes.add(new SetType(services.getQueryEnvironment(), services.nothing(
+					"Empty Sequence defined in extension")));
 		}
 
 		return checkWarningsAndErrors(object, possibleTypes);
@@ -1015,8 +1031,8 @@
 			final IType booleanObjectType = new ClassType(services.getQueryEnvironment(), Boolean.class);
 			final IType booleanType = new ClassType(services.getQueryEnvironment(), boolean.class);
 			for (IType type : selectorTypes) {
-				final boolean assignableFrom = booleanObjectType.isAssignableFrom(type)
-						|| booleanType.isAssignableFrom(type);
+				final boolean assignableFrom = booleanObjectType.isAssignableFrom(type) || booleanType
+						.isAssignableFrom(type);
 				onlyBoolean = onlyBoolean && assignableFrom;
 				onlyNotBoolean = onlyNotBoolean && !assignableFrom;
 				if (!onlyBoolean && !onlyNotBoolean) {
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
index d346c0e..3391079 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/AnyServices.java
@@ -44,7 +44,6 @@
 import org.eclipse.emf.ecore.EEnumLiteral;
 import org.eclipse.emf.ecore.EObject;
 import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.DynamicEObjectImpl;
 
 //@formatter:off
 @ServiceProvider(
@@ -237,9 +236,6 @@
 	// @formatter:on
 	public Boolean oclIsKindOf(Object object, Object type) {
 		Boolean result;
-		if (type instanceof EClassifier && !(object instanceof DynamicEObjectImpl)) {
-			checkRegistered((EClassifier)type);
-		}
 		if (object == null && type != null) {
 			// OCL considers "null" (OclVoid) to be compatible with everything.
 			// AQL considers it incompatible with anything.
@@ -287,9 +283,6 @@
 	// @formatter:on
 	public Boolean oclIsTypeOf(Object object, Object type) {
 		Boolean result;
-		if (type instanceof EClassifier && !(object instanceof DynamicEObjectImpl)) {
-			checkRegistered((EClassifier)type);
-		}
 		if (object == null && type != null) {
 			// OCL considers "null" (OclVoid) to be compatible with everything.
 			// AQL considers it incompatible with anything.
@@ -320,21 +313,6 @@
 		return result;
 	}
 
-	/**
-	 * Checks if the given {@link EClassifier} is registered.
-	 * 
-	 * @param type
-	 *            the {@link EClassifier} to check
-	 * @throws IllegalArgumentException
-	 *             if the {@link EClassifier} is not registered
-	 */
-	private void checkRegistered(EClassifier type) throws IllegalArgumentException {
-		if (!queryEnvironment.getEPackageProvider().isRegistered(type)) {
-			throw new IllegalArgumentException(String.format(
-					"%s is not registered in the current environment", type));
-		}
-	}
-
 	// @formatter:off
 	@Documentation(
 		value = "Returns a string representation of the current object.",
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
index 427aa7a..2baf23a 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/services/FilterService.java
@@ -10,11 +10,7 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.services;
 
-import com.google.common.collect.ImmutableSet;
-import com.google.common.collect.Sets;
-
 import java.lang.reflect.Method;
-import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
@@ -24,16 +20,11 @@
 import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment;
 import org.eclipse.acceleo.query.runtime.impl.JavaMethodService;
 import org.eclipse.acceleo.query.runtime.impl.ValidationServices;
-import org.eclipse.acceleo.query.validation.type.AbstractCollectionType;
-import org.eclipse.acceleo.query.validation.type.EClassifierLiteralType;
-import org.eclipse.acceleo.query.validation.type.EClassifierSetLiteralType;
-import org.eclipse.acceleo.query.validation.type.EClassifierType;
 import org.eclipse.acceleo.query.validation.type.ICollectionType;
 import org.eclipse.acceleo.query.validation.type.IType;
 import org.eclipse.acceleo.query.validation.type.NothingType;
 import org.eclipse.acceleo.query.validation.type.SequenceType;
 import org.eclipse.acceleo.query.validation.type.SetType;
-import org.eclipse.emf.ecore.EClassifier;
 
 /**
  * {@link org.eclipse.acceleo.query.runtime.IService#validateAllType(org.eclipse.acceleo.query.runtime.impl.ValidationServices, org.eclipse.acceleo.query.runtime.impl.EPackageProvider, java.util.Map)
@@ -77,69 +68,31 @@
 	}
 
 	@Override
-	public Set<IType> validateAllType(ValidationServices services,
-			IReadOnlyQueryEnvironment queryEnvironment, Map<List<IType>, Set<IType>> allTypes) {
+	public Set<IType> validateAllType(ValidationServices services, IReadOnlyQueryEnvironment queryEnvironment,
+			Map<List<IType>, Set<IType>> allTypes) {
 		final Set<IType> result = new LinkedHashSet<IType>();
 		final StringBuilder builder = new StringBuilder();
 
 		for (Entry<List<IType>, Set<IType>> entry : allTypes.entrySet()) {
-			final Set<EClassifier> eClassEClasses = ImmutableSet.copyOf(queryEnvironment
-					.getEPackageProvider().getTypes("ecore", "EClass"));
-			if (entry.getKey().size() > filterIndex) {
-				final Set<IType> filterTypes = Sets.newLinkedHashSet();
-				if (entry.getKey().get(filterIndex) instanceof EClassifierSetLiteralType) {
-					for (EClassifier eClassifier : ((EClassifierSetLiteralType)entry.getKey()
-							.get(filterIndex)).getEClassifiers()) {
-						filterTypes.add(new EClassifierType(queryEnvironment, eClassifier));
-					}
-				} else if (entry.getKey().get(filterIndex) instanceof EClassifierLiteralType) {
-					filterTypes.add(entry.getKey().get(filterIndex));
-				} else if (eClassEClasses.contains(entry.getKey().get(filterIndex).getType())
-						|| ((entry.getKey().get(filterIndex) instanceof SetType && eClassEClasses
-								.contains(((AbstractCollectionType)entry.getKey().get(filterIndex))
-										.getCollectionType().getType())))) {
-					final Collection<EClassifier> eObjectEClasses = queryEnvironment.getEPackageProvider()
-							.getTypes("ecore", "EObject");
-					for (EClassifier eObjectEClass : eObjectEClasses) {
-						filterTypes.add(new EClassifierType(queryEnvironment, eObjectEClass));
-					}
+			for (IType possibleType : entry.getValue()) {
+				final IType rawType;
+				if (possibleType instanceof ICollectionType) {
+					rawType = ((ICollectionType)possibleType).getCollectionType();
 				} else {
-					filterTypes.add(entry.getKey().get(filterIndex));
+					rawType = possibleType;
 				}
-				for (IType filterType : filterTypes) {
-					for (IType possibleType : entry.getValue()) {
-						final IType rawType;
-						if (possibleType instanceof ICollectionType) {
-							rawType = ((ICollectionType)possibleType).getCollectionType();
-						} else {
-							rawType = possibleType;
-						}
-						if (rawType instanceof NothingType) {
-							builder.append("\n");
-							builder.append(((NothingType)rawType).getMessage());
-						} else {
-							final IType loweredType = services.lower(filterType, rawType);
-							if (loweredType != null) {
-								result.add(unrawType(queryEnvironment, possibleType, loweredType));
-							}
-						}
-					}
-				}
-			} else {
-				for (IType possibleType : entry.getValue()) {
-					if (possibleType instanceof NothingType) {
-						builder.append("\n");
-						builder.append(((NothingType)possibleType).getMessage());
-					} else {
-						result.add(possibleType);
-					}
+				if (rawType instanceof NothingType) {
+					builder.append("\n");
+					builder.append(((NothingType)rawType).getMessage());
+				} else {
+					result.add(possibleType);
 				}
 			}
 		}
 
 		if (result.isEmpty()) {
-			final NothingType nothing = services.nothing("Nothing will be left after calling %s:"
-					+ builder.toString(), getName());
+			final NothingType nothing = services.nothing("Nothing will be left after calling %s:" + builder
+					.toString(), getName());
 			if (List.class.isAssignableFrom(getMethod().getReturnType())) {
 				result.add(new SequenceType(queryEnvironment, nothing));
 			} else if (Set.class.isAssignableFrom(getMethod().getReturnType())) {
@@ -152,31 +105,4 @@
 		return result;
 	}
 
-	/**
-	 * Puts the given raw type into an {@link ICollectionType} or leave it raw according to the given original
-	 * {@link IType}.
-	 * 
-	 * @param queryEnvironment
-	 *            the {@link IReadOnlyQueryEnvironment}
-	 * @param originalType
-	 *            the original {@link IType}
-	 * @param rawType
-	 *            the raw {@link IType}
-	 * @return the given raw type into an {@link ICollectionType} or leave it raw according to the given
-	 *         original {@link IType}
-	 */
-	private IType unrawType(IReadOnlyQueryEnvironment queryEnvironment, IType originalType, IType rawType) {
-		final IType result;
-
-		if (originalType instanceof SequenceType) {
-			result = new SequenceType(queryEnvironment, rawType);
-		} else if (originalType instanceof SetType) {
-			result = new SetType(queryEnvironment, rawType);
-		} else {
-			result = rawType;
-		}
-
-		return result;
-	}
-
 }
diff --git a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
index d81697f..813ec73 100644
--- a/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
+++ b/query/plugins/org.eclipse.acceleo.query/src/org/eclipse/acceleo/query/validation/type/EClassifierSetLiteralType.java
@@ -10,6 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.validation.type;
 
+import com.google.common.base.Joiner;
+
 import java.util.Set;
 
 import org.eclipse.acceleo.query.runtime.IReadOnlyQueryEnvironment;
@@ -51,4 +53,14 @@
 		return eClassifiers;
 	}
 
+	/**
+	 * {@inheritDoc}
+	 *
+	 * @see org.eclipse.acceleo.query.validation.type.SetType#toString()
+	 */
+	@Override
+	public String toString() {
+		return "Set(" + Joiner.on(',').join(eClassifiers) + ")";
+	}
+
 }
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
index 4d89cd3..6cfc3b7 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationTest.java
@@ -120,6 +120,24 @@
 	}
 
 	@Test
+	public void variableNotRegisteredEClassifierTest() {
+		queryEnvironment.removeEPackage(EcorePackage.eINSTANCE.getName());
+
+		final IValidationResult validationResult = engine.validate("self", variableTypes);
+		final Expression ast = validationResult.getAstResult().getAst();
+		final Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
+
+		assertEquals(1, possibleTypes.size());
+		final Iterator<IType> it = possibleTypes.iterator();
+		IType possibleType = it.next();
+		assertTrue(possibleType instanceof EClassifierType);
+		assertEquals(EcorePackage.eINSTANCE.getEClass(), possibleType.getType());
+		assertEquals(1, validationResult.getMessages().size());
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
+				"EClassifier=EClass is not registered in the current environment", 0, 4);
+	}
+
+	@Test
 	public void variableNotExistingTest() {
 		final IValidationResult validationResult = engine.validate("notExisting", variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
@@ -298,9 +316,7 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
 				"Couldn't find the someService(EClassifier=EClass,EClassifier=EBooleanObject) service or EOperation",
 				4, 22);
 	}
@@ -333,9 +349,7 @@
 		assertTrue(possibleType instanceof EClassifierType);
 		assertEquals(EcorePackage.eINSTANCE.getEClassifier(), possibleType.getType());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.WARNING,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.WARNING,
 				"Couldn't find the getEClassifier(EClassifier=EPackage,EClassifier=SingleString) service or EOperation",
 				5, 30);
 	}
@@ -349,9 +363,7 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
 				"Couldn't find the getEClassifier(EClassifier=EPackage,EClassifier=EIntegerObject) service or EOperation",
 				5, 23);
 	}
@@ -427,8 +439,8 @@
 
 	@Test
 	public void enumLiteralError() {
-		final IValidationResult validationResult = engine
-				.validate("anydsl::Part::NotExisting", variableTypes);
+		final IValidationResult validationResult = engine.validate("anydsl::Part::NotExisting",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		Set<IType> possibleTypes = validationResult.getPossibleTypes(ast);
@@ -645,9 +657,7 @@
 		assertTrue(possibleType instanceof EClassifierType);
 		assertEquals(EcorePackage.eINSTANCE.getEPackage(), possibleType.getType());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.WARNING,
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.WARNING,
 				"The predicate may evaluate to a value that is not a boolean type ([java.lang.Boolean, java.lang.Object]).",
 				0, 38);
 		assertNotNull(validationResult.getPossibleTypes(((Conditional)ast).getTrueBranch()));
@@ -656,8 +666,8 @@
 
 	@Test
 	public void testLetMaskingVariable() {
-		final IValidationResult validationResult = engine
-				.validate("let stuff = self in stuff", variableTypes);
+		final IValidationResult validationResult = engine.validate("let stuff = self in stuff",
+				variableTypes);
 
 		final Expression ast = validationResult.getAstResult().getAst();
 
@@ -879,10 +889,11 @@
 
 	@Test
 	public void eOperationLookupNoEClassifierForClassType() {
-		queryEnvironment.removeEPackage(EcorePackage.eINSTANCE.getName());
-		queryEnvironment.removeEPackage(AnydslPackage.eINSTANCE.getName());
+		final Set<IType> nonEMFTypes = new LinkedHashSet<IType>();
+		nonEMFTypes.add(new ClassType(queryEnvironment, Query.class));
+		variableTypes.put("nonEMF", nonEMFTypes);
 
-		final IValidationResult validationResult = engine.validate("self.triggerEOperationLookUp('')",
+		final IValidationResult validationResult = engine.validate("self.triggerEOperationLookUp(nonEMF)",
 				variableTypes);
 
 		final Expression ast = validationResult.getAstResult().getAst();
@@ -891,11 +902,9 @@
 		assertEquals(1, stripNothingTypes(possibleTypes).size());
 		assertEquals(0, possibleTypes.size());
 		assertEquals(1, validationResult.getMessages().size());
-		assertValidationMessage(
-				validationResult.getMessages().get(0),
-				ValidationMessageLevel.ERROR,
-				"Couldn't create EClassifier type for triggerEOperationLookUp(EClassifier=EClass,java.lang.String) parameter java.lang.String",
-				4, 32);
+		assertValidationMessage(validationResult.getMessages().get(0), ValidationMessageLevel.ERROR,
+				"Couldn't create EClassifier type for triggerEOperationLookUp(EClassifier=EClass,org.eclipse.acceleo.query.runtime.Query) parameter org.eclipse.acceleo.query.runtime.Query",
+				4, 36);
 	}
 
 	@Test
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
index 4ffe044..292185d 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/AnyServicesTest.java
@@ -200,8 +200,14 @@
 		assertEquals(self, any.oclAsType(self, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
-	public void oclAsTypeEClassEClassifierUnregistered() {
+	@Test
+	public void oclAsTypeEclassToEClassEClassifierUnregistered() {
+		final Object self = EcoreFactory.eINSTANCE.createEClass();
+		assertEquals(self, any.oclAsType(self, EcorePackage.eINSTANCE.getEClass()));
+	}
+
+	@Test(expected = ClassCastException.class)
+	public void oclAsTypeObjectToEClassifierUnregistered() {
 		final Object self = new Object();
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEClass());
 	}
@@ -213,7 +219,7 @@
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEInt());
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test(expected = ClassCastException.class)
 	public void oclAsTypeObjectToEIntUnregistered() {
 		final Object self = new Object();
 		any.oclAsType(self, EcorePackage.eINSTANCE.getEInt());
@@ -232,10 +238,10 @@
 		assertEquals(Integer.valueOf(1), any.oclAsType(i, EcorePackage.eINSTANCE.getEInt()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
 	public void oclAsTypeIntToEIntUnregistered() {
 		final Integer i = Integer.valueOf(1);
-		any.oclAsType(i, EcorePackage.eINSTANCE.getEInt());
+		assertEquals(Integer.valueOf(1), any.oclAsType(i, EcorePackage.eINSTANCE.getEInt()));
 	}
 
 	@Test
@@ -245,10 +251,10 @@
 		assertEquals(eClass, any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test
 	public void oclAsTypeCompatibleClassifiersUnregistered() {
 		final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
-		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass());
+		assertEquals(eClass, any.oclAsType(eClass, EcorePackage.eINSTANCE.getEClass()));
 	}
 
 	@Test(expected = ClassCastException.class)
@@ -258,7 +264,7 @@
 		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEPackage());
 	}
 
-	@Test(expected = IllegalArgumentException.class)
+	@Test(expected = ClassCastException.class)
 	public void oclAsTypeIncompatibleTypesUnregistered() {
 		final EClass eClass = EcoreFactory.eINSTANCE.createEClass();
 		any.oclAsType(eClass, EcorePackage.eINSTANCE.getEPackage());
@@ -329,7 +335,7 @@
 		assertFalse(any.oclIsKindOf(null, null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEClassNotRegistered() {
 		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
@@ -340,9 +346,9 @@
 		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEEnumNotRegistered() {
-		any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -351,9 +357,9 @@
 		assertFalse(any.oclIsKindOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfNullEDataTypeNotRegistered() {
-		any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsKindOf(null, EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -367,9 +373,12 @@
 		assertFalse(any.oclIsKindOf(new Object(), null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfObjectEClassNotRegistered() {
-		any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsKindOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsKindOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+				.getEClassifier()));
 	}
 
 	@Test
@@ -381,14 +390,10 @@
 				.getEClassifier()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEEnumNotRegistered_enumLiteral() {
-		any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber());
-	}
-
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEEnumNotRegistered_Object() {
-		any.oclIsKindOf(new Object(), AnydslPackage.eINSTANCE.getCaliber());
+	@Test
+	public void oclIsKindOfObjectEEnumNotRegistered() {
+		assertFalse(any.oclIsKindOf(new Object(), AnydslPackage.eINSTANCE.getCaliber()));
+		assertTrue(any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -398,14 +403,10 @@
 		assertTrue(any.oclIsKindOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
-	public void oclIsKindOfObjectEDataTypeNotRegistered_String() {
-		any.oclIsKindOf("a string", EcorePackage.eINSTANCE.getEString());
-	}
-
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsKindOfObjectEDataTypeNotRegistered_Object() {
-		any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsKindOf(new Object(), EcorePackage.eINSTANCE.getEString()));
+		assertTrue(any.oclIsKindOf("a string", EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -427,9 +428,9 @@
 		assertFalse(any.oclIsTypeOf(null, null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEClassNotRegistered() {
-		any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
 	@Test
@@ -438,9 +439,9 @@
 		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEClass()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEEnumNotRegistered() {
-		any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -449,9 +450,9 @@
 		assertFalse(any.oclIsTypeOf(null, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfNullEDataTypeNotRegistered() {
-		any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsTypeOf(null, EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
@@ -465,9 +466,12 @@
 		assertFalse(any.oclIsTypeOf(new Object(), null));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEClassNotRegistered() {
-		any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEClass());
+		assertFalse(any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEClass()));
+		assertTrue(any.oclIsTypeOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE.getEClass()));
+		assertFalse(any.oclIsTypeOf(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+				.getEClassifier()));
 	}
 
 	@Test
@@ -479,9 +483,10 @@
 				.getEClassifier()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEEnumNotRegistered() {
-		any.oclIsTypeOf(new Object(), AnydslPackage.eINSTANCE.getCaliber());
+		assertFalse(any.oclIsTypeOf(new Object(), AnydslPackage.eINSTANCE.getCaliber()));
+		assertTrue(any.oclIsTypeOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
 	@Test
@@ -491,9 +496,10 @@
 		assertTrue(any.oclIsTypeOf(Caliber.L, AnydslPackage.eINSTANCE.getCaliber()));
 	}
 
-	@Test(expected = java.lang.IllegalArgumentException.class)
+	@Test
 	public void oclIsTypeOfObjectEDataTypeNotRegistered() {
-		any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEString());
+		assertFalse(any.oclIsTypeOf(new Object(), EcorePackage.eINSTANCE.getEString()));
+		assertTrue(any.oclIsTypeOf("a string", EcorePackage.eINSTANCE.getEString()));
 	}
 
 	@Test
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
index 3300691..2af68c3 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/services/tests/CollectionServicesValidationTest.java
@@ -1039,7 +1039,6 @@
 
 	@Test
 	public void testFilterList() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1052,7 +1051,6 @@
 
 	@Test
 	public void testFilterSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1065,7 +1063,6 @@
 
 	@Test
 	public void testFilterListEClassifierSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				sequenceType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1078,9 +1075,9 @@
 		assertValidation(expectedReturnTypes, "filter", parameterTypes);
 	}
 
+
 	@Test
 	public void testFilterSetEClassifierSet() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClassifier())),
@@ -1095,7 +1092,6 @@
 
 	@Test
 	public void testFilterListEInt() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {sequenceType(classType(Integer.class)),
 				eClassifierLiteralType(EcorePackage.eINSTANCE.getEInt()) };
@@ -1107,7 +1103,6 @@
 
 	@Test
 	public void testFilterSetEInt() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {setType(classType(Integer.class)),
 				eClassifierLiteralType(EcorePackage.eINSTANCE.getEInt()) };
@@ -1119,7 +1114,6 @@
 
 	@Test
 	public void testFilterSetIncompatibleTypes() {
-		// FIXME test this without the registration as well to make sure it fails
 		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
 		final IType[] parameterTypes = new IType[] {
 				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
@@ -1129,4 +1123,18 @@
 
 		assertValidation(expectedReturnTypes, "filter", parameterTypes);
 	}
+
+	@Test
+	public void testFilterSetCompatibleAndIncompatibleTypes() {
+		getQueryEnvironment().registerEPackage(EcorePackage.eINSTANCE);
+		final IType[] parameterTypes = new IType[] {
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
+				eClassifierSetLiteralType(EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE
+						.getEPackage()) };
+		final IType[] expectedReturnTypes = new IType[] {
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEClass())),
+				setType(eClassifierType(EcorePackage.eINSTANCE.getEPackage())) };
+
+		assertValidation(expectedReturnTypes, "filter", parameterTypes);
+	}
 }
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 15f2e43..3d10a36 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
@@ -66,8 +66,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 doesn't contain any other EClass")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling eAllContents:\nEClassifier=eCls1 doesn't contain any other EClass")) };
 
-			assertValidation(expectedReturnTypes, "eAllContents", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "eAllContents", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -669,8 +670,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 doesn't contain any other EClass")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling eContents:\nEClassifier=eCls1 doesn't contain any other EClass")) };
 
-			assertValidation(expectedReturnTypes, "eContents", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "eContents", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -1094,8 +1096,9 @@
 			final IType[] parameterTypes = new IType[] {eClassifierLiteralType(EcorePackage.eINSTANCE
 					.getEAttribute()) };
 			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, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1108,8 +1111,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(EcorePackage.eINSTANCE.getEClass()) };
 			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, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1123,8 +1127,9 @@
 			final IType[] parameterTypes = new IType[] {eClassifierSetLiteralType(EcorePackage.eINSTANCE
 					.getEAttribute(), EcorePackage.eINSTANCE.getEReference()) };
 			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, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
@@ -1138,8 +1143,9 @@
 			final IType[] parameterTypes = new IType[] {setType(eClassifierType(EcorePackage.eINSTANCE
 					.getEClass())) };
 			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, "allInstances", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "allInstances", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(EcorePackage.eINSTANCE.getName());
 		}
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 fad44e5..75471b9 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
@@ -60,8 +60,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't be contained")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling ancestors:\nEClassifier=eCls1 can't be contained")) };
 
-			assertValidation(expectedReturnTypes, "ancestors", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "ancestors", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -329,8 +330,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have following siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling followingSiblings:\nEClassifier=eCls1 can't have following siblings")) };
 
-			assertValidation(expectedReturnTypes, "followingSiblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "followingSiblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -584,8 +586,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have preceding siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling precedingSiblings:\nEClassifier=eCls1 can't have preceding siblings")) };
 
-			assertValidation(expectedReturnTypes, "precedingSiblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "precedingSiblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
@@ -847,8 +850,9 @@
 
 			final IType[] parameterTypes = new IType[] {eClassifierType(eCls1) };
 			final IType[] expectedReturnTypes = new IType[] {sequenceType(nothingType("EClassifier=eCls1 can't have siblings")) };
+			final IType[] expectedReturnAllTypes = new IType[] {sequenceType(nothingType("Nothing will be left after calling siblings:\nEClassifier=eCls1 can't have siblings")) };
 
-			assertValidation(expectedReturnTypes, "siblings", parameterTypes);
+			assertValidation(expectedReturnTypes, expectedReturnAllTypes, "siblings", parameterTypes);
 		} finally {
 			getQueryEnvironment().removeEPackage(ePkg.getName());
 		}
