diff --git a/query/tests/org.eclipse.acceleo.query.tests.qmodel.editor/META-INF/MANIFEST.MF b/query/tests/org.eclipse.acceleo.query.tests.qmodel.editor/META-INF/MANIFEST.MF
index dd2d6f4..57bf9e4 100644
--- a/query/tests/org.eclipse.acceleo.query.tests.qmodel.editor/META-INF/MANIFEST.MF
+++ b/query/tests/org.eclipse.acceleo.query.tests.qmodel.editor/META-INF/MANIFEST.MF
@@ -20,7 +20,6 @@
  org.eclipse.emf.ecore,
  org.eclipse.core.runtime,
  org.eclipse.core.resources,
- com.google.guava,
  org.eclipse.jdt.core,
  org.eclipse.acceleo.query.compat.tests;bundle-version="3.5.0",
  org.eclipse.acceleo.query.tests;bundle-version="3.5.0"
diff --git a/query/tests/org.eclipse.acceleo.query.tests/META-INF/MANIFEST.MF b/query/tests/org.eclipse.acceleo.query.tests/META-INF/MANIFEST.MF
index c63b6ab..14cfa50 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/META-INF/MANIFEST.MF
+++ b/query/tests/org.eclipse.acceleo.query.tests/META-INF/MANIFEST.MF
@@ -34,6 +34,6 @@
  org.eclipse.acceleo.query.tests.services;x-friends:="org.eclipse.acceleo.query.compat.tests",
  org.eclipse.acceleo.query.tests.unit;x-friends:="org.eclipse.acceleo.query.compat.tests",
  org.eclipse.acceleo.query.tests.validation.types
-Import-Package: com.google.common.base,
- com.google.common.collect;version="13.0.0",
- org.antlr.v4.runtime
+Import-Package: org.antlr.v4.runtime,
+ com.google.common.base;version="[15.0.0,22.0.0)",
+ com.google.common.collect;version="[15.0.0,22.0.0)"
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstBuilderTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstBuilderTest.java
index 6b96d54..345d5fb 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstBuilderTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstBuilderTest.java
@@ -10,8 +10,7 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.ast.test;
 
-import com.google.common.collect.Sets;
-
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -107,7 +106,7 @@
 
 	@Test
 	public void testTypeLiteralSet() {
-		Set<Class<?>> classeInSet = Sets.newLinkedHashSet();
+		Set<Class<?>> classeInSet = new LinkedHashSet<Class<?>>();
 		classeInSet.add(Integer.class);
 		assertEquals(Integer.class, ((TypeLiteral)new AstBuilder().typeLiteral(classeInSet)).getValue());
 
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstEvaluatorTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstEvaluatorTest.java
index c89ca04..0f68817 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstEvaluatorTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/AstEvaluatorTest.java
@@ -10,10 +10,9 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.ast.test;
 
-import com.google.common.collect.Maps;
-
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
@@ -127,53 +126,53 @@
 
 	@Before
 	public void setup() {
-		IQueryEnvironment environment = Query
-				.newEnvironmentWithDefaultServices(createEInverseCrossreferencer(EcorePackage.eINSTANCE));
+		IQueryEnvironment environment = Query.newEnvironmentWithDefaultServices(createEInverseCrossreferencer(
+				EcorePackage.eINSTANCE));
 		evaluator = new AstEvaluator(new EvaluationServices(environment));
 	}
 
 	@Test
 	public void testIntLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals(Integer.valueOf(1), evaluator.eval(varDefinitions, integerLiteral(1)));
 	}
 
 	@Test
 	public void testRealLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals(Double.valueOf(1d), evaluator.eval(varDefinitions, realLiteral(1.0)));
 	}
 
 	@Test
 	public void testBoolLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.TRUE, evaluator.eval(varDefinitions, booleanLiteral(true)));
 		assertOKResultEquals(Boolean.FALSE, evaluator.eval(varDefinitions, booleanLiteral(false)));
 	}
 
 	@Test
 	public void testStringLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals("john doe", evaluator.eval(varDefinitions, stringLiteral("john doe")));
 	}
 
 	@Test
 	public void testTypeLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		assertOKResultEquals(EcorePackage.Literals.ECLASS, evaluator.eval(varDefinitions,
-				typeLiteral(EcorePackage.Literals.ECLASS)));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		assertOKResultEquals(EcorePackage.Literals.ECLASS, evaluator.eval(varDefinitions, typeLiteral(
+				EcorePackage.Literals.ECLASS)));
 		assertOKResultEquals(Integer.class, evaluator.eval(varDefinitions, typeLiteral(Integer.class)));
 	}
 
 	@Test
 	public void testFeatureAccess() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 		assertOKResultEquals("EClass", evaluator.eval(varDefinitions, callService(
 				AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, varRef("self"), stringLiteral("name"))));
 		EvaluationResult result = evaluator.eval(varDefinitions, callService(
-				AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, varRef("self"),
-				stringLiteral(("eAllSuperTypes"))));
+				AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, varRef("self"), stringLiteral(
+						("eAllSuperTypes"))));
 		assertTrue(result.getResult() instanceof List);
 		assertEquals(Diagnostic.OK, result.getDiagnostic().getSeverity());
 		assertTrue(result.getDiagnostic().getChildren().isEmpty());
@@ -186,18 +185,18 @@
 
 	@Test
 	public void testVarRef() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 		assertOKResultEquals(EcorePackage.Literals.ECLASS, evaluator.eval(varDefinitions, varRef("self")));
 	}
 
 	@Test
 	public void testCall() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 		final Call callService = callService("size", callService(
-				AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, varRef("self"),
-				stringLiteral("eAllSuperTypes")));
+				AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, varRef("self"), stringLiteral(
+						"eAllSuperTypes")));
 		callService.setType(CallType.COLLECTIONCALL);
 		EvaluationResult result = evaluator.eval(varDefinitions, callService);
 		assertOKResultEquals(Integer.valueOf(3), result);
@@ -205,7 +204,7 @@
 
 	@Test
 	public void testLambda() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("x", new Integer(1));
 		Lambda lambda = lambda(varRef("x"));
 		EvaluationResult value = evaluator.eval(varDefinitions, lambda);
@@ -217,14 +216,14 @@
 
 	@Test
 	public void testNullLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals(null, evaluator.eval(varDefinitions, nullLiteral()));
 	}
 
 	@Test
 	@SuppressWarnings("unchecked")
 	public void testSetInExtensionLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 		final List<Expression> values = new ArrayList<Expression>();
@@ -249,7 +248,7 @@
 	@Test
 	@SuppressWarnings("unchecked")
 	public void testSequenceInExtensionLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 		final List<Expression> values = new ArrayList<Expression>();
@@ -277,7 +276,7 @@
 	 */
 	@Test
 	public void testConditionnalTrueBranch() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		Conditional conditional = conditional(booleanLiteral(true), stringLiteral("trueBranch"),
 				stringLiteral("falseBranch"));
 		assertOKResultEquals("trueBranch", evaluator.eval(varDefinitions, conditional));
@@ -288,7 +287,7 @@
 	 */
 	@Test
 	public void testConditionnalFalseBranch() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		Conditional conditional = conditional(booleanLiteral(false), stringLiteral("trueBranch"),
 				stringLiteral("falseBranch"));
 		assertOKResultEquals("falseBranch", evaluator.eval(varDefinitions, conditional));
@@ -299,9 +298,9 @@
 	 */
 	@Test
 	public void testConditionnalBadPredicate() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		Conditional conditional = conditional(stringLiteral("Hey, what's this?!"),
-				stringLiteral("trueBranch"), stringLiteral("falseBranch"));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		Conditional conditional = conditional(stringLiteral("Hey, what's this?!"), stringLiteral(
+				"trueBranch"), stringLiteral("falseBranch"));
 		final EvaluationResult result = evaluator.eval(varDefinitions, conditional);
 		assertTrue(result.getResult() instanceof Nothing);
 		assertEquals(Diagnostic.WARNING, result.getDiagnostic().getSeverity());
@@ -313,18 +312,17 @@
 
 	@Test
 	public void testLetBasic() {
-		Let let = let(callService("concat", varRef("x"), varRef("y")), binding("x", null,
-				stringLiteral("prefix")), binding("y", null, stringLiteral("suffix")));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Let let = let(callService("concat", varRef("x"), varRef("y")), binding("x", null, stringLiteral(
+				"prefix")), binding("y", null, stringLiteral("suffix")));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		assertOKResultEquals("prefixsuffix", evaluator.eval(varDefinitions, let));
 	}
 
 	@Test
 	public void testLetArenotRecursive() {
-		Let let = let(callService("concat", varRef("x"), varRef("y")), binding("x", null,
-				stringLiteral("prefix")), binding("y", null, callService("concat", varRef("x"),
-				stringLiteral("end"))));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Let let = let(callService("concat", varRef("x"), varRef("y")), binding("x", null, stringLiteral(
+				"prefix")), binding("y", null, callService("concat", varRef("x"), stringLiteral("end"))));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("x", "firstx");
 		assertOKResultEquals("prefixfirstxend", evaluator.eval(varDefinitions, let));
 	}
@@ -333,7 +331,7 @@
 	public void testLetWithNothingBound() {
 		Let let = let(callService("concat", varRef("x"), varRef("y")), binding("x", null, varRef("prefix")),
 				binding("y", null, stringLiteral("suffix")));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		final EvaluationResult result = evaluator.eval(varDefinitions, let);
 		assertTrue(result.getResult() instanceof Nothing);
 		assertEquals(Diagnostic.ERROR, result.getDiagnostic().getSeverity());
@@ -348,9 +346,9 @@
 
 	@Test
 	public void testLetWithNothingBody() {
-		Let let = let(callService("concat", varRef("novar"), varRef("y")), binding("x", null,
-				stringLiteral("prefix")), binding("y", null, stringLiteral("suffix")));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Let let = let(callService("concat", varRef("novar"), varRef("y")), binding("x", null, stringLiteral(
+				"prefix")), binding("y", null, stringLiteral("suffix")));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		final EvaluationResult result = evaluator.eval(varDefinitions, let);
 		assertTrue(result.getResult() instanceof Nothing);
 		assertEquals(Diagnostic.ERROR, result.getDiagnostic().getSeverity());
@@ -370,7 +368,7 @@
 		types.add((TypeLiteral)typeLiteral(EcorePackage.eINSTANCE.getEClass()));
 		types.add((TypeLiteral)typeLiteral(EcorePackage.eINSTANCE.getEPackage()));
 		types.add((TypeLiteral)typeLiteral(EcorePackage.eINSTANCE.getEAttribute()));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		final EvaluationResult result = evaluator.eval(varDefinitions, typeSetLiteral(types));
 		assertTrue(result.getResult() instanceof Set);
 		assertEquals(3, ((Set<?>)result.getResult()).size());
@@ -383,16 +381,16 @@
 	@Test
 	public void testLetOverwriteVariable() {
 		Let let = let(varRef("self"), binding("self", null, stringLiteral("selfOverritten")));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", "self");
 		assertOKResultEquals("selfOverritten", evaluator.eval(varDefinitions, let));
 	}
 
 	@Test
 	public void testLetOverwriteBinding() {
-		Let let = let(varRef("a"), binding("a", null, stringLiteral("a")), binding("a", null,
-				stringLiteral("aOverritten")));
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Let let = let(varRef("a"), binding("a", null, stringLiteral("a")), binding("a", null, stringLiteral(
+				"aOverritten")));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", "self");
 		assertOKResultEquals("aOverritten", evaluator.eval(varDefinitions, let));
 	}
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/delegates/DelegateUtilsTests.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/delegates/DelegateUtilsTests.java
index 4315241..635f968 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/delegates/DelegateUtilsTests.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/ast/test/delegates/DelegateUtilsTests.java
@@ -10,8 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.ast.test.delegates;
 
-import com.google.common.collect.Lists;
-
+import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 
 import org.eclipse.acceleo.query.ast.AstPackage;
@@ -42,7 +42,7 @@
 	public void setSettingDelegatesNotExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setSettingDelegates(ePkg, Lists.newArrayList("uri"));
+		EcoreUtil.setSettingDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri")));
 
 		DelegateUtils.setSettingDelegates(ePkg);
 
@@ -57,7 +57,7 @@
 	public void setSettingDelegatesExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setSettingDelegates(ePkg, Lists.newArrayList("uri", AstPackage.eNS_URI));
+		EcoreUtil.setSettingDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri", AstPackage.eNS_URI)));
 
 		DelegateUtils.setSettingDelegates(ePkg);
 
@@ -77,7 +77,7 @@
 	public void setInvocationDelegatesNotExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setInvocationDelegates(ePkg, Lists.newArrayList("uri"));
+		EcoreUtil.setInvocationDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri")));
 
 		DelegateUtils.setInvocationDelegates(ePkg);
 
@@ -92,7 +92,8 @@
 	public void setInvocationDelegatesExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setInvocationDelegates(ePkg, Lists.newArrayList("uri", AstPackage.eNS_URI));
+		EcoreUtil.setInvocationDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri",
+				AstPackage.eNS_URI)));
 
 		DelegateUtils.setInvocationDelegates(ePkg);
 
@@ -112,7 +113,7 @@
 	public void setValidationDelegatesNotExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setValidationDelegates(ePkg, Lists.newArrayList("uri"));
+		EcoreUtil.setValidationDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri")));
 
 		DelegateUtils.setValidationDelegates(ePkg);
 
@@ -127,7 +128,8 @@
 	public void setValidationDelegatesExisting() {
 		final EPackage ePkg = EcorePackage.eINSTANCE.getEcoreFactory().createEPackage();
 
-		EcoreUtil.setValidationDelegates(ePkg, Lists.newArrayList("uri", AstPackage.eNS_URI));
+		EcoreUtil.setValidationDelegates(ePkg, new ArrayList<String>(Arrays.asList("uri",
+				AstPackage.eNS_URI)));
 
 		DelegateUtils.setValidationDelegates(ePkg);
 
@@ -168,7 +170,7 @@
 	public void setConstraintNotExisting() {
 		final EClass eCls = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
 
-		EcoreUtil.setConstraints(eCls, Lists.newArrayList("someOtherConstraint"));
+		EcoreUtil.setConstraints(eCls, new ArrayList<String>(Arrays.asList("someOtherConstraint")));
 
 		DelegateUtils.setConstraint(eCls, "someConstraint", "true");
 
@@ -187,7 +189,8 @@
 	public void setConstraintExisting() {
 		final EClass eCls = EcorePackage.eINSTANCE.getEcoreFactory().createEClass();
 
-		EcoreUtil.setConstraints(eCls, Lists.newArrayList("someConstraint", "someOtherConstraint"));
+		EcoreUtil.setConstraints(eCls, new ArrayList<String>(Arrays.asList("someConstraint",
+				"someOtherConstraint")));
 
 		DelegateUtils.setConstraint(eCls, "someConstraint", "true");
 
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/EvaluationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/EvaluationTest.java
index aead393..128bde9 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/EvaluationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/EvaluationTest.java
@@ -10,8 +10,6 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.parser.tests;
 
-import com.google.common.collect.Maps;
-
 import java.util.HashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -87,36 +85,36 @@
 		Grand_childFactory grand_childFactory = Grand_childPackage.eINSTANCE.getGrand_childFactory();
 		GrandChildEClass grandChildEClass = grand_childFactory.createGrandChildEClass();
 
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("rootEClass", rootEClass);
 		variables.put("childEClass", childEClass);
 		variables.put("grandChildEClass", grandChildEClass);
 
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("rootEClass.oclIsKindOf(root::RootEClass)"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("childEClass.oclIsKindOf(child::ChildEClass)"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("grandChildEClass.oclIsKindOf(grand_child::GrandChildEClass)"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"rootEClass.oclIsKindOf(root::RootEClass)"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"childEClass.oclIsKindOf(child::ChildEClass)"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"grandChildEClass.oclIsKindOf(grand_child::GrandChildEClass)"), variables));
 	}
 
 	@Test
 	public void variableTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("x", 1);
 		assertOKResultEquals(Integer.valueOf(1), engine.eval(builder.build("x"), variables));
 	}
 
 	@Test
 	public void featureAccessTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
 		assertOKResultEquals("ecore", engine.eval(builder.build("self.name"), variables));
 	}
 
 	@Test
 	public void featureAccessNotExistingFeatureTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
 
 		final EvaluationResult result = engine.eval(builder.build("self.notExistingFeature"), variables);
@@ -134,62 +132,62 @@
 
 	@Test
 	public void intliteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Integer.valueOf(2), engine.eval(builder.build("2"), variables));
 	}
 
 	@Test
 	public void realliteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Double.valueOf(1d), engine.eval(builder.build("1.0"), variables));
 	}
 
 	@Test
 	public void trueliteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build("true"), variables));
 	}
 
 	@Test
 	public void falseliteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.FALSE, engine.eval(builder.build("false"), variables));
 	}
 
 	@Test
 	public void stringliteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals("acceleo query is great", engine.eval(builder.build("'acceleo query is great'"),
 				variables));
 	}
 
 	@Test
 	public void lowerEqualTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build("1<=2"), variables));
 	}
 
 	@Test
 	public void lowerTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build("1<2"), variables));
 	}
 
 	@Test
 	public void greaterEqualTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.FALSE, engine.eval(builder.build("1>=2"), variables));
 	}
 
 	@Test
 	public void greaterTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Boolean.FALSE, engine.eval(builder.build("1>2"), variables));
 	}
 
 	@Test
 	public void addTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
 		assertOKResultEquals("ecore.ecore", engine.eval(builder.build("self.nsPrefix + '.' + self.name"),
 				variables));
@@ -197,23 +195,23 @@
 
 	@Test
 	public void orTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("self.nsPrefix = 'ecore' or self.name='autrechose'"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"self.nsPrefix = 'ecore' or self.name='autrechose'"), variables));
 	}
 
 	@Test
 	public void andTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
-		assertOKResultEquals(Boolean.FALSE, engine.eval(builder
-				.build("self.nsPrefix = 'ecore' and self.name='autrechose'"), variables));
+		assertOKResultEquals(Boolean.FALSE, engine.eval(builder.build(
+				"self.nsPrefix = 'ecore' and self.name='autrechose'"), variables));
 	}
 
 	@Test
 	public void notTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
 		// TODO check priorities. This test fails because "not" takes priority over "=".
 		// boolean operations should probably have a lower priorty than other services
@@ -223,36 +221,36 @@
 
 	@Test
 	public void multTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(Integer.valueOf(4), engine.eval(builder.build("2*2"), variables));
 		assertOKResultEquals(Double.valueOf(4d), engine.eval(builder.build("2.0*2.0"), variables));
 	}
 
 	@Test
 	public void compComplexTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
-		assertOKResultEquals(Boolean.TRUE, engine.eval(
-				builder.build("self.name.size()=self.nsPrefix.size()"), variables));
-		assertOKResultEquals(Boolean.FALSE, engine.eval(builder
-				.build("self.name.size()<self.nsPrefix.size()-1"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("self.name.size()<self.nsPrefix.size()+1"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("self.name.size()+2>self.nsPrefix.size()+1"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("self.name.size()<=self.nsPrefix.size()+1"), variables));
-		assertOKResultEquals(Boolean.TRUE, engine.eval(builder
-				.build("self.name.size()>=self.nsPrefix.size()-1"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build("self.name.size()=self.nsPrefix.size()"),
+				variables));
+		assertOKResultEquals(Boolean.FALSE, engine.eval(builder.build(
+				"self.name.size()<self.nsPrefix.size()-1"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"self.name.size()<self.nsPrefix.size()+1"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"self.name.size()+2>self.nsPrefix.size()+1"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"self.name.size()<=self.nsPrefix.size()+1"), variables));
+		assertOKResultEquals(Boolean.TRUE, engine.eval(builder.build(
+				"self.name.size()>=self.nsPrefix.size()-1"), variables));
 	}
 
 	@Test
 	@SuppressWarnings("unchecked")
 	public void minusTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.Literals.ECLASS);
-		EvaluationResult result = engine.eval(builder
-				.build("self.eAllSuperTypes->including(self)-self.eAllSuperTypes"), variables);
+		EvaluationResult result = engine.eval(builder.build(
+				"self.eAllSuperTypes->including(self)-self.eAllSuperTypes"), variables);
 		assertTrue(result.getResult() instanceof List);
 		assertEquals(Diagnostic.OK, result.getDiagnostic().getSeverity());
 		assertTrue(result.getDiagnostic().getChildren().isEmpty());
@@ -264,7 +262,7 @@
 	@Test
 	public void testSelect0() {
 		String expr = "self.oclAsType(ecore::EClass).eAllSuperTypes->select(e | e.oclIsKindOf(ecore::EClass))";
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.Literals.ECLASS);
 		EvaluationResult result = engine.eval(builder.build(expr), variables);
 		assertTrue(result.getResult() instanceof List);
@@ -278,27 +276,27 @@
 
 	@Test
 	public void nullTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		EvaluationResult result = engine.eval(builder.build(null), variables);
 		assertOKResultEquals(null, result);
 	}
 
 	@Test
 	public void emtpyTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		EvaluationResult result = engine.eval(builder.build(""), variables);
 		assertOKResultEquals(null, result);
 	}
 
 	@Test
 	public void nullLiteralTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(null, engine.eval(builder.build("null"), variables));
 	}
 
 	@Test
 	public void serviceTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE.getEClass());
 		assertOKResultEquals(Integer.valueOf(1), engine.eval(builder.build("self.someService('a')"),
 				variables));
@@ -306,7 +304,7 @@
 
 	@Test
 	public void eOperationTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final Food self = AnydslPackage.eINSTANCE.getAnydslFactory().createFood();
 		variables.put("self", self);
 		assertOKResultEquals("text", engine.eval(builder.build("self.preferredLabel('text')"), variables));
@@ -314,7 +312,7 @@
 
 	@Test
 	public void eOperationEObjectParameterTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final Food self = AnydslPackage.eINSTANCE.getAnydslFactory().createFood();
 		self.setName("self berry");
 		final Food other = AnydslPackage.eINSTANCE.getAnydslFactory().createFood();
@@ -326,7 +324,7 @@
 
 	@Test
 	public void eOperationNoReflectionTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final NoOperationReflection self = NooperationreflectionPackage.eINSTANCE
 				.getNooperationreflectionFactory().createNoOperationReflection();
 		variables.put("self", self);
@@ -336,30 +334,28 @@
 
 	@Test
 	public void eOperationNoReflectionSubParameterTypeTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final NoOperationReflection self = NooperationreflectionPackage.eINSTANCE
 				.getNooperationreflectionFactory().createNoOperationReflection();
 		variables.put("self", self);
-		assertOKResultEquals("EClass", engine.eval(builder
-				.build("self.eOperationNoReflectionSubParameterType(ecore::EClass)"), variables));
+		assertOKResultEquals("EClass", engine.eval(builder.build(
+				"self.eOperationNoReflectionSubParameterType(ecore::EClass)"), variables));
 	}
 
 	@Test
 	public void eOperationNoReflectionListParameterTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final NoOperationReflection self = NooperationreflectionPackage.eINSTANCE
 				.getNooperationreflectionFactory().createNoOperationReflection();
 		variables.put("self", self);
-		assertOKResultEquals(
-				"EClassEOperation",
-				engine.eval(
-						builder.build("self.eOperationNoReflectionListParameter(Sequence{ecore::EClass, ecore::EOperation})"),
-						variables));
+		assertOKResultEquals("EClassEOperation", engine.eval(builder.build(
+				"self.eOperationNoReflectionListParameter(Sequence{ecore::EClass, ecore::EOperation})"),
+				variables));
 	}
 
 	@Test
 	public void eOperationNoReflectionEObjectParameterTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		final NoOperationReflection self = NooperationreflectionPackage.eINSTANCE
 				.getNooperationreflectionFactory().createNoOperationReflection();
 		final NoOperationReflection other = NooperationreflectionPackage.eINSTANCE
@@ -371,28 +367,28 @@
 
 	@Test
 	public void serviceNullParameterTest() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE.getEClass());
 		assertOKResultEquals(1, engine.eval(builder.build("self.someService(null)"), variables));
 	}
 
 	@Test
 	public void enumLiteralOrEClassifierTwoSegmentsEClassifier() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(EcorePackage.eINSTANCE.getEClass(), engine.eval(builder.build("ecore::EClass"),
 				variables));
 	}
 
 	@Test
 	public void enumLiteralOrEClassifierThreeSegments() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 		assertOKResultEquals(AnydslPackage.eINSTANCE.getPart().getEEnumLiteral("Other").getInstance(), engine
 				.eval(builder.build("anydsl::Part::Other"), variables));
 	}
 
 	@Test
 	public void enumLiteralNotExisting() {
-		Map<String, Object> variables = Maps.newHashMap();
+		Map<String, Object> variables = new HashMap<String, Object>();
 
 		final EvaluationResult result = engine.eval(builder.build("anydsl::Part::NotExisting"), variables);
 
@@ -407,7 +403,7 @@
 	@Test
 	@SuppressWarnings("unchecked")
 	public void testSetInExtensionLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 
 		final EvaluationResult result = engine.eval(builder.build("OrderedSet{self, self, true, false}"),
@@ -427,7 +423,7 @@
 	@Test
 	@SuppressWarnings("unchecked")
 	public void testSequenceInExtensionLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("self", EcorePackage.Literals.ECLASS);
 
 		final EvaluationResult result = engine.eval(builder.build("Sequence{self, self, true, false}"),
@@ -452,10 +448,10 @@
 	@Test
 	@SuppressWarnings("unchecked")
 	public void testVariableUsedInLambda() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("selector", "str");
-		EvaluationResult result = engine.eval(builder
-				.build("Sequence{'str1','str2','out'}->select(i | i.startsWith(selector))"), varDefinitions);
+		EvaluationResult result = engine.eval(builder.build(
+				"Sequence{'str1','str2','out'}->select(i | i.startsWith(selector))"), varDefinitions);
 		assertTrue(result.getResult() instanceof List);
 		assertEquals(Diagnostic.OK, result.getDiagnostic().getSeverity());
 		assertTrue(result.getDiagnostic().getChildren().isEmpty());
@@ -467,34 +463,34 @@
 
 	@Test
 	public void testConditionnalTrue() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		assertOKResultEquals("trueBranch", engine.eval(builder
-				.build("if true then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		assertOKResultEquals("trueBranch", engine.eval(builder.build(
+				"if true then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
 	}
 
 	@Test
 	public void testConditionnalFalse() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		assertOKResultEquals("falseBranch", engine.eval(builder
-				.build("if false then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		assertOKResultEquals("falseBranch", engine.eval(builder.build(
+				"if false then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
 	}
 
 	@Test
 	public void testConditionnalCompletePredicate() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("x", new Integer(1));
-		assertOKResultEquals("trueBranch", engine.eval(builder
-				.build("if x > 0 then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
+		assertOKResultEquals("trueBranch", engine.eval(builder.build(
+				"if x > 0 then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
 		varDefinitions.put("x", new Integer(0));
-		assertOKResultEquals("falseBranch", engine.eval(builder
-				.build("if x > 0 then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
+		assertOKResultEquals("falseBranch", engine.eval(builder.build(
+				"if x > 0 then 'trueBranch' else 'falseBranch' endif"), varDefinitions));
 	}
 
 	@Test
 	public void testConditionnalNotBoolean() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		EvaluationResult result = engine.eval(builder
-				.build("if 'notboolean' then 'trueBranch' else 'falseBranch' endif"), varDefinitions);
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		EvaluationResult result = engine.eval(builder.build(
+				"if 'notboolean' then 'trueBranch' else 'falseBranch' endif"), varDefinitions);
 		assertEquals(null, result.getResult());
 		assertEquals(Diagnostic.WARNING, result.getDiagnostic().getSeverity());
 		assertEquals(1, result.getDiagnostic().getChildren().size());
@@ -506,21 +502,21 @@
 
 	@Test
 	public void testLetOneDefinition() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		assertOKResultEquals("prefixsuffix", engine.eval(builder
-				.build("let x='prefix' in x.concat('suffix')"), varDefinitions));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		assertOKResultEquals("prefixsuffix", engine.eval(builder.build(
+				"let x='prefix' in x.concat('suffix')"), varDefinitions));
 	}
 
 	@Test
 	public void testLetBasic() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		assertOKResultEquals("prefixsuffix", engine.eval(builder
-				.build("let x='prefix', y='suffix' in x.concat(y)"), varDefinitions));
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		assertOKResultEquals("prefixsuffix", engine.eval(builder.build(
+				"let x='prefix', y='suffix' in x.concat(y)"), varDefinitions));
 	}
 
 	@Test
 	public void testNotRecursiveLet() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("x", "suffix");
 		assertOKResultEquals("prefixsuffix", engine.eval(builder.build("let x='prefix', y=x in x.concat(y)"),
 				varDefinitions));
@@ -528,9 +524,9 @@
 
 	@Test
 	public void letWithUnusedNothingBoundTest() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		EvaluationResult result = engine.eval(
-				builder.build("let x='prefix', y=x, z='suffix' in x.concat(z)"), varDefinitions);
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		EvaluationResult result = engine.eval(builder.build("let x='prefix', y=x, z='suffix' in x.concat(z)"),
+				varDefinitions);
 		assertEquals(Diagnostic.ERROR, result.getDiagnostic().getSeverity());
 		assertEquals(1, result.getDiagnostic().getChildren().size());
 		assertEquals(Diagnostic.ERROR, result.getDiagnostic().getChildren().get(0).getSeverity());
@@ -541,9 +537,9 @@
 
 	@Test
 	public void letWithNothingBoundTest() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		EvaluationResult result = engine.eval(builder
-				.build("let x='prefix', y=x, z='suffix' in x.concat(z).concat(y)"), varDefinitions);
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		EvaluationResult result = engine.eval(builder.build(
+				"let x='prefix', y=x, z='suffix' in x.concat(z).concat(y)"), varDefinitions);
 		assertEquals(Diagnostic.ERROR, result.getDiagnostic().getSeverity());
 		assertEquals(2, result.getDiagnostic().getChildren().size());
 		String message1 = result.getDiagnostic().getChildren().get(0).getMessage();
@@ -557,7 +553,7 @@
 
 	@Test
 	public void letWithAffixNotation() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
 		varDefinitions.put("x", "suffix");
 		assertOKResultEquals("prefixsuffix", engine.eval(builder.build("let x='prefix', y='suffix' in x+y"),
 				varDefinitions));
@@ -566,9 +562,9 @@
 	@SuppressWarnings("unchecked")
 	@Test
 	public void typeSetLiteral() {
-		Map<String, Object> varDefinitions = Maps.newHashMap();
-		EvaluationResult result = engine.eval(builder
-				.build("{ecore::EClass | ecore::EPackage | ecore::EAttribute}"), varDefinitions);
+		Map<String, Object> varDefinitions = new HashMap<String, Object>();
+		EvaluationResult result = engine.eval(builder.build(
+				"{ecore::EClass | ecore::EPackage | ecore::EAttribute}"), varDefinitions);
 
 		assertTrue(result.getResult() instanceof Set);
 		assertEquals(Diagnostic.OK, result.getDiagnostic().getSeverity());
@@ -591,8 +587,8 @@
 
 		Map<String, Object> variables = new HashMap<String, Object>();
 		variables.put("self", pack);
-		EvaluationResult result = engine.eval(builder
-				.build("self.oclAsType(ecore::EObject).eCrossReferences()"), variables);
+		EvaluationResult result = engine.eval(builder.build(
+				"self.oclAsType(ecore::EObject).eCrossReferences()"), variables);
 
 		assertEquals(pack.eCrossReferences(), result.getResult());
 	}
@@ -660,9 +656,8 @@
 	@Test
 	public void emoji() {
 		Map<String, Object> variables = new HashMap<String, Object>();
-		EvaluationResult result = engine.eval(builder
-				.build("Sequence{'\u1F61C','\u1F62D','\u1F63D','\u1F1EB\u1F1F7'}->sep(' ')->toString()"),
-				variables);
+		EvaluationResult result = engine.eval(builder.build(
+				"Sequence{'\u1F61C','\u1F62D','\u1F63D','\u1F1EB\u1F1F7'}->sep(' ')->toString()"), variables);
 
 		assertEquals("\u1F61C \u1F62D \u1F63D \u1F1EB\u1F1F7", result.getResult());
 	}
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationInferrenceTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationInferrenceTest.java
index 1857a2f..fab321e 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationInferrenceTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/parser/tests/ValidationInferrenceTest.java
@@ -10,8 +10,8 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.parser.tests;
 
-import com.google.common.collect.Sets;
-
+import java.util.Arrays;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashMap;
 import java.util.LinkedHashSet;
@@ -196,12 +196,10 @@
 		assertEquals(2, validationResult.getMessages().size());
 		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
 				ValidationMessageLevel.ERROR, "Nothing", 0, 10);
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(1),
-						ValidationMessageLevel.INFO,
-						"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is kind of EClassifierLiteral=B",
-						0, 31);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(1),
+				ValidationMessageLevel.INFO,
+				"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is kind of EClassifierLiteral=B",
+				0, 31);
 	}
 
 	@Test
@@ -210,7 +208,7 @@
 		String varName = "container";
 		Map<String, Set<IType>> variableTypes = new LinkedHashMap<String, Set<IType>>();
 		IType eObjectType = new EClassifierType(queryEnvironment, EcorePackage.eINSTANCE.getEObject());
-		variableTypes.put(varName, Sets.newHashSet(eObjectType));
+		variableTypes.put(varName, new HashSet<IType>(Arrays.asList(eObjectType)));
 
 		final IValidationResult validationResult = engine.validate(varName + ".oclIsKindOf(test::B)",
 				variableTypes);
@@ -290,12 +288,10 @@
 		assertEquals(b, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varB (EClassifier=B) is not kind of EClassifierLiteral=B",
-						0, 25);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varB (EClassifier=B) is not kind of EClassifierLiteral=B",
+				0, 25);
 	}
 
 	@Test
@@ -319,12 +315,10 @@
 		assertEquals(c, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varC (EClassifier=C) is not kind of EClassifierLiteral=B",
-						0, 25);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varC (EClassifier=C) is not kind of EClassifierLiteral=B",
+				0, 25);
 	}
 
 	@Test
@@ -377,12 +371,10 @@
 		assertEquals(2, validationResult.getMessages().size());
 		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
 				ValidationMessageLevel.ERROR, "Nothing", 0, 10);
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(1),
-						ValidationMessageLevel.INFO,
-						"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is type of EClassifierLiteral=B",
-						0, 31);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(1),
+				ValidationMessageLevel.INFO,
+				"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is type of EClassifierLiteral=B",
+				0, 31);
 	}
 
 	@Test
@@ -391,7 +383,7 @@
 		String varName = "container";
 		Map<String, Set<IType>> variableTypes = new LinkedHashMap<String, Set<IType>>();
 		IType eObjectType = new EClassifierType(queryEnvironment, EcorePackage.eINSTANCE.getEObject());
-		variableTypes.put(varName, Sets.newHashSet(eObjectType));
+		variableTypes.put(varName, new HashSet<IType>(Arrays.asList(eObjectType)));
 
 		final IValidationResult validationResult = engine.validate(varName + ".oclIsTypeOf(test::B)",
 				variableTypes);
@@ -529,12 +521,10 @@
 		assertEquals(z, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varZ (EClassifier=Z) is not type of EClassifierLiteral=Z",
-						0, 25);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varZ (EClassifier=Z) is not type of EClassifierLiteral=Z",
+				0, 25);
 	}
 
 	@Test
@@ -594,8 +584,8 @@
 	@Test
 	public void not_oclIsKindOf_varNothing_B() {
 		String varName = "varNothing";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsKindOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsKindOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -615,19 +605,17 @@
 		assertEquals(2, validationResult.getMessages().size());
 		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
 				ValidationMessageLevel.ERROR, "Nothing", 4, 14);
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(1),
-						ValidationMessageLevel.INFO,
-						"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is kind of EClassifierLiteral=B",
-						4, 35);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(1),
+				ValidationMessageLevel.INFO,
+				"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is kind of EClassifierLiteral=B",
+				4, 35);
 	}
 
 	@Test
 	public void not_oclIsKindOf_varA_B() {
 		String varName = "varA";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsKindOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsKindOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -686,8 +674,8 @@
 	@Test
 	public void not_oclIsKindOf_varB_B() {
 		String varName = "varB";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsKindOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsKindOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -704,19 +692,17 @@
 		assertEquals(b, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varB (EClassifier=B) is not kind of EClassifierLiteral=B",
-						4, 29);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varB (EClassifier=B) is not kind of EClassifierLiteral=B",
+				4, 29);
 	}
 
 	@Test
 	public void not_oclIsKindOf_varC_B() {
 		String varName = "varC";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsKindOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsKindOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -733,19 +719,17 @@
 		assertEquals(c, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varC (EClassifier=C) is not kind of EClassifierLiteral=B",
-						4, 29);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varC (EClassifier=C) is not kind of EClassifierLiteral=B",
+				4, 29);
 	}
 
 	@Test
 	public void not_oclIsKindOf_varC_O() {
 		String varName = "varC";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsKindOf(test::O)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsKindOf(test::O)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -771,8 +755,8 @@
 	@Test
 	public void not_oclIsTypeOf_varNothing_B() {
 		String varName = "varNothing";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -791,19 +775,17 @@
 		assertEquals(2, validationResult.getMessages().size());
 		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
 				ValidationMessageLevel.ERROR, "Nothing", 4, 14);
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(1),
-						ValidationMessageLevel.INFO,
-						"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is type of EClassifierLiteral=B",
-						4, 35);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(1),
+				ValidationMessageLevel.INFO,
+				"Always false:\nNothing inferred when varNothing (Nothing(Nothing)) is type of EClassifierLiteral=B",
+				4, 35);
 	}
 
 	@Test
 	public void not_oclIsTypeOf_varA_B() {
 		String varName = "varA";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -831,8 +813,8 @@
 	@Test
 	public void not_oclIsTypeOf_varB_B() {
 		String varName = "varB";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -863,8 +845,8 @@
 	@Test
 	public void not_oclIsTypeOf_varZ_Z() {
 		String varName = "varZ";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::Z)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::Z)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -881,19 +863,17 @@
 		assertEquals(z, ((EClassifierType)type).getType());
 
 		assertEquals(1, validationResult.getMessages().size());
-		ValidationTest
-				.assertValidationMessage(
-						validationResult.getMessages().get(0),
-						ValidationMessageLevel.INFO,
-						"Always true:\nNothing inferred when varZ (EClassifier=Z) is not type of EClassifierLiteral=Z",
-						4, 29);
+		ValidationTest.assertValidationMessage(validationResult.getMessages().get(0),
+				ValidationMessageLevel.INFO,
+				"Always true:\nNothing inferred when varZ (EClassifier=Z) is not type of EClassifierLiteral=Z",
+				4, 29);
 	}
 
 	@Test
 	public void not_oclIsTypeOf_varC_B() {
 		String varName = "varC";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::B)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::B)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
@@ -919,8 +899,8 @@
 	@Test
 	public void not_oclIsTypeOf_varC_O() {
 		String varName = "varC";
-		final IValidationResult validationResult = engine.validate(
-				"not " + varName + ".oclIsTypeOf(test::O)", variableTypes);
+		final IValidationResult validationResult = engine.validate("not " + varName + ".oclIsTypeOf(test::O)",
+				variableTypes);
 		final Expression ast = validationResult.getAstResult().getAst();
 
 		final Set<IType> inferredWhenTrue = validationResult.getInferredVariableTypes(ast, Boolean.TRUE).get(
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/EvaluationServicesTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/EvaluationServicesTest.java
index d6af3f8..2d4bc4b 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/EvaluationServicesTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/EvaluationServicesTest.java
@@ -10,14 +10,12 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.runtime.test;
 
-import com.google.common.collect.Lists;
-import com.google.common.collect.Sets;
-
 import java.io.IOException;
 import java.lang.reflect.InvocationTargetException;
 import java.net.URISyntaxException;
 import java.net.URL;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.Iterator;
@@ -75,7 +73,7 @@
 	EvaluationServices services;
 
 	private LinkedHashSet<Object> createSet(Object... elements) {
-		return Sets.newLinkedHashSet(Lists.newArrayList(elements));
+		return new LinkedHashSet<Object>(Arrays.asList(elements));
 	}
 
 	@Before
@@ -182,8 +180,8 @@
 		Diagnostic child = status.getChildren().iterator().next();
 		assertEquals(Diagnostic.WARNING, child.getSeverity());
 		assertNull(child.getException());
-		assertEquals("Couldn't find the 'aqlFeatureAccess(java.lang.Integer,java.lang.String)' service",
-				child.getMessage());
+		assertEquals("Couldn't find the 'aqlFeatureAccess(java.lang.Integer,java.lang.String)' service", child
+				.getMessage());
 	}
 
 	/**
@@ -294,7 +292,7 @@
 	 * </p>
 	 */
 	public void testFeatureAccessOnListOneObjectOneNonModel() {
-		List<Object> list = Lists.<Object> newArrayList(1);
+		List<Object> list = new ArrayList<Object>(Arrays.asList(1));
 		EAttribute attribute0 = (EAttribute)EcoreUtil.create(EcorePackage.Literals.EATTRIBUTE);
 		attribute0.setName("attr0");
 		list.add(attribute0);
@@ -325,7 +323,7 @@
 	 * </p>
 	 */
 	public void testFeatureAccessOnListTwoObjectsOneNonModel() {
-		List<Object> list = Lists.<Object> newArrayList();
+		List<Object> list = new ArrayList<Object>();
 		EAttribute attribute0 = (EAttribute)EcoreUtil.create(EcorePackage.Literals.EATTRIBUTE);
 		attribute0.setName("attr0");
 		EAttribute attribute1 = (EAttribute)EcoreUtil.create(EcorePackage.Literals.EATTRIBUTE);
@@ -384,7 +382,7 @@
 		EReference ref = (EReference)EcoreUtil.create(EcorePackage.Literals.EREFERENCE);
 		ref.setContainment(true);
 
-		List<EStructuralFeature> list = Lists.newArrayList(attr, ref);
+		List<EStructuralFeature> list = new ArrayList<EStructuralFeature>(Arrays.asList(attr, ref));
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply(AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, new Object[] {
 				list, "containment" }, status);
@@ -431,8 +429,8 @@
 		EAttribute attribute1 = (EAttribute)EcoreUtil.create(EcorePackage.Literals.EATTRIBUTE);
 		attribute1.setName("attr1");
 
-		List<Object> list1 = Lists.newArrayList((Object)attribute1);
-		List<Object> list0 = Lists.newArrayList(attribute0, list1);
+		List<Object> list1 = new ArrayList<Object>(Arrays.asList((Object)attribute1));
+		List<Object> list0 = new ArrayList<Object>(Arrays.asList(attribute0, list1));
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply(AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, new Object[] {
 				list0, "name" }, status);
@@ -458,7 +456,7 @@
 		attribute1.setName("attr1");
 
 		Set<Object> list1 = createSet(attribute1);
-		List<Object> list0 = Lists.newArrayList(attribute0, list1);
+		List<Object> list0 = new ArrayList<Object>(Arrays.asList(attribute0, list1));
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply(AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, new Object[] {
 				list0, "name" }, status);
@@ -480,8 +478,8 @@
 		EAttribute attribute0 = (EAttribute)EcoreUtil.create(EcorePackage.Literals.EATTRIBUTE);
 		attribute0.setName("attr0");
 
-		List<Object> list1 = Lists.newArrayList((Object)1);
-		List<Object> list0 = Lists.newArrayList(attribute0, list1);
+		List<Object> list1 = new ArrayList<Object>(Arrays.asList((Object)1));
+		List<Object> list0 = new ArrayList<Object>(Arrays.asList(attribute0, list1));
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply(AstBuilderListener.FEATURE_ACCESS_SERVICE_NAME, new Object[] {
 				list0, "name" }, status);
@@ -574,7 +572,7 @@
 	 */
 	@Test
 	public void callOrApplyOnListTest() {
-		List<Integer> list = Lists.newArrayList(1, 2);
+		List<Integer> list = new ArrayList<Integer>(Arrays.asList(1, 2));
 		Object[] args = {list };
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply("toString", args, status);
@@ -610,8 +608,8 @@
 	@SuppressWarnings("unchecked")
 	@Test
 	public void callOrApplyOnNestedList() {
-		List<Integer> list2 = Lists.newArrayList(3, 4);
-		List<Object> list1 = Lists.newArrayList(1, 2, list2);
+		List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(3, 4));
+		List<Object> list1 = new ArrayList<Object>(Arrays.asList(1, 2, list2));
 		Object[] args = {list1 };
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply("toString", args, status);
@@ -630,7 +628,7 @@
 	@Test
 	public void callOrApplyOnNestedSet() {
 		Set<Object> list2 = createSet(3, 4);
-		List<Object> list1 = Lists.newArrayList(1, 2, list2);
+		List<Object> list1 = new ArrayList<Object>(Arrays.asList(1, 2, list2));
 		Object[] args = {list1 };
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply("toString", args, status);
@@ -651,8 +649,8 @@
 	@SuppressWarnings("unchecked")
 	@Test
 	public void callOrApplySpecialOnNestedList() {
-		List<Integer> list2 = Lists.newArrayList(3);
-		List<Object> list1 = Lists.newArrayList(1, 2, list2);
+		List<Integer> list2 = new ArrayList<Integer>(Arrays.asList(3));
+		List<Object> list1 = new ArrayList<Object>(Arrays.asList(1, 2, list2));
 		Object[] args = {list1 };
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply("special", args, status);
@@ -669,7 +667,7 @@
 	 */
 	@Test
 	public void callOrapplySpecialOnList() {
-		List<Integer> list1 = Lists.newArrayList(1, 2, 3);
+		List<Integer> list1 = new ArrayList<Integer>(Arrays.asList(1, 2, 3));
 		Object[] args = {list1 };
 		Diagnostic status = new BasicDiagnostic();
 		Object result = services.callOrApply("special", args, status);
@@ -816,8 +814,8 @@
 	public void testEOperationGeneratedClass() {
 		queryEnvironment.registerEPackage(EcorePackage.eINSTANCE);
 		Diagnostic status = new BasicDiagnostic();
-		final Object result = services.call("getEClassifier",
-				new Object[] {EcorePackage.eINSTANCE, "EClass", }, status);
+		final Object result = services.call("getEClassifier", new Object[] {EcorePackage.eINSTANCE,
+				"EClass", }, status);
 		assertEquals(EcorePackage.eINSTANCE.getEClass(), result);
 	}
 
@@ -825,8 +823,8 @@
 	public void testEOperationGeneratedClassWithEObjectParameter() {
 		queryEnvironment.registerEPackage(EcorePackage.eINSTANCE);
 		Diagnostic status = new BasicDiagnostic();
-		final Object result = services.call("isSuperTypeOf", new Object[] {
-				EcorePackage.eINSTANCE.getEClass(), EcorePackage.eINSTANCE.getEPackage(), }, status);
+		final Object result = services.call("isSuperTypeOf", new Object[] {EcorePackage.eINSTANCE.getEClass(),
+				EcorePackage.eINSTANCE.getEPackage(), }, status);
 		assertEquals(false, result);
 	}
 
diff --git a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/ShortcutEvaluationTest.java b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/ShortcutEvaluationTest.java
index 4206609..cdda37e 100644
--- a/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/ShortcutEvaluationTest.java
+++ b/query/tests/org.eclipse.acceleo.query.tests/src/org/eclipse/acceleo/query/runtime/test/ShortcutEvaluationTest.java
@@ -10,8 +10,6 @@
  *******************************************************************************/
 package org.eclipse.acceleo.query.runtime.test;
 
-import com.google.common.collect.Maps;
-
 import java.util.HashMap;
 import java.util.Set;
 
@@ -45,7 +43,7 @@
 		ServiceUtils.registerServices(queryEnvironment, services);
 		parser = QueryParsing.newBuilder(queryEnvironment);
 		evaluator = QueryEvaluation.newEngine(queryEnvironment);
-		variables = Maps.newHashMap();
+		variables = new HashMap<String, Object>();
 		variables.put("self", EcorePackage.eINSTANCE);
 		evaluator.eval(parser.build("self.reset()"), variables);
 
@@ -70,24 +68,24 @@
 	@Test
 	public void andPrematureStopWhenFalse() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.FALSE, evaluator.eval(
-				parser.build("self.checkAlwaysFalse() and self.checkAlwaysTrue()"), variables).getResult());
+		assertEquals(Boolean.FALSE, evaluator.eval(parser.build(
+				"self.checkAlwaysFalse() and self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(1, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 	}
 
 	@Test
 	public void andNoStopWhenTrue() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.TRUE, evaluator.eval(
-				parser.build("self.checkAlwaysTrue() and self.checkAlwaysTrue()"), variables).getResult());
+		assertEquals(Boolean.TRUE, evaluator.eval(parser.build(
+				"self.checkAlwaysTrue() and self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(2, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 	}
 
 	@Test
 	public void orPrematureStopWhenTrue() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.TRUE, evaluator.eval(
-				parser.build("self.checkAlwaysTrue() or self.checkAlwaysTrue()"), variables).getResult());
+		assertEquals(Boolean.TRUE, evaluator.eval(parser.build(
+				"self.checkAlwaysTrue() or self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(1, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 
 	}
@@ -95,25 +93,24 @@
 	@Test
 	public void orNoStopWhenFalse() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.TRUE, evaluator.eval(
-				parser.build("self.checkAlwaysFalse() or self.checkAlwaysTrue()"), variables).getResult());
+		assertEquals(Boolean.TRUE, evaluator.eval(parser.build(
+				"self.checkAlwaysFalse() or self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(2, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 	}
 
 	@Test
 	public void impliesPrematureStopWhenFalse() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.TRUE, evaluator.eval(
-				parser.build("self.checkAlwaysFalse() implies self.checkAlwaysTrue()"), variables)
-				.getResult());
+		assertEquals(Boolean.TRUE, evaluator.eval(parser.build(
+				"self.checkAlwaysFalse() implies self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(1, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 	}
 
 	@Test
 	public void impliesNoStopWhenTrue() {
 		assertEquals(0, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
-		assertEquals(Boolean.TRUE, evaluator.eval(
-				parser.build("self.checkAlwaysTrue() implies self.checkAlwaysTrue()"), variables).getResult());
+		assertEquals(Boolean.TRUE, evaluator.eval(parser.build(
+				"self.checkAlwaysTrue() implies self.checkAlwaysTrue()"), variables).getResult());
 		assertEquals(2, evaluator.eval(parser.build("self.getCallCounts()"), variables).getResult());
 	}
 
diff --git a/tests/org.eclipse.acceleo.ide.ui.tests/META-INF/MANIFEST.MF b/tests/org.eclipse.acceleo.ide.ui.tests/META-INF/MANIFEST.MF
index e8f0cc5..1f3bf9a 100644
--- a/tests/org.eclipse.acceleo.ide.ui.tests/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.acceleo.ide.ui.tests/META-INF/MANIFEST.MF
@@ -21,6 +21,5 @@
  org.eclipse.swtbot.eclipse.core,
  org.eclipse.swtbot.eclipse.finder,
  org.eclipse.jdt.core,
- com.google.guava;bundle-version="10.0.1",
  org.eclipse.ui
 Export-Package: org.eclipse.acceleo.ide.ui.tests.suite;x-friends:="org.eclipse.acceleo.tests"
diff --git a/tests/org.eclipse.acceleo.ide.ui.tests/src/org/eclipse/acceleo/ide/ui/tests/builder/AcceleoBuilderTests.java b/tests/org.eclipse.acceleo.ide.ui.tests/src/org/eclipse/acceleo/ide/ui/tests/builder/AcceleoBuilderTests.java
index c5f128d..614932c 100644
--- a/tests/org.eclipse.acceleo.ide.ui.tests/src/org/eclipse/acceleo/ide/ui/tests/builder/AcceleoBuilderTests.java
+++ b/tests/org.eclipse.acceleo.ide.ui.tests/src/org/eclipse/acceleo/ide/ui/tests/builder/AcceleoBuilderTests.java
@@ -10,12 +10,15 @@
  *******************************************************************************/
 package org.eclipse.acceleo.ide.ui.tests.builder;
 
-import com.google.common.collect.Sets;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.fail;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collections;
+import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Set;
 
@@ -48,9 +51,6 @@
 import org.junit.BeforeClass;
 import org.junit.Test;
 
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.fail;
-
 public class AcceleoBuilderTests {
 
 	@BeforeClass
@@ -172,8 +172,9 @@
 			// Check the existence of the output files
 			File src = project.getFolder("src").getLocation().toFile(); //$NON-NLS-1$
 			File bin = project.getFolder("bin").getLocation().toFile(); //$NON-NLS-1$
-			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), Sets
-					.newHashSet(new AcceleoProjectClasspathEntry(src, bin)));
+			Set<AcceleoProjectClasspathEntry> classPath = new LinkedHashSet<AcceleoProjectClasspathEntry>(
+					Arrays.asList(new AcceleoProjectClasspathEntry(src, bin)));
+			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), classPath);
 			Set<File> compiledAcceleoModules = acceleoProject.getAllCompiledAcceleoModules();
 			assertEquals(1, compiledAcceleoModules.size());
 			assertEquals("commonModule.emtl", compiledAcceleoModules.iterator().next().getName()); //$NON-NLS-1$
@@ -181,7 +182,8 @@
 			IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 			for (IMarker iMarker : markers) {
 				Object attribute = iMarker.getAttribute(IMarker.SEVERITY);
-				if (attribute instanceof Integer && ((Integer)attribute).intValue() == IMarker.SEVERITY_ERROR) {
+				if (attribute instanceof Integer && ((Integer)attribute)
+						.intValue() == IMarker.SEVERITY_ERROR) {
 					fail(iMarker.getAttribute(IMarker.MESSAGE).toString());
 				}
 			}
@@ -236,8 +238,9 @@
 			// Check the existence of the output files
 			File src = project.getFolder("src").getLocation().toFile(); //$NON-NLS-1$
 			File bin = project.getFolder("bin").getLocation().toFile(); //$NON-NLS-1$
-			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), Sets
-					.newHashSet(new AcceleoProjectClasspathEntry(src, bin)));
+			Set<AcceleoProjectClasspathEntry> classPath = new LinkedHashSet<AcceleoProjectClasspathEntry>(
+					Arrays.asList(new AcceleoProjectClasspathEntry(src, bin)));
+			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), classPath);
 			Set<File> compiledAcceleoModules = acceleoProject.getAllCompiledAcceleoModules();
 			assertEquals(1, compiledAcceleoModules.size());
 			assertEquals("commonModule.emtl", compiledAcceleoModules.iterator().next().getName()); //$NON-NLS-1$
@@ -246,7 +249,8 @@
 			boolean foundError = false;
 			for (IMarker iMarker : markers) {
 				Object attribute = iMarker.getAttribute(IMarker.SEVERITY);
-				if (attribute instanceof Integer && ((Integer)attribute).intValue() == IMarker.SEVERITY_ERROR) {
+				if (attribute instanceof Integer && ((Integer)attribute)
+						.intValue() == IMarker.SEVERITY_ERROR) {
 					foundError = true;
 				}
 			}
@@ -281,11 +285,15 @@
 			StringBuffer buffer = new StringBuffer();
 			buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + ls); //$NON-NLS-1$
 			buffer.append("<ecore:EPackage xmi:version=\"2.0\"" + ls); //$NON-NLS-1$
-			buffer.append("    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" //$NON-NLS-1$
+							+ ls);
 			buffer.append("    xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\" name=\"target\"" + ls); //$NON-NLS-1$
 			buffer.append("    nsURI=\"" + nsURI + "\" nsPrefix=\"target\">" + ls); //$NON-NLS-1$ //$NON-NLS-2$
 			buffer.append("  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseA\">" + ls); //$NON-NLS-1$
-			buffer.append("    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" //$NON-NLS-1$
+							+ ls);
 			buffer.append("  </eClassifiers>" + ls); //$NON-NLS-1$
 			buffer.append("</ecore:EPackage>" + ls); //$NON-NLS-1$
 			modelFile.create(new ByteArrayInputStream(buffer.toString().getBytes()), true, monitor);
@@ -334,8 +342,9 @@
 			// Check the existence of the output files
 			File src = project.getFolder("src").getLocation().toFile(); //$NON-NLS-1$
 			File bin = project.getFolder("bin").getLocation().toFile(); //$NON-NLS-1$
-			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), Sets
-					.newHashSet(new AcceleoProjectClasspathEntry(src, bin)));
+			Set<AcceleoProjectClasspathEntry> classPath = new LinkedHashSet<AcceleoProjectClasspathEntry>(
+					Arrays.asList(new AcceleoProjectClasspathEntry(src, bin)));
+			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), classPath);
 			Set<File> compiledAcceleoModules = acceleoProject.getAllCompiledAcceleoModules();
 			assertEquals(1, compiledAcceleoModules.size());
 			assertEquals("commonModule.emtl", compiledAcceleoModules.iterator().next().getName()); //$NON-NLS-1$
@@ -343,7 +352,8 @@
 			IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 			for (IMarker iMarker : markers) {
 				Object attribute = iMarker.getAttribute(IMarker.SEVERITY);
-				if (attribute instanceof Integer && ((Integer)attribute).intValue() == IMarker.SEVERITY_ERROR) {
+				if (attribute instanceof Integer && ((Integer)attribute)
+						.intValue() == IMarker.SEVERITY_ERROR) {
 					fail(iMarker.getAttribute(IMarker.MESSAGE).toString());
 				}
 			}
@@ -378,11 +388,17 @@
 			StringBuffer buffer = new StringBuffer();
 			buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + ls); //$NON-NLS-1$
 			buffer.append("<ecore:EPackage xmi:version=\"2.0\"" + ls); //$NON-NLS-1$
-			buffer.append("    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" //$NON-NLS-1$
+							+ ls);
 			buffer.append("    xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\" name=\"target\"" + ls); //$NON-NLS-1$
 			buffer.append("    nsURI=\"" + nsURI + "\" nsPrefix=\"target\">" + ls); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseA\" eSuperTypes=\"platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EClass\">" + ls); //$NON-NLS-1$
-			buffer.append("    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" + ls); //$NON-NLS-1$
+			buffer.append(
+					"  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseA\" eSuperTypes=\"platform:/plugin/org.eclipse.emf.ecore/model/Ecore.ecore#//EClass\">" //$NON-NLS-1$
+							+ ls);
+			buffer.append(
+					"    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" //$NON-NLS-1$
+							+ ls);
 			buffer.append("  </eClassifiers>" + ls); //$NON-NLS-1$
 			buffer.append("</ecore:EPackage>" + ls); //$NON-NLS-1$
 			modelFile.create(new ByteArrayInputStream(buffer.toString().getBytes()), true, monitor);
@@ -398,9 +414,8 @@
 		AcceleoModule acceleoModule = AcceleowizardmodelFactory.eINSTANCE.createAcceleoModule();
 		acceleoModule.setName("commonModule"); //$NON-NLS-1$
 		acceleoModule.setProjectName(projectName);
-		acceleoModule
-				.setParentFolder(projectName
-						+ "/src/org/eclipse/acceleo/ide/ui/tests/builder/metamodelinworkspacedependingonmetamodelinplugin/common"); //$NON-NLS-1$
+		acceleoModule.setParentFolder(projectName
+				+ "/src/org/eclipse/acceleo/ide/ui/tests/builder/metamodelinworkspacedependingonmetamodelinplugin/common"); //$NON-NLS-1$
 		acceleoModule.setIsInitialized(false);
 		acceleoModule.setGenerateDocumentation(true);
 		acceleoModule.getMetamodelURIs().add("http://www.eclipse.org/emf/2002/Ecore"); //$NON-NLS-1$
@@ -433,8 +448,9 @@
 			// Check the existence of the output files
 			File src = project.getFolder("src").getLocation().toFile(); //$NON-NLS-1$
 			File bin = project.getFolder("bin").getLocation().toFile(); //$NON-NLS-1$
-			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), Sets
-					.newHashSet(new AcceleoProjectClasspathEntry(src, bin)));
+			Set<AcceleoProjectClasspathEntry> classPath = new LinkedHashSet<AcceleoProjectClasspathEntry>(
+					Arrays.asList(new AcceleoProjectClasspathEntry(src, bin)));
+			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), classPath);
 			Set<File> compiledAcceleoModules = acceleoProject.getAllCompiledAcceleoModules();
 			assertEquals(1, compiledAcceleoModules.size());
 			assertEquals("commonModule.emtl", compiledAcceleoModules.iterator().next().getName()); //$NON-NLS-1$
@@ -442,7 +458,8 @@
 			IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 			for (IMarker iMarker : markers) {
 				Object attribute = iMarker.getAttribute(IMarker.SEVERITY);
-				if (attribute instanceof Integer && ((Integer)attribute).intValue() == IMarker.SEVERITY_ERROR) {
+				if (attribute instanceof Integer && ((Integer)attribute)
+						.intValue() == IMarker.SEVERITY_ERROR) {
 					fail(iMarker.getAttribute(IMarker.MESSAGE).toString());
 				}
 			}
@@ -478,11 +495,15 @@
 			StringBuffer buffer = new StringBuffer();
 			buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + ls); //$NON-NLS-1$
 			buffer.append("<ecore:EPackage xmi:version=\"2.0\"" + ls); //$NON-NLS-1$
-			buffer.append("    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" //$NON-NLS-1$
+							+ ls);
 			buffer.append("    xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\" name=\"target\"" + ls); //$NON-NLS-1$
 			buffer.append("    nsURI=\"" + nsURI + "\" nsPrefix=\"target\">" + ls); //$NON-NLS-1$ //$NON-NLS-2$
 			buffer.append("  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseA\">" + ls); //$NON-NLS-1$
-			buffer.append("    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"name\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" //$NON-NLS-1$
+							+ ls);
 			buffer.append("  </eClassifiers>" + ls); //$NON-NLS-1$
 			buffer.append("</ecore:EPackage>" + ls); //$NON-NLS-1$
 			modelFile.create(new ByteArrayInputStream(buffer.toString().getBytes()), true, monitor);
@@ -492,11 +513,17 @@
 			buffer = new StringBuffer();
 			buffer.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>" + ls); //$NON-NLS-1$
 			buffer.append("<ecore:EPackage xmi:version=\"2.0\"" + ls); //$NON-NLS-1$
-			buffer.append("    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" + ls); //$NON-NLS-1$
+			buffer.append(
+					"    xmlns:xmi=\"http://www.omg.org/XMI\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"" //$NON-NLS-1$
+							+ ls);
 			buffer.append("    xmlns:ecore=\"http://www.eclipse.org/emf/2002/Ecore\" name=\"target\"" + ls); //$NON-NLS-1$
 			buffer.append("    nsURI=\"" + nsURI2 + "\" nsPrefix=\"target\">" + ls); //$NON-NLS-1$ //$NON-NLS-2$
-			buffer.append("  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseB\" eSuperTypes=\"model1.ecore#//ClassA\">" + ls); //$NON-NLS-1$
-			buffer.append("    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"othername\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" + ls); //$NON-NLS-1$
+			buffer.append(
+					"  <eClassifiers xsi:type=\"ecore:EClass\" name=\"ClasseB\" eSuperTypes=\"model1.ecore#//ClassA\">" //$NON-NLS-1$
+							+ ls);
+			buffer.append(
+					"    <eStructuralFeatures xsi:type=\"ecore:EAttribute\" name=\"othername\" eType=\"ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString\"/>" //$NON-NLS-1$
+							+ ls);
 			buffer.append("  </eClassifiers>" + ls); //$NON-NLS-1$
 			buffer.append("</ecore:EPackage>" + ls); //$NON-NLS-1$
 			modelFile2.create(new ByteArrayInputStream(buffer.toString().getBytes()), true, monitor);
@@ -512,9 +539,8 @@
 		AcceleoModule acceleoModule = AcceleowizardmodelFactory.eINSTANCE.createAcceleoModule();
 		acceleoModule.setName("commonModule"); //$NON-NLS-1$
 		acceleoModule.setProjectName(projectName);
-		acceleoModule
-				.setParentFolder(projectName
-						+ "/src/org/eclipse/acceleo/ide/ui/tests/builder/metamodelinworkspacedependingonmetamodelinworkspace/common"); //$NON-NLS-1$
+		acceleoModule.setParentFolder(projectName
+				+ "/src/org/eclipse/acceleo/ide/ui/tests/builder/metamodelinworkspacedependingonmetamodelinworkspace/common"); //$NON-NLS-1$
 		acceleoModule.setIsInitialized(false);
 		acceleoModule.setGenerateDocumentation(true);
 		acceleoModule.getMetamodelURIs().add(nsURI);
@@ -547,8 +573,9 @@
 			// Check the existence of the output files
 			File src = project.getFolder("src").getLocation().toFile(); //$NON-NLS-1$
 			File bin = project.getFolder("bin").getLocation().toFile(); //$NON-NLS-1$
-			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), Sets
-					.newHashSet(new AcceleoProjectClasspathEntry(src, bin)));
+			Set<AcceleoProjectClasspathEntry> classPath = new LinkedHashSet<AcceleoProjectClasspathEntry>(
+					Arrays.asList(new AcceleoProjectClasspathEntry(src, bin)));
+			AcceleoProject acceleoProject = new AcceleoProject(project.getLocation().toFile(), classPath);
 			Set<File> compiledAcceleoModules = acceleoProject.getAllCompiledAcceleoModules();
 			assertEquals(1, compiledAcceleoModules.size());
 			assertEquals("commonModule.emtl", compiledAcceleoModules.iterator().next().getName()); //$NON-NLS-1$
@@ -556,7 +583,8 @@
 			IMarker[] markers = project.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 			for (IMarker iMarker : markers) {
 				Object attribute = iMarker.getAttribute(IMarker.SEVERITY);
-				if (attribute instanceof Integer && ((Integer)attribute).intValue() == IMarker.SEVERITY_ERROR) {
+				if (attribute instanceof Integer && ((Integer)attribute)
+						.intValue() == IMarker.SEVERITY_ERROR) {
 					fail(iMarker.getAttribute(IMarker.MESSAGE).toString());
 				}
 			}
