diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest.java
index 2d91122..f3eb635 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest.java
@@ -1,194 +1,22 @@
 /*******************************************************************************
- * Copyright (c) 2010, 2015 Willink Transformations and others.
+ * Copyright (c) 2016 Willink Transformations and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
  * http://www.eclipse.org/legal/epl-v10.html
  *
  * Contributors:
- *   L.Goubet, E.D.Willink - Initial API and implementation
- *   E.D.Willink (CEA LIST) - Bug 388529
+ *   E.D.Willink - Initial API and implementation
  *******************************************************************************/
 
 package org.eclipse.ocl.examples.pivot.tests;
 
-import org.eclipse.jdt.annotation.NonNull;
-import org.eclipse.ocl.pivot.Model;
-import org.eclipse.ocl.pivot.Type;
-import org.eclipse.ocl.pivot.ids.CollectionTypeId;
-import org.eclipse.ocl.pivot.ids.IdResolver;
-import org.eclipse.ocl.pivot.ids.TypeId;
-import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
-import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
-import org.eclipse.ocl.pivot.utilities.ClassUtil;
-import org.eclipse.ocl.pivot.utilities.MetamodelManager;
-import org.eclipse.ocl.pivot.utilities.OCL;
-import org.eclipse.ocl.pivot.utilities.PivotUtil;
-import org.eclipse.ocl.xtext.base.services.BaseLinkingService;
-
 /**
  * Tests for OclAny operations.
  */
-@SuppressWarnings("nls")
-public class EvaluateClassifierOperationsTest extends PivotTestSuite
+public class EvaluateClassifierOperationsTest extends EvaluateClassifierOperationsTest4
 {
-	public static class MyOCL extends TestOCL
-	{
-        // need a metamodel that has a reflexive EReference.
-        // Ecore will do nicely. Create the following structure:
-        // pkg1
-        // pkg1::pkg2
-        // pkg1::pkg2::jim
-        // pkg1::bob
-        // pkg1::pkg3
-        // pkg1::pkg3::pkg4
-        // pkg1::pkg3::pkg5
-        // pkg1::pkg3::pkg5::george
-        @NonNull Model root = PivotUtil.createModel(null);
-        org.eclipse.ocl.pivot.@NonNull Package pkg1 = PivotUtil.createOwnedPackage(root, "pkg1");
-        org.eclipse.ocl.pivot.@NonNull Package pkg2 = PivotUtil.createOwnedPackage(pkg1, "pkg2");
-        org.eclipse.ocl.pivot.@NonNull Package jim = PivotUtil.createOwnedPackage(pkg2, "jim");
-        org.eclipse.ocl.pivot.@NonNull Package bob = PivotUtil.createOwnedPackage(pkg1, "bob");
-        org.eclipse.ocl.pivot.@NonNull Package pkg3 = PivotUtil.createOwnedPackage(pkg1, "pkg3");
-        org.eclipse.ocl.pivot.@NonNull Package pkg4 = PivotUtil.createOwnedPackage(pkg3, "pkg4");
-        org.eclipse.ocl.pivot.@NonNull Package pkg5 = PivotUtil.createOwnedPackage(pkg3, "pkg5");
-        org.eclipse.ocl.pivot.@NonNull Package george = PivotUtil.createOwnedPackage(pkg5, "george");
-		
-		public MyOCL(@NonNull String testPackageName, @NonNull String name) {
-			super(testPackageName, name, OCL.NO_PROJECTS);
-			MetamodelManagerInternal metamodelManager = getMetamodelManager();
-//			metamodelManager.addGlobalNamespace(PivotConstants.OCL_NAME, ClassUtil.nonNullState(metamodelManager.getASmetamodel()));
-
-	        metamodelManager.installRoot(ClassUtil.nonNullState(root));
-//	        helper.setContext(ClassUtil.nonNullState(metamodelManager.getPivotType("Package")));
-		}
-	}
-
 	public EvaluateClassifierOperationsTest() {
 		super(false);
 	}
-
-	@Override
-	protected @NonNull MyOCL createOCL() {
-		return new MyOCL(getTestPackageName(), getName());
-	}
-
-	@Override
-    protected void setUp() throws Exception {
-		BaseLinkingService.DEBUG_RETRY.setState(true);
-        super.setUp();
-    }
-
-	/**
-	 * Tests the allInstances() operator.
-	 */
-	public void test_allInstances() {
-		MyOCL ocl = createOCL();
-		MetamodelManager metamodelManager = ocl.getMetamodelManager();
-		try {
-			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
-			ocl.assertQueryResults(null, "Set{CollectionKind::Bag,CollectionKind::Collection,CollectionKind::_'OrderedSet',CollectionKind::_'Sequence',CollectionKind::_'Set'}", "CollectionKind.allInstances()");
-			ocl.assertQueryResults(null, "Set{true,false}", "Boolean.allInstances()");
-			ocl.assertQueryResults(null, "Set{null}", "OclVoid.allInstances()");
-			ocl.assertQueryResults(null, "Set{}", "ocl::Package.allInstances()");
-			ocl.assertQueryEquals(ocl.pkg1, 8, "Package.allInstances()->size()");
-			ocl.assertSemanticErrorQuery(classType, "Integer.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Integer", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "String.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "String", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "Set(Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "OclAny.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "OclAny", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "4.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Integer", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "true.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Boolean", "allInstances", "");
-	//		ocl.assertQueryInvalid(null, "true.allInstances()");
-	//		ocl.assertQueryResults(null, "Set{true,false}", "true.allInstances()");
-			ocl.assertSemanticErrorQuery(classType, "Set{1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Set(Integer)[*|1]", "allInstances", "");
-			ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
-			ocl.assertQueryInvalid(null, "OclInvalid.allInstances()");
-		} finally {
-			ocl.dispose();
-		}
-	}
-	
-	/**
-	 * Tests the conformsTo() operator.
-	 */
-	public void test_conformsTo() {
-		MyOCL ocl = createOCL();
-		try {
-	//		ocl.assertQueryTrue(null, "true.conformsTo(Boolean)");
-			ocl.assertQueryTrue(null, "Boolean.conformsTo(Boolean)");
-			ocl.assertQueryFalse(null, "String.conformsTo(Boolean)");
-			ocl.assertQueryFalse(null, "Boolean.conformsTo(String)");
-			ocl.assertQueryTrue(null, "Integer.conformsTo(Real)");
-			ocl.assertQueryFalse(null, "UnlimitedNatural.conformsTo(Integer)");
-			ocl.assertQueryFalse(null, "UnlimitedNatural.conformsTo(Real)");
-			ocl.assertQueryFalse(null, "Real.conformsTo(Integer)");
-			ocl.assertQueryFalse(null, "Real.conformsTo(UnlimitedNatural)");
-			ocl.assertQueryFalse(null, "Integer.conformsTo(UnlimitedNatural)");
-			//FIXME much more
-		} finally {
-			ocl.dispose();
-		}
-	}
-	
-	/**
-	 * Tests the oclContainer() operator.
-	 */
-	public void test_oclContainer() {
-		MyOCL ocl = createOCL();
-		MetamodelManager metamodelManager = ocl.getMetamodelManager();
-		try {
-			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
-			ocl.assertSemanticErrorQuery(classType, "invalid.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclInvalid", "oclContainer");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContainer()");
-			ocl.assertSemanticErrorQuery(classType, "null.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclVoid", "oclContainer");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContainer()");
-			ocl.assertQueryResults(ocl.root, "null", "oclContainer()");
-			ocl.assertQueryEquals(ocl.pkg2, ocl.pkg1, "oclContainer()");
-			ocl.assertSemanticErrorQuery(classType, "1.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "Integer", "oclContainer");
-			//
-			ocl.assertSemanticErrorQuery(classType, "invalid.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclInvalid", "oclContainer");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContainer");
-			ocl.assertSemanticErrorQuery(classType, "null.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclVoid", "oclContainer");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContainer");
-			ocl.assertQueryResults(ocl.root, "null", "oclContainer");
-			ocl.assertQueryEquals(ocl.pkg2, ocl.pkg1, "oclContainer");
-			ocl.assertSemanticErrorQuery(classType, "1.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Integer", "oclContainer");
-		} finally {
-			ocl.dispose();
-		}
-	}
-	
-	/**
-	 * Tests the oclContents() operator.
-	 */
-	public void test_oclContents() {
-		MyOCL ocl = createOCL();
-		MetamodelManager metamodelManager = ocl.getMetamodelManager();
-		try {
-			IdResolver idResolver = metamodelManager.getEnvironmentFactory().getIdResolver();
-			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
-	    	@SuppressWarnings("null") @NonNull Type packageType = metamodelManager.getASClass("Package");
-			CollectionTypeId typeId = TypeId.SET.getSpecializedId(packageType.getTypeId());
-			ocl.assertSemanticErrorQuery(classType, "invalid.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclInvalid", "oclContents");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContents()");
-			ocl.assertSemanticErrorQuery(classType, "null.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclVoid", "oclContents");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContents()");
-			ocl.assertQueryEquals(ocl.pkg1, idResolver.createSetOfEach(typeId, ocl.bob, ocl.pkg2, ocl.pkg3), "oclContents()");
-			ocl.assertQueryEquals(ocl.pkg2, idResolver.createSetOfEach(typeId, ocl.jim), "oclContents()");
-			ocl.assertQueryEquals(ocl.george, idResolver.createSetOfEach(typeId), "oclContents()");
-			ocl.assertSemanticErrorQuery(classType, "1.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "Integer", "oclContents");
-			//
-			ocl.assertSemanticErrorQuery(classType, "invalid.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclInvalid", "oclContents");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContents");
-			ocl.assertSemanticErrorQuery(classType, "null.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclVoid", "oclContents");
-			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContents");
-			ocl.assertQueryEquals(ocl.pkg1, idResolver.createSetOfEach(typeId, ocl.bob, ocl.pkg2, ocl.pkg3), "oclContents");
-			ocl.assertQueryEquals(ocl.pkg2, idResolver.createSetOfEach(typeId, ocl.jim), "oclContents");
-			ocl.assertQueryEquals(ocl.george, idResolver.createSetOfEach(typeId), "oclContents");
-			ocl.assertSemanticErrorQuery(classType, "1.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Integer", "oclContents");
-		} finally {
-			ocl.dispose();
-		}
-	}
 }
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
new file mode 100644
index 0000000..c679ecd
--- /dev/null
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/pivot/tests/EvaluateClassifierOperationsTest4.java
@@ -0,0 +1,216 @@
+/*******************************************************************************
+ * Copyright (c) 2010, 2015 Willink Transformations and others.
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ *   L.Goubet, E.D.Willink - Initial API and implementation
+ *   E.D.Willink (CEA LIST) - Bug 388529
+ *******************************************************************************/
+
+package org.eclipse.ocl.examples.pivot.tests;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.ocl.pivot.Model;
+import org.eclipse.ocl.pivot.Type;
+import org.eclipse.ocl.pivot.ids.CollectionTypeId;
+import org.eclipse.ocl.pivot.ids.IdResolver;
+import org.eclipse.ocl.pivot.ids.TypeId;
+import org.eclipse.ocl.pivot.internal.manager.MetamodelManagerInternal;
+import org.eclipse.ocl.pivot.internal.messages.PivotMessagesInternal;
+import org.eclipse.ocl.pivot.resource.ProjectManager;
+import org.eclipse.ocl.pivot.utilities.ClassUtil;
+import org.eclipse.ocl.pivot.utilities.MetamodelManager;
+import org.eclipse.ocl.pivot.utilities.OCL;
+import org.eclipse.ocl.pivot.utilities.PivotUtil;
+import org.eclipse.ocl.xtext.base.services.BaseLinkingService;
+import org.junit.After;
+import org.junit.Before;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/**
+ * Tests for OclAny operations.
+ */
+@SuppressWarnings("nls")
+@RunWith(value = Parameterized.class)
+public class EvaluateClassifierOperationsTest4 extends PivotTestSuite
+{
+	@Parameters
+	public static Collection<Object[]> data() {
+		Object[][] data = new Object[][]{{false}, {true}};
+		return Arrays.asList(data);
+	}
+
+	public static class MyOCL extends TestOCL
+	{
+        // need a metamodel that has a reflexive EReference.
+        // Ecore will do nicely. Create the following structure:
+        // pkg1
+        // pkg1::pkg2
+        // pkg1::pkg2::jim
+        // pkg1::bob
+        // pkg1::pkg3
+        // pkg1::pkg3::pkg4
+        // pkg1::pkg3::pkg5
+        // pkg1::pkg3::pkg5::george
+        @NonNull Model root = PivotUtil.createModel(null);
+        org.eclipse.ocl.pivot.@NonNull Package pkg1 = PivotUtil.createOwnedPackage(root, "pkg1");
+        org.eclipse.ocl.pivot.@NonNull Package pkg2 = PivotUtil.createOwnedPackage(pkg1, "pkg2");
+        org.eclipse.ocl.pivot.@NonNull Package jim = PivotUtil.createOwnedPackage(pkg2, "jim");
+        org.eclipse.ocl.pivot.@NonNull Package bob = PivotUtil.createOwnedPackage(pkg1, "bob");
+        org.eclipse.ocl.pivot.@NonNull Package pkg3 = PivotUtil.createOwnedPackage(pkg1, "pkg3");
+        org.eclipse.ocl.pivot.@NonNull Package pkg4 = PivotUtil.createOwnedPackage(pkg3, "pkg4");
+        org.eclipse.ocl.pivot.@NonNull Package pkg5 = PivotUtil.createOwnedPackage(pkg3, "pkg5");
+        org.eclipse.ocl.pivot.@NonNull Package george = PivotUtil.createOwnedPackage(pkg5, "george");
+		
+		public MyOCL(@NonNull String testPackageName, @NonNull String name, @NonNull ProjectManager projectManager) {
+			super(testPackageName, name, projectManager);
+			MetamodelManagerInternal metamodelManager = getMetamodelManager();
+//			metamodelManager.addGlobalNamespace(PivotConstants.OCL_NAME, ClassUtil.nonNullState(metamodelManager.getASmetamodel()));
+
+	        metamodelManager.installRoot(ClassUtil.nonNullState(root));
+//	        helper.setContext(ClassUtil.nonNullState(metamodelManager.getPivotType("Package")));
+		}
+	}
+
+	public EvaluateClassifierOperationsTest4(boolean useCodeGen) {
+		super(useCodeGen);
+	}
+
+//	@Override
+	protected @NonNull MyOCL createOCL(@NonNull ProjectManager classPath) {
+		return new MyOCL(getTestPackageName(), getName(), classPath);
+	}
+
+	@Override
+	@Before public void setUp() throws Exception {
+		BaseLinkingService.DEBUG_RETRY.setState(true);
+        super.setUp();
+    }
+
+	@Override
+	@After public void tearDown() throws Exception {
+		super.tearDown();
+	}
+
+	/**
+	 * Tests the allInstances() operator.
+	 */
+	@Test public void test_allInstances() {
+		MyOCL ocl = createOCL(OCL.NO_PROJECTS);
+		MetamodelManager metamodelManager = ocl.getMetamodelManager();
+		try {
+			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
+			ocl.assertQueryResults(null, "Set{CollectionKind::Bag,CollectionKind::Collection,CollectionKind::_'OrderedSet',CollectionKind::_'Sequence',CollectionKind::_'Set'}", "CollectionKind.allInstances()");
+			ocl.assertQueryResults(null, "Set{true,false}", "Boolean.allInstances()");
+			ocl.assertQueryResults(null, "Set{null}", "OclVoid.allInstances()");
+			ocl.assertQueryResults(null, "Set{}", "ocl::Package.allInstances()");
+			ocl.assertQueryEquals(ocl.pkg1, 8, "Package.allInstances()->size()");
+			ocl.assertSemanticErrorQuery(classType, "Integer.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Integer", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "String.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "String", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "Set(Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Set(Integer)", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "Tuple(a:Integer).allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "OclAny.allInstances()", PivotMessagesInternal.UnresolvedStaticOperationCall_ERROR_, "OclAny", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "4.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Integer", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "true.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Boolean", "allInstances", "");
+	//		ocl.assertQueryInvalid(null, "true.allInstances()");
+	//		ocl.assertQueryResults(null, "Set{true,false}", "true.allInstances()");
+			ocl.assertSemanticErrorQuery(classType, "Set{1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Set(Integer)[*|1]", "allInstances", "");
+			ocl.assertSemanticErrorQuery(classType, "Tuple{a:Integer=1}.allInstances()", PivotMessagesInternal.UnresolvedOperationCall_ERROR_, "Tuple(a:Integer[1])", "allInstances", "");
+			ocl.assertQueryInvalid(null, "OclInvalid.allInstances()");
+		} finally {
+			ocl.dispose();
+		}
+	}
+	
+	/**
+	 * Tests the conformsTo() operator.
+	 */
+	@Test public void test_conformsTo() {
+		MyOCL ocl = createOCL(OCL.NO_PROJECTS);
+		try {
+	//		ocl.assertQueryTrue(null, "true.conformsTo(Boolean)");
+			ocl.assertQueryTrue(null, "Boolean.conformsTo(Boolean)");
+			ocl.assertQueryFalse(null, "String.conformsTo(Boolean)");
+			ocl.assertQueryFalse(null, "Boolean.conformsTo(String)");
+			ocl.assertQueryTrue(null, "Integer.conformsTo(Real)");
+			ocl.assertQueryFalse(null, "UnlimitedNatural.conformsTo(Integer)");
+			ocl.assertQueryFalse(null, "UnlimitedNatural.conformsTo(Real)");
+			ocl.assertQueryFalse(null, "Real.conformsTo(Integer)");
+			ocl.assertQueryFalse(null, "Real.conformsTo(UnlimitedNatural)");
+			ocl.assertQueryFalse(null, "Integer.conformsTo(UnlimitedNatural)");
+			//FIXME much more
+		} finally {
+			ocl.dispose();
+		}
+	}
+	
+	/**
+	 * Tests the oclContainer() operator.
+	 */
+	@Test public void test_oclContainer() {
+		MyOCL ocl = createOCL(OCL.CLASS_PATH);
+		MetamodelManager metamodelManager = ocl.getMetamodelManager();
+		try {
+			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
+			ocl.assertSemanticErrorQuery(classType, "invalid.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclInvalid", "oclContainer");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContainer()");
+			ocl.assertSemanticErrorQuery(classType, "null.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclVoid", "oclContainer");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContainer()");
+			ocl.assertQueryResults(ocl.root, "null", "oclContainer()");
+			ocl.assertQueryEquals(ocl.pkg2, ocl.pkg1, "oclContainer()");
+			ocl.assertSemanticErrorQuery(classType, "1.oclContainer()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "Integer", "oclContainer");
+			//
+			ocl.assertSemanticErrorQuery(classType, "invalid.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclInvalid", "oclContainer");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContainer");
+			ocl.assertSemanticErrorQuery(classType, "null.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclVoid", "oclContainer");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContainer");
+			ocl.assertQueryResults(ocl.root, "null", "oclContainer");
+			ocl.assertQueryEquals(ocl.pkg2, ocl.pkg1, "oclContainer");
+			ocl.assertSemanticErrorQuery(classType, "1.oclContainer", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Integer", "oclContainer");
+		} finally {
+			ocl.dispose();
+		}
+	}
+	
+	/**
+	 * Tests the oclContents() operator.
+	 */
+	@Test public void test_oclContents() {
+		MyOCL ocl = createOCL(OCL.NO_PROJECTS);
+		MetamodelManager metamodelManager = ocl.getMetamodelManager();
+		try {
+			IdResolver idResolver = metamodelManager.getEnvironmentFactory().getIdResolver();
+			org.eclipse.ocl.pivot.Class classType = metamodelManager.getStandardLibrary().getClassType();
+	    	@SuppressWarnings("null") @NonNull Type packageType = metamodelManager.getASClass("Package");
+			CollectionTypeId typeId = TypeId.SET.getSpecializedId(packageType.getTypeId());
+			ocl.assertSemanticErrorQuery(classType, "invalid.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclInvalid", "oclContents");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContents()");
+			ocl.assertSemanticErrorQuery(classType, "null.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "OclVoid", "oclContents");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContents()");
+			ocl.assertQueryEquals(ocl.pkg1, idResolver.createSetOfEach(typeId, ocl.bob, ocl.pkg2, ocl.pkg3), "oclContents()");
+			ocl.assertQueryEquals(ocl.pkg2, idResolver.createSetOfEach(typeId, ocl.jim), "oclContents()");
+			ocl.assertQueryEquals(ocl.george, idResolver.createSetOfEach(typeId), "oclContents()");
+			ocl.assertSemanticErrorQuery(classType, "1.oclContents()", PivotMessagesInternal.UnresolvedOperation_ERROR_, "Integer", "oclContents");
+			//
+			ocl.assertSemanticErrorQuery(classType, "invalid.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclInvalid", "oclContents");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = invalid in s.oclContents");
+			ocl.assertSemanticErrorQuery(classType, "null.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "OclVoid", "oclContents");
+			ocl.assertQueryInvalid(ocl.pkg2, "let s : OclElement = null in s.oclContents");
+			ocl.assertQueryEquals(ocl.pkg1, idResolver.createSetOfEach(typeId, ocl.bob, ocl.pkg2, ocl.pkg3), "oclContents");
+			ocl.assertQueryEquals(ocl.pkg2, idResolver.createSetOfEach(typeId, ocl.jim), "oclContents");
+			ocl.assertQueryEquals(ocl.george, idResolver.createSetOfEach(typeId), "oclContents");
+			ocl.assertSemanticErrorQuery(classType, "1.oclContents", PivotMessagesInternal.UnresolvedProperty_ERROR_, "Integer", "oclContents");
+		} finally {
+			ocl.dispose();
+		}
+	}
+}
diff --git a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/AllEvaluationTests.java b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/AllEvaluationTests.java
index 6ccffa4..93ad521 100644
--- a/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/AllEvaluationTests.java
+++ b/tests/org.eclipse.ocl.examples.xtext.tests/src/org/eclipse/ocl/examples/test/xtext/AllEvaluationTests.java
@@ -12,7 +12,7 @@
 package org.eclipse.ocl.examples.test.xtext;
 
 import org.eclipse.ocl.examples.pivot.tests.EvaluateBooleanOperationsTest4;
-import org.eclipse.ocl.examples.pivot.tests.EvaluateClassifierOperationsTest;
+import org.eclipse.ocl.examples.pivot.tests.EvaluateClassifierOperationsTest4;
 import org.eclipse.ocl.examples.pivot.tests.EvaluateCollectionOperationsTest4;
 import org.eclipse.ocl.examples.pivot.tests.EvaluateConstructsTest4;
 import org.eclipse.ocl.examples.pivot.tests.EvaluateMapOperationsTest4;
@@ -33,7 +33,7 @@
 @RunWith(Suite.class)
 @Suite.SuiteClasses({
 	EvaluateBooleanOperationsTest4.class,
-	EvaluateClassifierOperationsTest.class,
+	EvaluateClassifierOperationsTest4.class,
 	EvaluateCollectionOperationsTest4.class,
 	EvaluateConstructsTest4.class,
 	EvaluateMapOperationsTest4.class,
