Removed compilation-related code
diff --git a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/AbstractModuleEditor.java b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/AbstractModuleEditor.java
index 3572f05..22f2c66 100644
--- a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/AbstractModuleEditor.java
+++ b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/AbstractModuleEditor.java
@@ -43,8 +43,6 @@
 import org.eclipse.epsilon.common.module.ModuleMarker.Severity;

 import org.eclipse.epsilon.common.parse.Region;

 import org.eclipse.epsilon.common.parse.problem.ParseProblem;

-import org.eclipse.epsilon.eol.IEolModule;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.jface.action.IAction;

 import org.eclipse.jface.preference.IPreferenceStore;

 import org.eclipse.jface.text.BadLocationException;

@@ -174,11 +172,17 @@
 		// The list returned by Arrays.asList cannot be changed in size,

 		// as it is just a wrapper over the Java array. Therefore, any

 		// calls to add/remove will return an UnsupportedOperationException.

-		return new ArrayList<>(Arrays.asList("String", "Boolean", "Integer", "Real", "Any", "Map", "Collection", "Bag",

-				"Sequence", "Set", "OrderedSet", "Native", "List", "Tuple", "ConcurrentSet", "ConcurrentBag",

-				"ConcurrentMap"));

-	}

 

+		return new ArrayList<>(Arrays.asList(

+			"String", "Boolean", "Integer", "Real",

+			"Any", "Map", "Collection", "Bag", "Sequence",

+			"Set", "OrderedSet", "Native", "List", "Tuple",

+			"ConcurrentSet", "ConcurrentBag", "ConcurrentMap", 

+			"EolSelf", "EolSelfContentType", "EolSelfExpressionType", 

+			"EolSelfCollectionType")

+		);

+	}

+	

 	public abstract List<String> getKeywords();

 

 	public abstract List<String> getBuiltinVariables();

@@ -417,19 +421,12 @@
 				try {

 					if (EpsilonCommonsPlugin.getDefault().getPreferenceStore()

 							.getBoolean(EpsilonPreferencePage.ENABLE_STATIC_ANALYSIS)) {

-						if (module instanceof IEolModule) {

-							IEolCompilationContext compilationContext = ((IEolModule) module).getCompilationContext();

-							if (compilationContext != null)

-								compilationContext.setModelFactory(new ModelTypeExtensionFactory());

+						for (IModuleValidator validator : ModuleValidatorExtensionPointManager.getDefault()

+								.getExtensions()) {

+							String markerType = (validator.getMarkerType() == null ? AbstractModuleEditor.PROBLEM_MARKER

+									: validator.getMarkerType());

+							createMarkers(validator.validate(module), doc, file, markerType);

 						}

-						createMarkers(module.compile(), doc, file, AbstractModuleEditor.PROBLEM_MARKER);

-					}

-

-					for (IModuleValidator validator : ModuleValidatorExtensionPointManager.getDefault()

-							.getExtensions()) {

-						String markerType = (validator.getMarkerType() == null ? AbstractModuleEditor.PROBLEM_MARKER

-								: validator.getMarkerType());

-						createMarkers(validator.validate(module), doc, file, markerType);

 					}

 				} catch (Exception ex) {

 					LogUtil.log(ex);

diff --git a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/ModelTypeExtensionFactory.java b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/ModelTypeExtensionFactory.java
deleted file mode 100644
index 8b2c0a1..0000000
--- a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/ModelTypeExtensionFactory.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*********************************************************************
-* Copyright (c) 2008 The University of York.
-*
-* This program and the accompanying materials are made
-* available under the terms of the Eclipse Public License 2.0
-* which is available at https://www.eclipse.org/legal/epl-2.0/
-*
-* SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.common.dt.editor;
-
-import org.eclipse.epsilon.common.dt.launching.extensions.ModelTypeExtension;
-import org.eclipse.epsilon.eol.compile.context.IModelFactory;
-import org.eclipse.epsilon.eol.models.IModel;
-
-public class ModelTypeExtensionFactory implements IModelFactory {
-
-	@Override
-	public IModel createModel(String driver) {
-		try {
-			return ModelTypeExtension.forType(driver).createModel();
-		} catch (Exception e) {
-			return null;
-		}
-	}
-
-}
diff --git a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/AbstractModuleEditorHyperlinkDetector.java b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/AbstractModuleEditorHyperlinkDetector.java
index 3bb94fe..e243456 100644
--- a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/AbstractModuleEditorHyperlinkDetector.java
+++ b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/AbstractModuleEditorHyperlinkDetector.java
@@ -41,7 +41,7 @@
 		for (Object op : module.getOperations()) {
 			Operation operation = (Operation) op;
 			if (operation.getName().equals(ast.getName()) && operation.getFormalParameters().size() == ast.getParameterExpressions().size()) {
-				hyperlinks.add(new ASTHyperlink(astRegions.get(ast), operation, operation.toString()));
+				hyperlinks.add(new ModuleElementHyperlink(astRegions.get(ast), operation, operation.toString()));
 			}
 		}
 		
@@ -50,7 +50,7 @@
 				Operation operation = (Operation) op;
 			
 				if (operation.getName().equals(ast.getName())) {
-					hyperlinks.add(new ASTHyperlink(astRegions.get(ast), operation, operation.toString()));
+					hyperlinks.add(new ModuleElementHyperlink(astRegions.get(ast), operation, operation.toString()));
 				}
 			}	
 		}
diff --git a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ASTHyperlink.java b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ModuleElementHyperlink.java
similarity index 82%
rename from plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ASTHyperlink.java
rename to plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ModuleElementHyperlink.java
index 33c1c65..0102fed 100644
--- a/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ASTHyperlink.java
+++ b/plugins/org.eclipse.epsilon.common.dt/src/org/eclipse/epsilon/common/dt/editor/hyperlinks/ModuleElementHyperlink.java
@@ -14,15 +14,15 @@
 import org.eclipse.jface.text.IRegion;
 import org.eclipse.jface.text.hyperlink.IHyperlink;
 
-public class ASTHyperlink implements IHyperlink {
+public class ModuleElementHyperlink implements IHyperlink {
 
 	protected IRegion region;
-	protected ModuleElement targetAST;
+	protected ModuleElement target;
 	protected String label;
 	
-	public ASTHyperlink(IRegion region, ModuleElement targetAST, String label) {
+	public ModuleElementHyperlink(IRegion region, ModuleElement target, String label) {
 		this.region = region;
-		this.targetAST = targetAST;
+		this.target = target;
 		this.label = label;
 	}
 	
@@ -43,7 +43,7 @@
 
 	@Override
 	public void open() {
-		EclipseUtil.openEditorAt(targetAST);
+		EclipseUtil.openEditorAt(target);
 	}
 	
 
diff --git a/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/module/IModule.java b/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/module/IModule.java
index 3289ad1..8729847 100644
--- a/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/module/IModule.java
+++ b/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/module/IModule.java
@@ -53,9 +53,7 @@
 	boolean parse(String code, File file) throws Exception;

 	

 	boolean parse(URI uri) throws Exception;

-	

-	List<ModuleMarker> compile();

-	

+		

 	URI getSourceUri();

 

 	List<ParseProblem> getParseProblems();

diff --git a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EglTemplateFactoryModuleAdapter.java b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EglTemplateFactoryModuleAdapter.java
index 60a1dbc..05f1883 100644
--- a/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EglTemplateFactoryModuleAdapter.java
+++ b/plugins/org.eclipse.epsilon.egl.engine/src/org/eclipse/epsilon/egl/EglTemplateFactoryModuleAdapter.java
@@ -23,14 +23,12 @@
 import org.eclipse.epsilon.common.module.Comment;
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.module.ModuleElement;
-import org.eclipse.epsilon.common.module.ModuleMarker;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.parse.Region;
 import org.eclipse.epsilon.common.parse.problem.ParseProblem;
 import org.eclipse.epsilon.egl.execute.context.IEglContext;
 import org.eclipse.epsilon.egl.formatter.Formatter;
 import org.eclipse.epsilon.eol.IEolModule;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.dom.Import;
 import org.eclipse.epsilon.eol.dom.ModelDeclaration;
 import org.eclipse.epsilon.eol.dom.OperationList;
@@ -123,12 +121,6 @@
 	}
 	
 	@Override
-	public List<ModuleMarker> compile() {
-		if (current == null) return null;
-		return current.module.compile();
-	}
-	
-	@Override
 	public void reset() {
 		current = null;
 	}
@@ -199,12 +191,6 @@
 	}
 
 	@Override
-	public IEolCompilationContext getCompilationContext() {
-		if (current == null) return null;
-		return current.module.getCompilationContext();
-	}
-
-	@Override
 	public ModuleElement createAst(AST cst, ModuleElement parentAst) {
 		if (current == null) return null;
 		return current.module.createAst(cst, parentAst);
diff --git a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModel.java b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModel.java
index 81952cc..299c77b 100644
--- a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModel.java
+++ b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModel.java
@@ -32,11 +32,11 @@
 import org.eclipse.emf.ecore.xmi.XMLResource;

 import org.eclipse.epsilon.common.util.CollectionUtil;

 import org.eclipse.epsilon.common.util.StringProperties;

-import org.eclipse.epsilon.eol.compile.m3.Metamodel;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;

 import org.eclipse.epsilon.eol.exceptions.models.EolNotAnEnumerationValueException;

 import org.eclipse.epsilon.eol.execute.introspection.IReflectivePropertySetter;

+import org.eclipse.epsilon.eol.m3.Metamodel;

 import org.eclipse.epsilon.eol.models.IReflectiveModel;

 import org.eclipse.epsilon.eol.models.IRelativePathResolver;

 

diff --git a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModelMetamodel.java b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModelMetamodel.java
index d8448ca..d765c98 100644
--- a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModelMetamodel.java
+++ b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfModelMetamodel.java
@@ -18,11 +18,12 @@
 import org.eclipse.emf.ecore.EReference;
 import org.eclipse.epsilon.common.util.StringProperties;
 import org.eclipse.epsilon.common.util.StringUtil;
-import org.eclipse.epsilon.eol.compile.m3.Attribute;
-import org.eclipse.epsilon.eol.compile.m3.MetaClass;
-import org.eclipse.epsilon.eol.compile.m3.Metamodel;
-import org.eclipse.epsilon.eol.compile.m3.Reference;
+import org.eclipse.epsilon.eol.m3.Attribute;
+import org.eclipse.epsilon.eol.m3.MetaClass;
+import org.eclipse.epsilon.eol.m3.Metamodel;
+import org.eclipse.epsilon.eol.m3.Reference;
 import org.eclipse.epsilon.eol.models.IRelativePathResolver;
+import org.eclipse.epsilon.eol.types.EolAnyType;
 import org.eclipse.epsilon.eol.types.EolModelElementType;
 import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
@@ -73,9 +74,11 @@
 						else if (StringUtil.isOneOf(instanceClassName, Boolean.class.getCanonicalName(), "boolean")) {
 							attribute.setType(EolPrimitiveType.Boolean);
 						}
-						else if (instanceClassName.equals(Float.class.getCanonicalName()) || instanceClassName.equals(Double.class.getCanonicalName())) {
+						else if ((instanceClassName != null) && (instanceClassName.equals(Float.class.getCanonicalName()) || instanceClassName.equals(Double.class.getCanonicalName()))) {
 							attribute.setType(EolPrimitiveType.Real);
 						}
+						else
+							attribute.setType(EolAnyType.Instance);
 						metaClass.getStructuralFeatures().add(attribute);
 					}
 					
diff --git a/plugins/org.eclipse.epsilon.eol.engine/.classpath b/plugins/org.eclipse.epsilon.eol.engine/.classpath
index 5b02abf..eca7bdb 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/.classpath
+++ b/plugins/org.eclipse.epsilon.eol.engine/.classpath
@@ -2,6 +2,6 @@
 <classpath>
 	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.8"/>
 	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry excluding="org/eclipse/epsilon/eol/dom/ParameterValueList.java" kind="src" path="src"/>
+	<classpathentry kind="src" path="src"/>
 	<classpathentry kind="output" path="bin"/>
 </classpath>
diff --git a/plugins/org.eclipse.epsilon.eol.engine/META-INF/MANIFEST.MF b/plugins/org.eclipse.epsilon.eol.engine/META-INF/MANIFEST.MF
index 94fd516..05d9e7c 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epsilon.eol.engine/META-INF/MANIFEST.MF
@@ -8,8 +8,6 @@
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8

 Require-Bundle: org.eclipse.epsilon.common;visibility:=reexport

 Export-Package: org.eclipse.epsilon.eol,

- org.eclipse.epsilon.eol.compile.context,

- org.eclipse.epsilon.eol.compile.m3,

  org.eclipse.epsilon.eol.concurrent,

  org.eclipse.epsilon.eol.dom,

  org.eclipse.epsilon.eol.exceptions,

@@ -34,6 +32,7 @@
  org.eclipse.epsilon.eol.execute.prettyprinting,

  org.eclipse.epsilon.eol.function,

  org.eclipse.epsilon.eol.launch,

+ org.eclipse.epsilon.eol.m3,

  org.eclipse.epsilon.eol.models,

  org.eclipse.epsilon.eol.models.java,

  org.eclipse.epsilon.eol.models.transactions,

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/EolModule.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/EolModule.java
index d74d9dd..9120149 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/EolModule.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/EolModule.java
@@ -9,21 +9,69 @@
  ******************************************************************************/

 package org.eclipse.epsilon.eol;

 

-import java.util.*;

+import java.util.ArrayList;

+import java.util.Collection;

+import java.util.HashMap;

+import java.util.List;

+import java.util.Map;

+import java.util.Set;

+

 import org.antlr.runtime.ANTLRInputStream;

 import org.antlr.runtime.Lexer;

 import org.antlr.runtime.TokenStream;

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.module.ModuleElement;

-import org.eclipse.epsilon.common.module.ModuleMarker;

 import org.eclipse.epsilon.common.parse.AST;

 import org.eclipse.epsilon.common.parse.EpsilonParser;

 import org.eclipse.epsilon.common.parse.problem.ParseProblem;

 import org.eclipse.epsilon.common.util.AstUtil;

 import org.eclipse.epsilon.common.util.ListSet;

-import org.eclipse.epsilon.eol.compile.context.EolCompilationContext;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

-import org.eclipse.epsilon.eol.dom.*;

+import org.eclipse.epsilon.eol.dom.AbortStatement;

+import org.eclipse.epsilon.eol.dom.AnnotationBlock;

+import org.eclipse.epsilon.eol.dom.AssignmentStatement;

+import org.eclipse.epsilon.eol.dom.BooleanLiteral;

+import org.eclipse.epsilon.eol.dom.BreakStatement;

+import org.eclipse.epsilon.eol.dom.Case;

+import org.eclipse.epsilon.eol.dom.CollectionLiteralExpression;

+import org.eclipse.epsilon.eol.dom.ComplexOperationCallExpression;

+import org.eclipse.epsilon.eol.dom.ContinueStatement;

+import org.eclipse.epsilon.eol.dom.DeleteStatement;

+import org.eclipse.epsilon.eol.dom.EnumerationLiteralExpression;

+import org.eclipse.epsilon.eol.dom.ExecutableAnnotation;

+import org.eclipse.epsilon.eol.dom.Expression;

+import org.eclipse.epsilon.eol.dom.ExpressionInBrackets;

+import org.eclipse.epsilon.eol.dom.ExpressionStatement;

+import org.eclipse.epsilon.eol.dom.FirstOrderOperationCallExpression;

+import org.eclipse.epsilon.eol.dom.ForStatement;

+import org.eclipse.epsilon.eol.dom.IfStatement;

+import org.eclipse.epsilon.eol.dom.Import;

+import org.eclipse.epsilon.eol.dom.IntegerLiteral;

+import org.eclipse.epsilon.eol.dom.ItemSelectorExpression;

+import org.eclipse.epsilon.eol.dom.MapLiteralExpression;

+import org.eclipse.epsilon.eol.dom.ModelDeclaration;

+import org.eclipse.epsilon.eol.dom.ModelDeclarationParameter;

+import org.eclipse.epsilon.eol.dom.NameExpression;

+import org.eclipse.epsilon.eol.dom.NewInstanceExpression;

+import org.eclipse.epsilon.eol.dom.Operation;

+import org.eclipse.epsilon.eol.dom.OperationCallExpression;

+import org.eclipse.epsilon.eol.dom.OperationList;

+import org.eclipse.epsilon.eol.dom.OperatorExpressionFactory;

+import org.eclipse.epsilon.eol.dom.Parameter;

+import org.eclipse.epsilon.eol.dom.PropertyCallExpression;

+import org.eclipse.epsilon.eol.dom.RealLiteral;

+import org.eclipse.epsilon.eol.dom.ReturnStatement;

+import org.eclipse.epsilon.eol.dom.SimpleAnnotation;

+import org.eclipse.epsilon.eol.dom.SpecialAssignmentStatement;

+import org.eclipse.epsilon.eol.dom.Statement;

+import org.eclipse.epsilon.eol.dom.StatementBlock;

+import org.eclipse.epsilon.eol.dom.StringLiteral;

+import org.eclipse.epsilon.eol.dom.SwitchStatement;

+import org.eclipse.epsilon.eol.dom.TernaryExpression;

+import org.eclipse.epsilon.eol.dom.ThrowStatement;

+import org.eclipse.epsilon.eol.dom.TransactionStatement;

+import org.eclipse.epsilon.eol.dom.TypeExpression;

+import org.eclipse.epsilon.eol.dom.VariableDeclaration;

+import org.eclipse.epsilon.eol.dom.WhileStatement;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.execute.Return;

 import org.eclipse.epsilon.eol.execute.context.EolContext;

@@ -43,7 +91,6 @@
 	protected OperationList operations = new OperationList();

 	protected List<ModelDeclaration> declaredModelDeclarations;

 	protected Set<ModelDeclaration> modelDeclarations;

-	protected IEolCompilationContext compilationContext;

 	private IEolModule parent;

 	

 	/**

@@ -287,16 +334,6 @@
 		importConfiguration.put("eol", EolModule.class);

 		return importConfiguration;

 	}

-	

-	@Override

-	public IEolCompilationContext getCompilationContext() {

-		if (compilationContext == null) {

-			compilationContext = new EolCompilationContext();

-			compilationContext.setModelDeclarations(getDeclaredModelDeclarations());

-		}

-		compilationContext.setRuntimeContext(getContext());

-		return compilationContext;

-	}

 

 	protected void prepareContext() throws EolRuntimeException {

 		IEolContext context = getContext();

@@ -440,21 +477,6 @@
 	}

 	

 	@Override

-	public List<ModuleMarker> compile() {

-		IEolCompilationContext context = getCompilationContext();

-		for (ModelDeclaration modelDeclaration : getDeclaredModelDeclarations()) {

-			modelDeclaration.compile(context);

-		}

-		for (Operation operation : getDeclaredOperations()) {

-			operation.compile(context);

-		}

-		if (main != null) {

-			main.compile(context);

-		}

-		return context.getMarkers();

-	}

-	

-	@Override

 	public List<Statement> getPostOperationStatements() {

 		return postOperationStatements;

 	}

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/IEolModule.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/IEolModule.java
index 650ca8b..6732925 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/IEolModule.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/IEolModule.java
@@ -14,9 +14,9 @@
 import java.util.List;

 import java.util.Map;

 import java.util.Set;

+

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.parse.problem.ParseProblem;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.epsilon.eol.dom.Import;

 import org.eclipse.epsilon.eol.dom.ModelDeclaration;

 import org.eclipse.epsilon.eol.dom.OperationList;

@@ -54,8 +54,6 @@
 	

 	void setContext(IEolContext context);

 	

-	IEolCompilationContext getCompilationContext();

-	

 	@Override

 	List<ParseProblem> getParseProblems();

 	

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/EolCompilationContext.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/EolCompilationContext.java
deleted file mode 100644
index c285a8c..0000000
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/EolCompilationContext.java
+++ /dev/null
@@ -1,108 +0,0 @@
-/*********************************************************************
-* Copyright (c) 2008 The University of York.
-*
-* This program and the accompanying materials are made
-* available under the terms of the Eclipse Public License 2.0
-* which is available at https://www.eclipse.org/legal/epl-2.0/
-*
-* SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.eol.compile.context;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.eclipse.epsilon.common.module.AbstractModuleElement;
-import org.eclipse.epsilon.common.module.ModuleMarker;
-import org.eclipse.epsilon.common.module.ModuleMarker.Severity;
-import org.eclipse.epsilon.eol.compile.m3.MetaClass;
-import org.eclipse.epsilon.eol.compile.m3.Metamodel;
-import org.eclipse.epsilon.eol.dom.ModelDeclaration;
-import org.eclipse.epsilon.eol.execute.context.FrameStack;
-import org.eclipse.epsilon.eol.execute.context.IEolContext;
-import org.eclipse.epsilon.eol.models.IRelativePathResolver;
-import org.eclipse.epsilon.eol.types.EolModelElementType;
-
-public class EolCompilationContext implements IEolCompilationContext {
-
-	protected List<ModuleMarker> markers = new ArrayList<>();
-	protected IEolContext runtimeContext = null;
-	protected FrameStack frameStack = new FrameStack();
-	protected IModelFactory modelFactory;
-	protected IRelativePathResolver relativePathResolver;
-	protected List<ModelDeclaration> modelDeclarations = new ArrayList<>();
-	
-	@Override
-	public List<ModuleMarker> getMarkers() {
-		return markers;
-	}
-	
-	@Override
-	public void setRuntimeContext(IEolContext context) {
-		this.runtimeContext = context;
-	}
-
-	@Override
-	public void addWarningMarker(AbstractModuleElement element, String message) {
-		markers.add(new ModuleMarker(element, message, Severity.Warning));
-	}
-
-	@Override
-	public void addErrorMarker(AbstractModuleElement element, String message) {
-		markers.add(new ModuleMarker(element, message, Severity.Error));
-	}
-	
-	@Override
-	public FrameStack getFrameStack() {
-		return frameStack;
-	}
-	
-	@Override
-	public IModelFactory getModelFactory() {
-		return modelFactory;
-	}
-	
-	@Override
-	public void setModelFactory(IModelFactory modelFactory) {
-		this.modelFactory = modelFactory;
-	}
-	
-	@Override
-	public IRelativePathResolver getRelativePathResolver() {
-		return relativePathResolver;
-	}
-	
-	@Override
-	public void setRelativePathResolver(IRelativePathResolver relativePathResolver) {
-		this.relativePathResolver = relativePathResolver;
-	}
-	
-	@Override
-	public void setModelDeclarations(List<ModelDeclaration> modelDeclarations) {
-		this.modelDeclarations = modelDeclarations;
-	}
-	
-	@Override
-	public List<ModelDeclaration> getModelDeclarations() {
-		return modelDeclarations;
-	}
-	
-	@Override
-	public EolModelElementType getModelElementType(String modelAndType) {
-		EolModelElementType modelElementType = new EolModelElementType(modelAndType);
-		
-		for (ModelDeclaration modelDeclaration : modelDeclarations) {
-			if (modelElementType.getModelName().isEmpty() || modelDeclaration.getNameExpression().getName().equals(modelElementType.getModelName())) {
-				Metamodel metamodel = modelDeclaration.getMetamodel();
-				if (metamodel != null) {
-					MetaClass metaClass = metamodel.getMetaClass(modelElementType.getTypeName());
-					modelElementType.setMetaClass(metaClass);
-					return modelElementType;
-				}
-			}
-		}
-		
-		return modelElementType;
-	}
-	
-}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IEolCompilationContext.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IEolCompilationContext.java
deleted file mode 100644
index c429fec..0000000
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IEolCompilationContext.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2008 The University of York.
- * This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License 2.0
- * which is available at https://www.eclipse.org/legal/epl-2.0/
- ******************************************************************************/
-package org.eclipse.epsilon.eol.compile.context;
-
-import java.util.List;
-
-import org.eclipse.epsilon.common.module.AbstractModuleElement;
-import org.eclipse.epsilon.common.module.ModuleMarker;
-import org.eclipse.epsilon.eol.dom.ModelDeclaration;
-import org.eclipse.epsilon.eol.execute.context.FrameStack;
-import org.eclipse.epsilon.eol.execute.context.IEolContext;
-import org.eclipse.epsilon.eol.models.IRelativePathResolver;
-import org.eclipse.epsilon.eol.types.EolModelElementType;
-
-public interface IEolCompilationContext {
-
-	List<ModuleMarker> getMarkers();
-
-	void setRuntimeContext(IEolContext context);
-
-	void addWarningMarker(AbstractModuleElement element, String message);
-
-	void addErrorMarker(AbstractModuleElement element, String message);
-
-	FrameStack getFrameStack();
-
-	IModelFactory getModelFactory();
-
-	void setModelFactory(IModelFactory modelFactory);
-
-	IRelativePathResolver getRelativePathResolver();
-
-	void setRelativePathResolver(IRelativePathResolver relativePathResolver);
-
-	void setModelDeclarations(List<ModelDeclaration> modelDeclarations);
-
-	List<ModelDeclaration> getModelDeclarations();
-
-	EolModelElementType getModelElementType(String modelAndType);
-
-}
\ No newline at end of file
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IModelFactory.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IModelFactory.java
deleted file mode 100644
index d162595..0000000
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/IModelFactory.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*********************************************************************
-* Copyright (c) 2008 The University of York.
-*
-* This program and the accompanying materials are made
-* available under the terms of the Eclipse Public License 2.0
-* which is available at https://www.eclipse.org/legal/epl-2.0/
-*
-* SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.eol.compile.context;
-
-import org.eclipse.epsilon.eol.models.IModel;
-
-public interface IModelFactory {
-	
-	public IModel createModel(String driver);
-	
-}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/MetamodelRepository.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/MetamodelRepository.java
deleted file mode 100644
index 4f96f3b..0000000
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/context/MetamodelRepository.java
+++ /dev/null
@@ -1,16 +0,0 @@
-/*********************************************************************
-* Copyright (c) 2008 The University of York.
-*
-* This program and the accompanying materials are made
-* available under the terms of the Eclipse Public License 2.0
-* which is available at https://www.eclipse.org/legal/epl-2.0/
-*
-* SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.eol.compile.context;
-
-public class MetamodelRepository {
-	
-	// protected HashMap<String, List<Metamodel>> cache = new HashMap<String, List<Metamodel>>();
-	
-}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbortStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbortStatement.java
index 72ac94e..cb9f3e8 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbortStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbortStatement.java
@@ -9,7 +9,6 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolAbortTransactionException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -21,9 +20,6 @@
 		throw new EolAbortTransactionException();
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbstractExecutableModuleElement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbstractExecutableModuleElement.java
index 628da6f..6a3dd83 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbstractExecutableModuleElement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AbstractExecutableModuleElement.java
@@ -11,6 +11,6 @@
 
 import org.eclipse.epsilon.common.module.AbstractModuleElement;
 
-public abstract class AbstractExecutableModuleElement extends AbstractModuleElement implements IExecutableModuleElement, ICompilableModuleElement {
+public abstract class AbstractExecutableModuleElement extends AbstractModuleElement implements IExecutableModuleElement {
 
 }
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AnnotatableModuleElement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AnnotatableModuleElement.java
index 00fd3a2..0a5b446 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AnnotatableModuleElement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AnnotatableModuleElement.java
@@ -14,6 +14,7 @@
 import java.util.List;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
+
 import org.eclipse.epsilon.common.module.AbstractModuleElement;
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Annotation.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Annotation.java
index 2c7643b..b0caa79 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Annotation.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Annotation.java
@@ -13,7 +13,7 @@
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
-public abstract class Annotation extends AbstractModuleElement implements ICompilableModuleElement {
+public abstract class Annotation extends AbstractModuleElement {
 	
 	protected String name;
 	
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AssignmentStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AssignmentStatement.java
index ae91ea6..71a82b8 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AssignmentStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/AssignmentStatement.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -117,12 +116,6 @@
 		return value;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		targetExpression.compile(context);
-		valueExpression.compile(context);
-	}
-	
 	public Expression getTargetExpression() {
 		return targetExpression;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BooleanLiteral.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BooleanLiteral.java
index 9f9228d..e63a5ed 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BooleanLiteral.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BooleanLiteral.java
@@ -11,8 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public class BooleanLiteral extends LiteralExpression<Boolean> {
 	
@@ -35,11 +33,6 @@
 		}
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		resolvedType = EolPrimitiveType.Boolean;
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BreakStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BreakStatement.java
index f12058f..eb27662 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BreakStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/BreakStatement.java
@@ -9,7 +9,6 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolBreakException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -26,10 +25,7 @@
 	public Object execute(IEolContext context) throws EolRuntimeException {
 		throw new EolBreakException(this, all);
 	};
-	
-	@Override
-	public void compile(IEolCompilationContext context) {}
-	
+		
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/CollectionLiteralExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/CollectionLiteralExpression.java
index 9e46b64..a8d4c5f 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/CollectionLiteralExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/CollectionLiteralExpression.java
@@ -15,7 +15,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -141,10 +140,7 @@
 
 		return collection;
 	}
-
-	@Override
-	public void compile(IEolCompilationContext context) {}
-
+	
 	public String getCollectionType() {
 		return collectionType;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ComplexOperationCallExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ComplexOperationCallExpression.java
index f2f742a..dc1e5e8 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ComplexOperationCallExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ComplexOperationCallExpression.java
@@ -13,9 +13,9 @@
 import java.util.Collections;
 import java.util.LinkedHashMap;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.operations.DynamicOperation;
@@ -73,11 +73,6 @@
 		}
 		return new DynamicOperation().execute(target, nameExpression, complexParameters, context);
 	}
-
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-	}
 	
 	public LinkedHashMap<Expression, List<Parameter>> getComplexParameters() {
 		return complexParameters;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ContinueStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ContinueStatement.java
index 154c177..755e3e2 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ContinueStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ContinueStatement.java
@@ -9,7 +9,6 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolContinueException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -20,10 +19,7 @@
 	public Object execute(IEolContext context) throws EolRuntimeException {
 		throw new EolContinueException(this, context);
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {}
-	
+		
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/DeleteStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/DeleteStatement.java
index db6a65a..7ea9ffc 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/DeleteStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/DeleteStatement.java
@@ -14,7 +14,6 @@
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.util.CollectionUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.models.IModel;
@@ -59,11 +58,6 @@
 		this.expression = expression;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		expression.compile(context);
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/EnumerationLiteralExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/EnumerationLiteralExpression.java
index 0c60fdf..a7e7c19 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/EnumerationLiteralExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/EnumerationLiteralExpression.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
@@ -38,11 +37,6 @@
 		this.enumerationLiteral = enumerationLiteral;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableAnnotation.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableAnnotation.java
index 1ca6834..32a73de 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableAnnotation.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableAnnotation.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
@@ -49,11 +48,6 @@
 		this.expression = expression;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		expression.compile(context);
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableBlock.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableBlock.java
index 3686d86..82319fd 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableBlock.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExecutableBlock.java
@@ -10,10 +10,10 @@
 package org.eclipse.epsilon.eol.dom;

 

 import java.util.Collection;

+

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.module.ModuleElement;

 import org.eclipse.epsilon.common.parse.AST;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.epsilon.eol.exceptions.EolIllegalReturnException;

 import org.eclipse.epsilon.eol.exceptions.EolNoReturnException;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

@@ -172,11 +172,6 @@
 		return expectedResultClass;

 	}

 	

-	@Override

-	public void compile(IEolCompilationContext context) {

-		// TODO Auto-generated method stub

-	}

-	

 	public void accept(IEolVisitor visitor) {

 		visitor.visit(this);

 	}

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Expression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Expression.java
index a7bd7ff..af3a2c1 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Expression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Expression.java
@@ -9,25 +9,8 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import org.eclipse.epsilon.eol.types.EolAnyType;
-import org.eclipse.epsilon.eol.types.EolType;
-
 public abstract class Expression extends AbstractExecutableModuleElement {
 	
-	protected EolType resolvedType = EolAnyType.Instance;
-	
-	public EolType getResolvedType() {
-		return resolvedType;
-	}
-	
-	public void setResolvedType(EolType resolvedType) {
-		this.resolvedType = resolvedType;
-	}
-	
-	public boolean hasResolvedType() {
-		return resolvedType != null && resolvedType != EolAnyType.Instance;
-	}
-	
 	public abstract void accept(IEolVisitor visitor);
 	
 }
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionInBrackets.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionInBrackets.java
index 813a36c..543ef71 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionInBrackets.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionInBrackets.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
@@ -38,12 +37,6 @@
 		this.expression = expression;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		expression.compile(context);
-		resolvedType = expression.getResolvedType();
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionStatement.java
index 518d9bc..39ca164 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ExpressionStatement.java
@@ -9,7 +9,6 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
@@ -40,11 +39,6 @@
 		return expression;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		expression.compile(context);
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/FirstOrderOperationCallExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/FirstOrderOperationCallExpression.java
index 783f090..09d9ce8 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/FirstOrderOperationCallExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/FirstOrderOperationCallExpression.java
@@ -11,21 +11,27 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.module.ModuleElement;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.util.StringUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalOperationException;
 import org.eclipse.epsilon.eol.exceptions.EolNullPointerException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
-import org.eclipse.epsilon.eol.execute.context.FrameType;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.operations.AbstractOperation;
-import org.eclipse.epsilon.eol.execute.operations.declarative.*;
+import org.eclipse.epsilon.eol.execute.operations.declarative.CollectBasedOperation;
+import org.eclipse.epsilon.eol.execute.operations.declarative.CollectOperation;
+import org.eclipse.epsilon.eol.execute.operations.declarative.DelegateBasedOperation;
+import org.eclipse.epsilon.eol.execute.operations.declarative.FirstOrderOperation;
+import org.eclipse.epsilon.eol.execute.operations.declarative.SelectBasedOperation;
+import org.eclipse.epsilon.eol.execute.operations.declarative.SelectOperation;
 import org.eclipse.epsilon.eol.models.IModel;
 import org.eclipse.epsilon.eol.parse.EolParser;
-import org.eclipse.epsilon.eol.types.*;
+import org.eclipse.epsilon.eol.types.EolModelElementType;
+import org.eclipse.epsilon.eol.types.EolNoType;
+import org.eclipse.epsilon.eol.types.EolType;
 
 public class FirstOrderOperationCallExpression extends FeatureCallExpression {
 	
@@ -160,79 +166,7 @@
 			}
 		}
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		targetExpression.compile(context);
-		EolType contextType = null;
-		if (targetExpression.getResolvedType() instanceof EolCollectionType) {
-			contextType = ((EolCollectionType) targetExpression.getResolvedType()).getContentType();
-		}
-		else if (targetExpression.getResolvedType() == EolAnyType.Instance) {
-			contextType = targetExpression.getResolvedType();
-		}
 		
-		String name = nameExpression.getName();
-		if (name.startsWith("sequential")) name = name.substring(10);
-		else if (name.startsWith("parallel")) name = name.substring(8);
-		
-		if (contextType != null) {
-			context.getFrameStack().enterLocal(FrameType.UNPROTECTED, this);
-			Parameter parameter = parameters.get(0);
-			parameter.compile(context, false);
-			if (parameter.isExplicitlyTyped()) {
-				//TODO: Check that the type of the parameter is a subtype of the type of the collection
-				contextType = parameter.getCompilationType();
-			}
-			context.getFrameStack().put(parameter.getName(), contextType);
-			
-			Expression expression = expressions.get(0);
-			expression.compile(context);
-			
-			context.getFrameStack().leaveLocal(this);
-			
-			if (StringUtil.isOneOf(name, "select", "reject", "rejectOne", "closure", "sortBy")) {
-				resolvedType = new EolCollectionType("Sequence", contextType);
-			}
-			else if (name.equals("selectOne")) {
-				resolvedType = contextType;
-			}
-			else if (name.equals("collect")) {
-				resolvedType = new EolCollectionType("Sequence", expression.getResolvedType());
-			}
-			else if (StringUtil.isOneOf(name, "exists", "forAll", "one", "none", "nMatch, atLeastNMatch, atMostNMatch")) {
-				resolvedType = EolPrimitiveType.Boolean;
-			}
-			else if (name.equals("aggregate")) {
-				if (expressions.size() == 2) {
-					Expression valueExpression = expressions.get(1);
-					valueExpression.compile(context);
-					resolvedType = new EolMapType(expression.getResolvedType(), valueExpression.getResolvedType());
-				}
-				else {
-					context.addErrorMarker(nameExpression, "Aggregate requires a key and a value expression");
-				}
-			}
-			else if (name.equals("mapBy")) {
-				resolvedType = new EolMapType(expression.getResolvedType(), new EolCollectionType("Sequence", contextType));
-			}
-			else if (name.equals("sortBy")) {
-				resolvedType = new EolCollectionType("Sequence", contextType);
-			}
-			
-			if (StringUtil.isOneOf(name,
-				"select", "selectOne", "reject", "rejectOne", "exists", "one", "none", "forAll", "closure") &&
-				expression.getResolvedType().isNot(EolPrimitiveType.Boolean)) {
-					
-				context.addErrorMarker(expression, "Expression should return a Boolean but returns a " + expression.getResolvedType().getName() + " instead");
-			}
-			
-		}
-		else {
-			context.addErrorMarker(nameExpression, "Operation " + name + " only applies to collections");
-		}
-	}
-	
 	public List<Parameter> getParameters() {
 		return parameters;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ForStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ForStatement.java
index 77849cd..3a9a65e 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ForStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ForStatement.java
@@ -11,10 +11,10 @@
 
 import java.util.Collection;
 import java.util.Iterator;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.util.CollectionUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolBreakException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolContinueException;
@@ -24,7 +24,6 @@
 import org.eclipse.epsilon.eol.execute.context.FrameType;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.context.Variable;
-import org.eclipse.epsilon.eol.types.EolCollectionType;
 import org.eclipse.epsilon.eol.types.EolModelElementType;
 import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 import org.eclipse.epsilon.eol.types.EolType;
@@ -123,24 +122,6 @@
 		return null;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		//TODO: Fix iterator type
-		iteratedExpression.compile(context);
-		context.getFrameStack().enterLocal(FrameType.UNPROTECTED, bodyStatementBlock, 
-				new Variable("loopCount", EolPrimitiveType.Integer), 
-				new Variable("hasMore", EolPrimitiveType.Boolean)
-		);
-		
-		iteratorParameter.compile(context);
-		bodyStatementBlock.compile(context);
-		context.getFrameStack().leaveLocal(bodyStatementBlock);
-		
-		if (iteratedExpression.hasResolvedType() && !(iteratedExpression.getResolvedType() instanceof EolCollectionType)) {
-			context.addErrorMarker(iteratedExpression, "Collection expected instead of " + iteratedExpression.getResolvedType());
-		}
-	}
-	
 	public Expression getIteratedExpression() {
 		return iteratedExpression;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ICompilableModuleElement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ICompilableModuleElement.java
deleted file mode 100644
index f9bfbb3..0000000
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ICompilableModuleElement.java
+++ /dev/null
@@ -1,18 +0,0 @@
-/*********************************************************************
-* Copyright (c) 2008 The University of York.
-*
-* This program and the accompanying materials are made
-* available under the terms of the Eclipse Public License 2.0
-* which is available at https://www.eclipse.org/legal/epl-2.0/
-*
-* SPDX-License-Identifier: EPL-2.0
-**********************************************************************/
-package org.eclipse.epsilon.eol.dom;
-
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-
-public interface ICompilableModuleElement {
-	
-	public void compile(IEolCompilationContext context);
-	
-}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IfStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IfStatement.java
index 39ecf16..3488555 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IfStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IfStatement.java
@@ -10,17 +10,13 @@
 package org.eclipse.epsilon.eol.dom;
 
 import org.eclipse.epsilon.common.module.IModule;
-import org.eclipse.epsilon.common.module.ModuleMarker;
-import org.eclipse.epsilon.common.module.ModuleMarker.Severity;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalReturnException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.FrameStack;
 import org.eclipse.epsilon.eol.execute.context.FrameType;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public class IfStatement extends Statement {
 	
@@ -67,27 +63,6 @@
 		return result;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		conditionExpression.compile(context);
-		FrameStack frameStack = context.getFrameStack();
-		
-		frameStack.enterLocal(FrameType.UNPROTECTED, thenStatementBlock);
-		thenStatementBlock.compile(context);
-		frameStack.leaveLocal(thenStatementBlock);
-		
-		if (elseStatementBlock != null) {
-			frameStack.enterLocal(FrameType.UNPROTECTED, elseStatementBlock);
-			elseStatementBlock.compile(context);
-			context.getFrameStack().leaveLocal(elseStatementBlock);
-		}
-		
-		if (conditionExpression.hasResolvedType() && conditionExpression.getResolvedType() != EolPrimitiveType.Boolean) {
-			context.getMarkers().add(new ModuleMarker(conditionExpression, "Condition must be a Boolean", Severity.Error));
-		}
-		
-	}
-	
 	public Expression getConditionExpression() {
 		return conditionExpression;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IntegerLiteral.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IntegerLiteral.java
index 9d9c5e3..0b925db 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IntegerLiteral.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/IntegerLiteral.java
@@ -11,8 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public class IntegerLiteral extends LiteralExpression<Number> {
 	
@@ -63,11 +61,6 @@
 		return text;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		resolvedType = EolPrimitiveType.Integer;
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ItemSelectorExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ItemSelectorExpression.java
index 741eabf..8c83b3f 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ItemSelectorExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ItemSelectorExpression.java
@@ -14,13 +14,9 @@
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.util.CollectionUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
-import org.eclipse.epsilon.eol.types.EolAnyType;
-import org.eclipse.epsilon.eol.types.EolCollectionType;
-import org.eclipse.epsilon.eol.types.EolType;
 
 public class ItemSelectorExpression extends Expression {
 
@@ -52,23 +48,6 @@
 		
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		targetExpression.compile(context);
-		indexExpression.compile(context);
-		
-		EolType targetExpressionType = targetExpression.getResolvedType();
-		if (targetExpressionType != EolAnyType.Instance) {
-			if (targetExpressionType instanceof EolCollectionType) {
-				resolvedType = ((EolCollectionType) targetExpressionType).getContentType();
-			}
-			else {
-				context.addErrorMarker(indexExpression, "[...] only applies to collections");
-			}
-		}
-		
-	}
-	
 	public Expression getTargetExpression() {
 		return targetExpression;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/MapLiteralExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/MapLiteralExpression.java
index cfb3a17..1ae3352 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/MapLiteralExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/MapLiteralExpression.java
@@ -9,14 +9,14 @@
 **********************************************************************/
 package org.eclipse.epsilon.eol.dom;
 
-import java.util.Map.Entry;
 import java.util.AbstractMap.SimpleEntry;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -99,11 +99,6 @@
 		return "Tuple".equals(mapName);
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-	}
-	
 	public String getMapName() {
 		return mapName;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ModelDeclaration.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ModelDeclaration.java
index b890ef1..1853374 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ModelDeclaration.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ModelDeclaration.java
@@ -17,19 +17,18 @@
 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.parse.AST;

 import org.eclipse.epsilon.common.util.AstUtil;

-import org.eclipse.epsilon.common.util.StringProperties;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

-import org.eclipse.epsilon.eol.compile.m3.Metamodel;

+import org.eclipse.epsilon.eol.m3.Metamodel;

 import org.eclipse.epsilon.eol.models.IModel;

 import org.eclipse.epsilon.eol.parse.EolParser;

 

-public class ModelDeclaration extends AbstractModuleElement implements ICompilableModuleElement {

+public class ModelDeclaration extends AbstractModuleElement {

 

 	protected NameExpression nameExpression;

 	protected List<NameExpression> aliasNameExpressions = new ArrayList<>();

 	protected NameExpression driverNameExpression;

 	protected List<ModelDeclarationParameter> modelDeclarationParameters = new ArrayList<>();

 	protected Metamodel metamodel = null;

+	protected IModel model;

 	

 	public ModelDeclaration() {}

 	

@@ -86,35 +85,23 @@
 	public List<?> getModuleElements() {

 		return Collections.emptyList();

 	}

-

-	@Override

-	public void compile(IEolCompilationContext context) {

-		if (context.getModelFactory() == null) return;

-		IModel model = context.getModelFactory().createModel(driverNameExpression.getName());

-		if (model == null) {

-			context.addErrorMarker(driverNameExpression, "Unknown type of model: " + driverNameExpression.getName());

-		}

-		else {

-			StringProperties stringProperties = new StringProperties();

-			for (ModelDeclarationParameter parameter : modelDeclarationParameters) {

-				stringProperties.put(parameter.getKey(), parameter.getValue());

-			}

-			metamodel = model.getMetamodel(stringProperties, context.getRelativePathResolver());

-			if (metamodel != null) {

-				for (String error : metamodel.getErrors()) {

-					context.addErrorMarker(this, error);

-				}

-				for (String warning : metamodel.getWarnings()) {

-					context.addWarningMarker(this, warning);

-				}

-			}

-		}

-	}

 	

 	public Metamodel getMetamodel() {

 		return metamodel;

 	}

 	

+	public void setMetamodel(Metamodel metamodel) {

+		 this.metamodel = metamodel;

+	}

+	

+	public IModel getModel() {

+		return model;

+	}

+	

+	public void setModel(IModel model) {

+		this.model = model;

+	}

+	

 	public void accept(IEolVisitor visitor) {

 		visitor.visit(this);

 	}

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NameExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NameExpression.java
index b4464df..52457fd 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NameExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NameExpression.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.EolTypeNotFoundException;
 import org.eclipse.epsilon.eol.exceptions.EolUndefinedVariableException;
@@ -96,27 +95,6 @@
 		return execute(context, false);
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		Variable variable = context.getFrameStack().get(name);
-		if (variable != null) {
-			resolvedType = variable.getType();
-		}
-		else {
-			EolModelElementType modelElementType = context.getModelElementType(name);
-			if (modelElementType != null) {
-				resolvedType = modelElementType;
-				isTypeName = true;
-				if (modelElementType.getMetaClass() == null && !context.getModelDeclarations().isEmpty()) {
-					context.addErrorMarker(this, "Unknown type " + name);
-				}
-			}
-			else {
-				context.addErrorMarker(this, "Undefined variable or type " + name);
-			}
-		}
-	}
-	
 	public Variable getModelElementType(String name, IEolContext context) {
 		try {
 			return Variable.createReadOnlyVariable(name, new EolModelElementType(name, context));
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NewInstanceExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NewInstanceExpression.java
index b74930b..25684d8 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NewInstanceExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/NewInstanceExpression.java
@@ -14,7 +14,6 @@
 

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.parse.AST;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.execute.context.IEolContext;

 import org.eclipse.epsilon.eol.types.EolType;

@@ -44,15 +43,6 @@
 		return initialiseType((EolType) result, parameterExpressions, context, true);

 	}

 	

-	@Override

-	public void compile(IEolCompilationContext context) {

-		typeExpression.compile(context);

-		for (Expression parameterExpression : parameterExpressions) {

-			parameterExpression.compile(context);

-		}

-		resolvedType = typeExpression.getResolvedType();

-	}

-	

 	public TypeExpression getTypeExpression() {

 		return typeExpression;

 	}

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Operation.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Operation.java
index 273c55b..41d1914 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Operation.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Operation.java
@@ -12,12 +12,12 @@
 import java.util.ArrayList;

 import java.util.Collections;

 import java.util.Iterator;

-import java.util.WeakHashMap;

 import java.util.List;

 import java.util.Map;

+import java.util.WeakHashMap;

+

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.parse.AST;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.epsilon.eol.exceptions.EolIllegalReturnException;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.execute.Return;

@@ -31,7 +31,7 @@
 import org.eclipse.epsilon.eol.types.EolNoType;

 import org.eclipse.epsilon.eol.types.EolType;

 

-public class Operation extends AnnotatableModuleElement implements ICompilableModuleElement {

+public class Operation extends AnnotatableModuleElement {

 	

 	protected NameExpression nameExpression;

 	protected TypeExpression contextTypeExpression;

@@ -109,22 +109,6 @@
 			this.cache = Collections.synchronizedMap(new WeakHashMap<>());

 		}

 	}

-

-	@Override

-	public void compile(IEolCompilationContext context) {

-		EolType contextType = EolNoType.Instance;

-		if (contextTypeExpression != null) {

-			contextTypeExpression.compile(context);

-			contextType = contextTypeExpression.getCompilationType();

-		}

-		

-		context.getFrameStack().enterLocal(FrameType.PROTECTED, this, new Variable("self", contextType));

-		for (Parameter parameter : formalParameters) {

-			parameter.compile(context);

-		}

-		body.compile(context);

-		context.getFrameStack().leaveLocal(this);

-	}

 	

 	public void clearCache() {

 		if (isCached()) {

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperationCallExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperationCallExpression.java
index 4f8a0b4..24b9f38 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperationCallExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperationCallExpression.java
@@ -11,10 +11,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.eol.IEolModule;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalOperationException;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalPropertyException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
@@ -206,14 +206,6 @@
 		}
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		if (targetExpression != null) targetExpression.compile(context);
-		for (Expression parameterExpression : parameterExpressions) {
-			parameterExpression.compile(context);
-		}
-	}
-	
 	public void setContextless(boolean contextless) {
 		this.contextless = contextless;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperatorExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperatorExpression.java
index 0fa3423..456bb10 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperatorExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/OperatorExpression.java
@@ -14,9 +14,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.common.util.StringUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public abstract class OperatorExpression extends Expression {
 
@@ -38,36 +35,6 @@
 		this.secondOperand = (Expression) module.createAst(cst.getSecondChild(), this);
 		this.operator = cst.getText();
 	}
-		
-	@Override
-	public void compile(IEolCompilationContext context) {
-		firstOperand.compile(context);
-		if (secondOperand != null) secondOperand.compile(context);
-		
-		if (StringUtil.isOneOf(operator, "and", "or", "xor", "not", "implies")) {
-			for (Expression operand : getOperands()) {
-				if (operand.hasResolvedType() && operand.getResolvedType() != EolPrimitiveType.Boolean) {
-					context.addErrorMarker(operand, "Boolean expected instead of " + operand.getResolvedType());
-				}
-			}
-			resolvedType = EolPrimitiveType.Boolean;
-		}
-		
-		if (StringUtil.isOneOf(operator, "<", ">", ">=", "<=", "*", "/", "-")) {
-			for (Expression operand : getOperands()) {
-				if (operand.hasResolvedType() && 
-						operand.getResolvedType() != EolPrimitiveType.Integer 
-						&& operand.getResolvedType() != EolPrimitiveType.Real) {
-					
-					context.addErrorMarker(operand, "Number expected instead of " + operand.getResolvedType());
-				}
-			}
-		}
-		
-		if (StringUtil.isOneOf(operator, "==", "=", "<>", "<", ">", ">=", "<=")) {
-			resolvedType = EolPrimitiveType.Boolean;
-		}	
-	}
 	
 	public List<Expression> getOperands() {
 		List<Expression> operands = new ArrayList<>(2);
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Parameter.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Parameter.java
index df26129..be75ae0 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Parameter.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/Parameter.java
@@ -12,14 +12,12 @@
 import org.eclipse.epsilon.common.module.AbstractModuleElement;

 import org.eclipse.epsilon.common.module.IModule;

 import org.eclipse.epsilon.common.parse.AST;

-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.execute.context.IEolContext;

-import org.eclipse.epsilon.eol.execute.context.Variable;

 import org.eclipse.epsilon.eol.types.EolAnyType;

 import org.eclipse.epsilon.eol.types.EolType;

 

-public class Parameter extends AbstractModuleElement implements ICompilableModuleElement {

+public class Parameter extends AbstractModuleElement {

 	

 	protected NameExpression nameExpression;

 	protected TypeExpression typeExpression;

@@ -96,21 +94,6 @@
 	public void clearCache() {

 		type = null;

 	}

-

-	@Override

-	public void compile(IEolCompilationContext context) {

-		compile(context, true);

-	}

-	

-	public void compile(IEolCompilationContext context, boolean createVariable) {

-		if (typeExpression != null) typeExpression.compile(context);

-		if (createVariable) context.getFrameStack().put(new Variable(getName(), getCompilationType()));

-	}

-	

-	public EolType getCompilationType() {

-		if (typeExpression != null) return typeExpression.getCompilationType();

-		else return EolAnyType.Instance;

-	}

 	

 	public boolean isExplicitlyTyped() {

 		return typeExpression != null;

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/PropertyCallExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/PropertyCallExpression.java
index d614a8f..7a21e17 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/PropertyCallExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/PropertyCallExpression.java
@@ -13,18 +13,11 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.compile.m3.MetaClass;
-import org.eclipse.epsilon.eol.compile.m3.StructuralFeature;
 import org.eclipse.epsilon.eol.exceptions.EolNullPointerException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.introspection.IPropertyGetter;
-import org.eclipse.epsilon.eol.types.EolAnyType;
-import org.eclipse.epsilon.eol.types.EolCollectionType;
-import org.eclipse.epsilon.eol.types.EolModelElementType;
 import org.eclipse.epsilon.eol.types.EolSequence;
-import org.eclipse.epsilon.eol.types.EolType;
 
 public class PropertyCallExpression extends FeatureCallExpression {
 	
@@ -83,68 +76,6 @@
 		}
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		targetExpression.compile(context);
-		
-		// Extended properties
-		if (nameExpression.getName().startsWith("~")) {
-			resolvedType = EolAnyType.Instance;
-		}
-		// e.g. EPackage.all
-		else if (targetExpression instanceof NameExpression && ((NameExpression) targetExpression).isTypeName()) {
-			if (((NameExpression) targetExpression).getResolvedType() instanceof EolModelElementType) {
-				if (nameExpression.getName().equals("all") || nameExpression.getName().equals("allInstances")) {
-					resolvedType = new EolCollectionType("Sequence", targetExpression.getResolvedType());
-				}
-			}
-		}
-		// Regular properties
-		else {
-			EolType type = targetExpression.getResolvedType();
-			
-			boolean many = false;
-			MetaClass metaClass = null;
-			if (type instanceof EolModelElementType && ((EolModelElementType) type).getMetaClass() != null) {
-				metaClass = ((EolModelElementType) type).getMetaClass();
-			}
-			else if (type instanceof EolCollectionType && ((EolCollectionType) type).getContentType() instanceof EolModelElementType) {
-				metaClass = ((EolModelElementType)((EolCollectionType) type).getContentType()).getMetaClass();
-				many = true;
-			}
-			
-			if (metaClass != null) {
-				StructuralFeature structuralFeature = metaClass.getStructuralFeature(nameExpression.getName());
-				if (structuralFeature != null) {
-					if (structuralFeature.isMany()) {
-						String collectionTypeName;
-						if (structuralFeature.isOrdered()) {
-							collectionTypeName = structuralFeature.isUnique() ? "OrderedSet" : "Sequence";
-						}
-						else {
-							collectionTypeName = structuralFeature.isUnique() ? "Set" : "Bag";
-							if (structuralFeature.isConcurrent()) {
-								collectionTypeName = "Concurrent"+collectionTypeName;
-							}
-						}
-						resolvedType = new EolCollectionType(collectionTypeName);
-						((EolCollectionType) resolvedType).setContentType(structuralFeature.getType());
-					}
-					else {
-						resolvedType = structuralFeature.getType();
-					}
-					if (many) {
-						resolvedType = new EolCollectionType("Sequence", resolvedType);
-					}
-				}
-				else {
-					context.addWarningMarker(nameExpression, "Structural feature " + nameExpression.getName() + " not found in type " + metaClass.getName());
-				}
-			}
-			
-		}
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/RealLiteral.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/RealLiteral.java
index 3dabb29..d8f9422 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/RealLiteral.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/RealLiteral.java
@@ -11,8 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 
 public class RealLiteral extends LiteralExpression<Number> {
@@ -58,11 +56,6 @@
 		}
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		resolvedType = EolPrimitiveType.Real;
-	}
-	
 	public String getText() {
 		return text;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ReturnStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ReturnStatement.java
index ead9cac..2c84ffa 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ReturnStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ReturnStatement.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.Return;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -43,14 +42,6 @@
 		return new Return(result);
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-		if (returnedExpression != null) {
-			returnedExpression.compile(context);
-		}
-	}
-	
 	public Expression getReturnedExpression() {
 		return returnedExpression;
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SimpleAnnotation.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SimpleAnnotation.java
index f44da5e..6f5e75b 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SimpleAnnotation.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SimpleAnnotation.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 
@@ -38,10 +37,7 @@
 			name = text;
 		}
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {}
-	
+		
 	@Override
 	public boolean hasValue() {
 		return getValue() != null;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StatementBlock.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StatementBlock.java
index b5fc728..96ced90 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StatementBlock.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StatementBlock.java
@@ -11,10 +11,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.module.ModuleElement;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.Return;
@@ -70,13 +70,6 @@
 		}
 		return null;
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		for (Statement statement : statements) {
-			statement.compile(context);
-		}
-	}
 
 	@Override
 	public String toString() {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StringLiteral.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StringLiteral.java
index edcec9e..484938c 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StringLiteral.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/StringLiteral.java
@@ -11,8 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public class StringLiteral extends LiteralExpression<String> {
 		
@@ -30,11 +28,6 @@
 		value = unescape(cst.getText());
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		resolvedType = EolPrimitiveType.String;
-	}
-	
 	public String unescape(String str) {
 		if (str == null) {
 			return null;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SwitchStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SwitchStatement.java
index fcf8f92..7afb945 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SwitchStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/SwitchStatement.java
@@ -12,10 +12,10 @@
 import java.util.ArrayList;
 import java.util.List;
 import java.util.Objects;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.module.ModuleElement;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolContinueException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
@@ -110,12 +110,6 @@
 		return result instanceof Return ? (Return) result : null;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-		
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TernaryExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TernaryExpression.java
index 759d6e4..1a8a62b 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TernaryExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TernaryExpression.java
@@ -11,12 +11,10 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolTernaryException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 /**
  * Ternary operator, similar to Java's.
@@ -40,12 +38,6 @@
 		super.build(cst, module);
 		this.thirdOperand = (Expression) module.createAst(cst.getFourthChild(), this);
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		super.compile(context);
-		firstOperand.resolvedType = EolPrimitiveType.Boolean;
-	}
 
 	@Override
 	public Object execute(IEolContext context) throws EolRuntimeException {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ThrowStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ThrowStatement.java
index b618edf..0e8ce2a 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ThrowStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/ThrowStatement.java
@@ -11,7 +11,6 @@
 
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.EolUserException;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
@@ -49,11 +48,6 @@
 		this.thrown = thrown;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		thrown.compile(context);
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TransactionStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TransactionStatement.java
index e9f812d..01516a7 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TransactionStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TransactionStatement.java
@@ -11,10 +11,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
 import org.eclipse.epsilon.common.util.AstUtil;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolAbortTransactionException;
 import org.eclipse.epsilon.eol.execute.ExecutorFactory;
@@ -112,11 +112,6 @@
 		this.body = body;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		// TODO Auto-generated method stub
-	}
-	
 	public void accept(IEolVisitor visitor) {
 		visitor.visit(this);
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeExpression.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeExpression.java
index a5ea70f..c595fe2 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeExpression.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/TypeExpression.java
@@ -11,10 +11,10 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.module.ModuleElement;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.EolTypeNotFoundException;
 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;
@@ -76,51 +76,10 @@
 		}
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		
-		for (TypeExpression typeExpression : parameterTypeExpressions) {
-			typeExpression.compile(context);
-		}
-		
-		if (type instanceof EolCollectionType) {
-			if (parameterTypeExpressions.size() == 1) {
-				((EolCollectionType) type).setContentType(parameterTypeExpressions.get(0).getCompilationType());
-			}
-			else if (parameterTypeExpressions.size() > 1) {
-				context.addErrorMarker(this, "Collection types can have at most one content type");
-			}
-		}
-		
-		if (type instanceof EolMapType) {
-			if (parameterTypeExpressions.size() == 2) {
-				((EolMapType) type).setKeyType(parameterTypeExpressions.get(0).getCompilationType());
-				((EolMapType) type).setValueType(parameterTypeExpressions.get(1).getCompilationType());
-			}
-			else if (parameterTypeExpressions.size() > 0) {
-				context.addErrorMarker(this, "Maps need two types: key-type and value-type");
-			}
-		}
-		
-		if (type == null) {
-			//TODO: Remove duplication between this and NameExpression
-			EolModelElementType modelElementType = context.getModelElementType(name);
-			if (modelElementType != null) {
-				type = modelElementType;
-				if (modelElementType.getMetaClass() == null && !context.getModelDeclarations().isEmpty()) {
-					context.addErrorMarker(this, "Unknown type " + name);
-				}
-			}
-			else {
-				context.addErrorMarker(this, "Undefined variable or type " + name);
-			}
-		}
-	}
-	
 	public String getName() {
 		return name;
 	}
-	
+		
 	/**
 	 * 
 	 * @param name
@@ -159,10 +118,6 @@
 		this.type = getType(this.name = name);
 	}
 	
-	public EolType getCompilationType() {
-		return type;
-	}
-	
 	@Override
 	public String toString() {
 		return getClass().getSimpleName()+": "+getName();
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/VariableDeclaration.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/VariableDeclaration.java
index 69d9b7b..2ac43433 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/VariableDeclaration.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/VariableDeclaration.java
@@ -11,9 +11,9 @@
 
 import java.util.ArrayList;
 import java.util.List;
+
 import org.eclipse.epsilon.common.module.IModule;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolRedefinedVariableException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.execute.context.FrameStack;
@@ -83,26 +83,6 @@
 		return variable;
 	}
 	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		EolType type;
-		
-		if (typeExpression != null) {
-			typeExpression.compile(context);
-			type = typeExpression.getCompilationType();
-		}
-		else {
-			type = EolAnyType.Instance;
-		}
-
-		if (context.getFrameStack().getTopFrame().contains(getName())) {
-			context.addErrorMarker(this, "Variable " + getName() + " has already been defined");
-		}
-		else {
-			context.getFrameStack().put(new Variable(getName(), type));
-		}
-	}
-	
 	public String getName() {
 		return nameExpression.getName();
 	}
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/WhileStatement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/WhileStatement.java
index 97ee93b..a5307c7 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/WhileStatement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/dom/WhileStatement.java
@@ -10,10 +10,7 @@
 package org.eclipse.epsilon.eol.dom;
 
 import org.eclipse.epsilon.common.module.IModule;
-import org.eclipse.epsilon.common.module.ModuleMarker;
-import org.eclipse.epsilon.common.module.ModuleMarker.Severity;
 import org.eclipse.epsilon.common.parse.AST;
-import org.eclipse.epsilon.eol.compile.context.IEolCompilationContext;
 import org.eclipse.epsilon.eol.exceptions.EolIllegalReturnException;
 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;
 import org.eclipse.epsilon.eol.exceptions.flowcontrol.EolBreakException;
@@ -24,7 +21,6 @@
 import org.eclipse.epsilon.eol.execute.context.FrameType;
 import org.eclipse.epsilon.eol.execute.context.IEolContext;
 import org.eclipse.epsilon.eol.execute.context.Variable;
-import org.eclipse.epsilon.eol.types.EolPrimitiveType;
 
 public class WhileStatement extends Statement {
 	
@@ -95,20 +91,6 @@
 		
 		return null;
 	}
-	
-	@Override
-	public void compile(IEolCompilationContext context) {
-		FrameStack frameStack = context.getFrameStack();
-		conditionExpression.compile(context);
-		
-		frameStack.enterLocal(FrameType.UNPROTECTED, bodyStatementBlock);
-		bodyStatementBlock.compile(context);
-		frameStack.leaveLocal(bodyStatementBlock);
-		
-		if (conditionExpression.hasResolvedType() && conditionExpression.getResolvedType() != EolPrimitiveType.Boolean) {
-			context.getMarkers().add(new ModuleMarker(conditionExpression, "Condition must be a Boolean", Severity.Error));
-		}		
-	}
 
 	public Expression getConditionExpression() {
 		return conditionExpression;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Attribute.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Attribute.java
similarity index 91%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Attribute.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Attribute.java
index 77b81c2..f6f632c 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Attribute.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Attribute.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 public class Attribute extends StructuralFeature {
 	
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/DataType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/DataType.java
similarity index 90%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/DataType.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/DataType.java
index 42eaadb..26e3373 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/DataType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/DataType.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 public class DataType extends MetaType {
 	
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaClass.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaClass.java
similarity index 97%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaClass.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaClass.java
index fef3c4b..647d2a3 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaClass.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaClass.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaType.java
similarity index 91%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaType.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaType.java
index 6bf7a62..1e9078f 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetaType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetaType.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 public abstract class MetaType extends NamedElement {
 
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Metamodel.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Metamodel.java
similarity index 95%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Metamodel.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Metamodel.java
index 31e4018..24ffc4b 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Metamodel.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Metamodel.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetamodelFactory.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetamodelFactory.java
similarity index 90%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetamodelFactory.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetamodelFactory.java
index 0afc446..dc60cdf 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/MetamodelFactory.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/MetamodelFactory.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 public class MetamodelFactory {
 
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/NamedElement.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/NamedElement.java
similarity index 92%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/NamedElement.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/NamedElement.java
index 19c72dc..fd0ed5e 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/NamedElement.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/NamedElement.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 public abstract class NamedElement {
 	
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Package.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Package.java
similarity index 94%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Package.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Package.java
index e34ad4c..7352068 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Package.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Package.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 import java.util.ArrayList;
 import java.util.List;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Reference.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Reference.java
similarity index 91%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Reference.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Reference.java
index 5c0a8ec..d05d28f 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/Reference.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/Reference.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 
 public class Reference extends StructuralFeature {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/StructuralFeature.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/StructuralFeature.java
similarity index 96%
rename from plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/StructuralFeature.java
rename to plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/StructuralFeature.java
index 759d8d1..e2fec91 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/compile/m3/StructuralFeature.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/m3/StructuralFeature.java
@@ -7,7 +7,7 @@
 *
 * SPDX-License-Identifier: EPL-2.0
 **********************************************************************/
-package org.eclipse.epsilon.eol.compile.m3;
+package org.eclipse.epsilon.eol.m3;
 
 import org.eclipse.epsilon.eol.types.EolAnyType;
 import org.eclipse.epsilon.eol.types.EolType;
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/IModel.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/IModel.java
index 75c69f3..98b0769 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/IModel.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/IModel.java
@@ -13,7 +13,6 @@
 import java.util.Collection;

 import java.util.List;

 import org.eclipse.epsilon.common.util.StringProperties;

-import org.eclipse.epsilon.eol.compile.m3.Metamodel;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.exceptions.models.EolEnumerationValueNotFoundException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;

@@ -21,6 +20,7 @@
 import org.eclipse.epsilon.eol.exceptions.models.EolNotInstantiableModelElementTypeException;

 import org.eclipse.epsilon.eol.execute.introspection.IPropertyGetter;

 import org.eclipse.epsilon.eol.execute.introspection.IPropertySetter;

+import org.eclipse.epsilon.eol.m3.Metamodel;

 import org.eclipse.epsilon.eol.models.transactions.IModelTransactionSupport;

 

 public interface IModel extends AutoCloseable {

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/Model.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/Model.java
index 1e26a5e..da8fa44 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/Model.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/Model.java
@@ -16,7 +16,6 @@
 

 import org.eclipse.epsilon.common.util.CollectionUtil;

 import org.eclipse.epsilon.common.util.StringProperties;

-import org.eclipse.epsilon.eol.compile.m3.Metamodel;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelLoadingException;

@@ -25,6 +24,7 @@
 import org.eclipse.epsilon.eol.execute.introspection.IPropertySetter;

 import org.eclipse.epsilon.eol.execute.introspection.java.JavaPropertyGetter;

 import org.eclipse.epsilon.eol.execute.introspection.java.JavaPropertySetter;

+import org.eclipse.epsilon.eol.m3.Metamodel;

 import org.eclipse.epsilon.eol.models.transactions.IModelTransactionSupport;

 import org.eclipse.epsilon.eol.models.transactions.NoModelTransactionSupport;

 

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/ModelReference.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/ModelReference.java
index 1f29fa1..5d87d7b 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/ModelReference.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/models/ModelReference.java
@@ -15,7 +15,6 @@
 import java.util.List;

 

 import org.eclipse.epsilon.common.util.StringProperties;

-import org.eclipse.epsilon.eol.compile.m3.Metamodel;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.exceptions.models.EolEnumerationValueNotFoundException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;

@@ -26,6 +25,7 @@
 import org.eclipse.epsilon.eol.execute.operations.contributors.IOperationContributorProvider;

 import org.eclipse.epsilon.eol.execute.operations.contributors.IWrapper;

 import org.eclipse.epsilon.eol.execute.operations.contributors.OperationContributor;

+import org.eclipse.epsilon.eol.m3.Metamodel;

 import org.eclipse.epsilon.eol.models.transactions.IModelTransactionSupport;

 

 public class ModelReference implements IAdaptableModel, IWrapper, IOperationContributorProvider {
diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolAnyType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolAnyType.java
index 86ac6b7..6fd58c4 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolAnyType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolAnyType.java
@@ -49,4 +49,9 @@
 	public String toString() {

 		return getName();

 	}

+	

+	@Override

+	protected EolType getParentType() {

+		return null;

+	}

 }

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolCollectionType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolCollectionType.java
index 4e0eddc..1f78a48 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolCollectionType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolCollectionType.java
@@ -222,5 +222,22 @@
 	@Override

 	public String toString() {

 		return this.getName() + "<" + this.getContentType() + ">";

-	}	

+	}

+	

+	/*

+	If A is a sub-type of B, then the parent types of Sequence(A) are:

+		- Collection(A)

+		- Sequence(B) [This is not supported yet by the implementation below]

+	 */

+	@Override

+	public EolType getParentType() {

+		if (this.isBag() || this.isSet() || this.isOrderedSet() || this.isSequence())

+			return new EolCollectionType("Collection", this.getContentType());

+		else {

+			if (!(this.getContentType() instanceof EolAnyType))

+				return new EolCollectionType("Collection", EolAnyType.Instance);

+			else

+				return EolAnyType.Instance;

+		}

+	}

 }

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelElementType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelElementType.java
index 984d6f9..b254f14 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelElementType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelElementType.java
@@ -14,15 +14,17 @@
 import java.util.Collections;

 import java.util.List;

 import java.util.Objects;

+import java.util.stream.Collectors;

+

 import org.eclipse.epsilon.common.module.ModuleElement;

 import org.eclipse.epsilon.common.util.CollectionUtil;

 import org.eclipse.epsilon.eol.IEolModule;

-import org.eclipse.epsilon.eol.compile.m3.MetaClass;

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelElementTypeNotFoundException;

 import org.eclipse.epsilon.eol.exceptions.models.EolModelNotFoundException;

 import org.eclipse.epsilon.eol.execute.context.IEolContext;

 import org.eclipse.epsilon.eol.execute.context.Variable;

+import org.eclipse.epsilon.eol.m3.MetaClass;

 import org.eclipse.epsilon.eol.models.IModel;

 import org.eclipse.epsilon.eol.models.ModelRepository;

 import org.eclipse.epsilon.eol.models.ModelRepository.AmbiguityCheckResult;

@@ -258,4 +260,13 @@
 		

 		return eq;

 	}

+

+	@Override

+	public List<EolType> getParentTypes() {

+		if (this.metaClass != null && !this.metaClass.getSuperTypes().isEmpty()) {

+			return this.metaClass.getSuperTypes().stream().map(s -> new EolModelElementType(s)).collect(Collectors.toList());

+		} else {

+			return super.getParentTypes();

+		}

+	}

 }

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelType.java
index 2d67286..11c7762 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolModelType.java
@@ -18,18 +18,15 @@
 

 	public EolModelType() {

 		super();

-		// TODO Auto-generated constructor stub

 	}

 

 	@Override

 	public boolean isType(Object o) {

-		// TODO Auto-generated method stub

 		return false;

 	}

 

 	@Override

 	public boolean isKind(Object o) {

-		// TODO Auto-generated method stub

 		return false;

 	}

 	

@@ -45,7 +42,6 @@
 	

 	@Override

 	public String getName() {

-		// TODO Auto-generated method stub

 		return null;

 	}

 }

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolNoType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolNoType.java
index 9c5c7ec..61510f6 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolNoType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolNoType.java
@@ -45,5 +45,10 @@
 	}

 	

 	public static class EolNoTypeInstance{}

+

+	@Override

+	public EolType getParentType() {

+		return null;

+	}

 	

 }

diff --git a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolType.java b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolType.java
index b79a769..95413c3 100644
--- a/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolType.java
+++ b/plugins/org.eclipse.epsilon.eol.engine/src/org/eclipse/epsilon/eol/types/EolType.java
@@ -9,8 +9,11 @@
  ******************************************************************************/

 package org.eclipse.epsilon.eol.types;

 

+import java.util.Arrays;

+import java.util.Collections;

 import java.util.List;

 import java.util.Objects;

+

 import org.eclipse.epsilon.eol.exceptions.EolRuntimeException;

 

 public abstract class EolType {

@@ -48,4 +51,14 @@
 		

 		return Objects.equals(this.getName(), eolType.getName());

 	}

+	

+	public List<EolType> getParentTypes() {

+		EolType parentType = getParentType();

+		if (parentType == null) return Collections.emptyList();

+		else return Arrays.asList(parentType);

+	}

+	

+	protected EolType getParentType() {

+		return EolAnyType.Instance;

+	}

 }