Initial Ideas on running tests via maven
diff --git a/.gitignore b/.gitignore
index b0bd381..b9d4b5a 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,12 +1,15 @@
 # binaries
 bin/
-target
+target/
 *.jar
 
 # Ignore IntelliJ files
 *.iml
 *.idea/
 
+# Ignore Eclipse settings
+*.settings
+
 # Ignore sym-link to project stored in EpsilonLabs
 /plugins/org.eclipse.epsilon.antlr.dev
 
@@ -79,6 +82,8 @@
 /tests/org.eclipse.epsilon.test/TEST-default.StringTests.xml
 /tests/org.eclipse.epsilon.test/TEST-*.xml
 
+/tests/org.eclipse.epsilon.test.unit/TEST-*.xml
+
 # /tests/org.eclipse.epsilon.workflow.test/resources/
 /tests/org.eclipse.epsilon.workflow.test/resources/TEST-default.sample.xml
 
diff --git a/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/util/FileUtil.java b/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/util/FileUtil.java
index 390352b..20ce455 100644
--- a/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/util/FileUtil.java
+++ b/plugins/org.eclipse.epsilon.common/src/org/eclipse/epsilon/common/util/FileUtil.java
@@ -9,45 +9,78 @@
  ******************************************************************************/

 package org.eclipse.epsilon.common.util;

 

+import static java.nio.file.attribute.PosixFilePermission.OWNER_EXECUTE;

+import static java.nio.file.attribute.PosixFilePermission.OWNER_READ;

+import static java.nio.file.attribute.PosixFilePermission.OWNER_WRITE;

+import static java.security.AccessController.doPrivileged;

+

 import java.io.BufferedReader;

 import java.io.File;

-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
+import java.io.FileInputStream;

+import java.io.FileNotFoundException;

+import java.io.FileOutputStream;

 import java.io.FileReader;

 import java.io.FileWriter;

-import java.io.IOException;
-import java.io.InputStream;
+import java.io.IOException;

+import java.io.InputStream;

+import java.io.OutputStream;

 import java.io.UnsupportedEncodingException;

+import java.net.URISyntaxException;

 import java.net.URLDecoder;

 import java.nio.channels.FileChannel;

+import java.nio.file.DirectoryStream;

+import java.nio.file.FileAlreadyExistsException;

+import java.nio.file.FileSystems;

 import java.nio.file.Files;

+import java.nio.file.InvalidPathException;

 import java.nio.file.Path;

 import java.nio.file.Paths;

-import java.util.*;
+import java.nio.file.attribute.FileAttribute;

+import java.nio.file.attribute.PosixFilePermission;

+import java.nio.file.attribute.PosixFilePermissions;

+import java.util.*;

+

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 public class FileUtil {

-	private FileUtil() {}

-	

+

+	private static Logger logger = LoggerFactory.getLogger(FileUtil.class);

+	// temporary directory location

+	private static final Path tmpdir = Paths.get(System.getProperty("java.io.tmpdir"));

+

+	private static final boolean isPosix = FileSystems.getDefault().supportedFileAttributeViews().contains("posix");

+

+	// default file and directory permissions (lazily initialized)

+	private static class PosixPermissions {

+		static final FileAttribute<Set<PosixFilePermission>> filePermissions = PosixFilePermissions

+				.asFileAttribute(EnumSet.of(OWNER_READ, OWNER_WRITE));

+		static final FileAttribute<Set<PosixFilePermission>> dirPermissions = PosixFilePermissions

+				.asFileAttribute(EnumSet.of(OWNER_READ, OWNER_WRITE, OWNER_EXECUTE));

+	}

+

+	private FileUtil() {

+	}

+

 	public static Path getCurrentDirectory() {

 		return Paths.get(".").toAbsolutePath().normalize();

 	}

-	

+

 	public static void setFileContents(String str, File file) throws Exception {

 		try (FileWriter writer = new FileWriter(file)) {

 			writer.append(str);

 			writer.flush();

 		}

 	}

-	

+

 	public static String replaceExtension(String filename, String newExtension) {

 		int dotIndex = filename.lastIndexOf('.');

 		if (dotIndex > -1) {

-			filename = filename.substring(0, dotIndex+1) + newExtension;

+			filename = filename.substring(0, dotIndex + 1) + newExtension;

 		}

 		return filename;

 	}

-	

+

 	public static String removeExtension(String filename) {

 		int dotIndex = filename.lastIndexOf('.');

 		if (dotIndex > -1) {

@@ -55,21 +88,22 @@
 		}

 		return filename;

 	}

-	

+

 	public static String getFileName(String path) {

 		return getFileName(path, true);

 	}

-	

+

 	public static String getFileName(String path, boolean includeExtension) {

-		String filename = path.substring(path.replace("\\", "/").lastIndexOf('/')+1);

+		String filename = path.substring(path.replace("\\", "/").lastIndexOf('/') + 1);

 		if (!includeExtension) {

 			filename = removeExtension(filename);

 		}

 		return filename;

 	}

-	

+

 	/**

 	 * Copied from @linkplain{https://stackoverflow.com/a/3571239/5870336}

+	 * 

 	 * @param filename

 	 * @return

 	 * @since 1.6

@@ -78,11 +112,11 @@
 		String extension = "";

 		int dotIndex = filename.lastIndexOf('.');

 		if (dotIndex > Math.max(filename.lastIndexOf('/'), filename.lastIndexOf('\\'))) {

-		    extension = filename.substring(dotIndex+1);

+			extension = filename.substring(dotIndex + 1);

 		}

 		return extension;

 	}

-	

+

 	public static String getFileContents(File file) throws Exception {

 		final StringBuffer buffer = new StringBuffer();

 		final String lineSeparator = System.getProperty("line.separator");

@@ -91,10 +125,10 @@
 			buffer.append(line);

 			buffer.append(lineSeparator);

 		}

-		

+

 		return buffer.toString();

 	}

-	

+

 	public static Collection<String> getFileLineContents(File file) throws Exception {

 		try (BufferedReader bufferedReader = new BufferedReader(new FileReader(file))) {

 			final List<String> lines = new LinkedList<>();

@@ -109,7 +143,7 @@
 			return lines;

 		}

 	}

-	

+

 	public static String getAbsolutePath(String basePath, String relativePath) {

 		File file = new File(relativePath);

 		if (!file.isAbsolute()) {

@@ -117,148 +151,197 @@
 		}

 		return file.getAbsolutePath();

 	}

-	

+

+	/**

+	 * Gets a file stored as a resource in a jar. Since not all users of the file

+	 * can read from inside jars, we get the file as a stream and create a temp file

+	 * with its contents.

+	 * 

+	 * @param name

+	 * @param relativeTo

+	 * @return

+	 */

 	public static File getFile(String name, Class<?> relativeTo) {

-		try {

-			final File clazz = new File(URLDecoder.decode(relativeTo.getResource(relativeTo.getSimpleName() + ".class").getFile(), "UTF-8"));

-			

-			return new File(clazz.getParentFile(), name);

-		

-		} catch (UnsupportedEncodingException e) {

-			throw new IllegalArgumentException(name + " could not be located relative to " + relativeTo);

-		}

+		logger.info("getFile {}@{}", name, relativeTo.getSimpleName());

+		InputStream is = relativeTo.getResourceAsStream(name);

+		return inputStreamToFile(is, name);

 	}

-	

+

+	@Deprecated

 	public static File getDirectoryOf(Class<?> clazz) {

 		return getFile(clazz.getSimpleName() + ".class", clazz).getParentFile();

 	}

-	

+

+	@Deprecated

 	public static String getPath(String name, Class<?> relativeTo) {

 		return getFile(name, relativeTo).getAbsolutePath();

 	}

-
-	public static void checkFileExists(final File file) throws FileNotFoundException {
-		if (!file.exists()) {
-			throw new FileNotFoundException(
-				"File " + file.getPath() + " does not exist");
-		}
-	}
-
-	public static File copyToTemp(File srcFile) throws IOException {
-		File tmpFile = File.createTempFile("filecompare", "tmp");
-		if (srcFile.isDirectory()) {
-			tmpFile.delete();
-			tmpFile.mkdir();
-		}
-		copy(srcFile, tmpFile);
-		return tmpFile;
-	}
-
-	public static void copy(File srcFile, File dstFile) throws IOException {
-		if (srcFile.isDirectory()) {
-			dstFile.mkdir();
-			for (File entry : srcFile.listFiles()) {
-				copy(entry, new File(dstFile, entry.getName()));
-			}
-		}
-		else {
-			// Based on the second answer in http://stackoverflow.com/questions/106770.
-			FileInputStream isSrc = null;
-			FileOutputStream osDst = null;
-			FileChannel chSrc = null;
-			FileChannel chDst = null;
-			try {
-				isSrc = new FileInputStream(srcFile);
-				osDst = new FileOutputStream(dstFile);
-				chSrc = isSrc.getChannel();
-				chDst = osDst.getChannel();
-				final long srcBytes = srcFile.length();
-				long transferred = 0;
-				while (transferred < srcBytes) {
-					transferred += chDst.transferFrom(chSrc, transferred, srcBytes);
-					chDst.position(transferred);
-				}
-			}
-			finally {
-				if (chDst != null) {
-					chDst.close();
-				}
-				else if (osDst != null) {
-					osDst.close();
-				}
-
-				if (chSrc != null) {
-					chSrc.close();
-				}
-				else if (isSrc != null) {
-					isSrc.close();
-				}
-			}
-		}
-	}
-
-	public static Set<String> listFilesAsSet(File fileExpected) {
-		return new HashSet<>(Arrays.asList(fileExpected.list()));
-	}
-
-	/**
-	 * We implement our own comparison algorithm here, so we don't need Eclipse
-	 * Compare to compute differences, but rather only to show them in the UI.
-	 */
-	public static boolean sameContents(File fileExpected, File fileActual, Set<String> ignoreFilenames) throws IOException {
-		if (fileExpected.isDirectory() != fileActual.isDirectory()) {
-			// One is a file, the other is a directory: not the same
-			return false;
-		}
-
-		if (fileExpected.isDirectory()) {
-			// Both are directories: they should contain the same filenames,
-			// and each pair should have the same contents
-			final Set<String> expectedFilenames = listFilesAsSet(fileExpected);
+

+	public static void checkFileExists(final File file) throws FileNotFoundException {

+		if (!file.exists()) {

+			throw new FileNotFoundException("File " + file.getPath() + " does not exist");

+		}

+	}

+

+	public static File createTempFile(String name) {

+		return createTempFile(name, "tmp");

+	}

+

+	public static File createTempFile(String name, String extension) {

+		Path tmpFile;

+		try {

+			// tmpFile = Files.createTempFile(name, extension);

+			tmpFile = createTempFile(null, name, extension);

+		} catch (IOException e) {

+			throw new IllegalArgumentException("Could not create temp file ", e);

+		}

+		return tmpFile.toFile();

+	}

+

+	public static File createTempDir(String name) {

+		return createTempDir(name, false);

+	}

+

+	public static File createTempDir(String name, boolean reuse) {

+		Path tmpFile = null;

+		if (reuse) {

+			DirectoryStream.Filter<Path> filter = new DirectoryStream.Filter<Path>() {

+				@Override

+				public boolean accept(Path file) throws IOException {

+					return (Files.isDirectory(file) && file.getFileName().startsWith(Paths.get(name)));

+				}

+			};

+			Iterator<Path> it;

+			try {

+				it = Files.newDirectoryStream(tmpdir, filter).iterator();

+				tmpFile = it.hasNext() ? it.next() : null;

+			} catch (IOException e) {

+				// TODO Auto-generated catch block

+				e.printStackTrace();

+			}

+		}

+		if (tmpFile == null) {

+			try {

+				tmpFile = createTempDirectory(null, name);

+			} catch (IOException e) {

+				throw new IllegalArgumentException("Could not create temp directory ", e);

+			}

+		}

+		return tmpFile.toFile();

+	}

+

+	public static File copyToTemp(File srcFile) throws IOException {

+		File tmpFile = File.createTempFile("filecompare", "tmp");

+		if (srcFile.isDirectory()) {

+			tmpFile.delete();

+			tmpFile.mkdir();

+		}

+		copy(srcFile, tmpFile);

+		return tmpFile;

+	}

+

+	public static void copy(File srcFile, File dstFile) throws IOException {

+		if (srcFile.isDirectory()) {

+			dstFile.mkdir();

+			for (File entry : srcFile.listFiles()) {

+				copy(entry, new File(dstFile, entry.getName()));

+			}

+		} else {

+			// Based on the second answer in http://stackoverflow.com/questions/106770.

+			FileInputStream isSrc = null;

+			FileOutputStream osDst = null;

+			FileChannel chSrc = null;

+			FileChannel chDst = null;

+			try {

+				isSrc = new FileInputStream(srcFile);

+				osDst = new FileOutputStream(dstFile);

+				chSrc = isSrc.getChannel();

+				chDst = osDst.getChannel();

+				final long srcBytes = srcFile.length();

+				long transferred = 0;

+				while (transferred < srcBytes) {

+					transferred += chDst.transferFrom(chSrc, transferred, srcBytes);

+					chDst.position(transferred);

+				}

+			} finally {

+				if (chDst != null) {

+					chDst.close();

+				} else if (osDst != null) {

+					osDst.close();

+				}

+

+				if (chSrc != null) {

+					chSrc.close();

+				} else if (isSrc != null) {

+					isSrc.close();

+				}

+			}

+		}

+	}

+

+	public static Set<String> listFilesAsSet(File fileExpected) {

+		return new HashSet<>(Arrays.asList(fileExpected.list()));

+	}

+

+	/**

+	 * We implement our own comparison algorithm here, so we don't need Eclipse

+	 * Compare to compute differences, but rather only to show them in the UI.

+	 */

+	public static boolean sameContents(File fileExpected, File fileActual, Set<String> ignoreFilenames)

+			throws IOException {

+		if (fileExpected.isDirectory() != fileActual.isDirectory()) {

+			// One is a file, the other is a directory: not the same

+			return false;

+		}

+

+		if (fileExpected.isDirectory()) {

+			// Both are directories: they should contain the same filenames,

+			// and each pair should have the same contents

+			final Set<String> expectedFilenames = listFilesAsSet(fileExpected);

 			final Set<String> actualFilenames = listFilesAsSet(fileActual);

 			expectedFilenames.removeAll(ignoreFilenames);

 			actualFilenames.removeAll(ignoreFilenames);

-
-			if (!expectedFilenames.equals(actualFilenames)) {
-				return false;
-			}
-			for (String filename : expectedFilenames) {
-				final File expectedEntry = new File(fileExpected, filename);
-				final File actualEntry = new File(fileActual, filename);
-				if (!sameContents(expectedEntry, actualEntry, ignoreFilenames)) {
-					return false;
-				}
-			}
-			return true;
-		}
-		else {
-			if (fileExpected.length() != fileActual.length()) {
-				// Different length: no need to read the files
-				return false;
-			}
-
+

+			if (!expectedFilenames.equals(actualFilenames)) {

+				return false;

+			}

+			for (String filename : expectedFilenames) {

+				final File expectedEntry = new File(fileExpected, filename);

+				final File actualEntry = new File(fileActual, filename);

+				if (!sameContents(expectedEntry, actualEntry, ignoreFilenames)) {

+					return false;

+				}

+			}

+			return true;

+		} else {

+			if (fileExpected.length() != fileActual.length()) {

+				// Different length: no need to read the files

+				return false;

+			}

+

 			try (FileInputStream isExpected = new FileInputStream(fileExpected)) {

 				try (FileInputStream isActual = new FileInputStream(fileActual)) {

 					return sameContents(isExpected, isActual);

 				}

-			}
-		}
-	}
-
-	public static boolean sameContents(InputStream isExpected, InputStream isActual) throws IOException {
-		int chExpected, chActual;
-	
-		do {
-			chExpected = isExpected.read();
-			chActual = isActual.read();
-		}
-		while (chExpected == chActual && chExpected > 0 && chActual > 0);
-	
-		return chExpected == chActual;
+			}

+		}

 	}

-	

+

+	public static boolean sameContents(InputStream isExpected, InputStream isActual) throws IOException {

+		int chExpected, chActual;

+

+		do {

+			chExpected = isExpected.read();

+			chActual = isActual.read();

+		} while (chExpected == chActual && chExpected > 0 && chActual > 0);

+

+		return chExpected == chActual;

+	}

+

 	/**

-	 * WARNIING: Use with caution! Deletes all contents and sub-directories of the specified path.

+	 * WARNIING: Use with caution! Deletes all contents and sub-directories of the

+	 * specified path.

+	 * 

 	 * @param dir The absolute path to the directory.

 	 * @throws IOException

 	 * @since 1.6

@@ -266,31 +349,193 @@
 	public static void deleteDirectory(String dir) throws IOException {

 		Path path = Paths.get(dir);

 		if (Files.exists(path)) {

-			Files.walk(path)

-		        .map(Path::toFile)

-		        .sorted((o1, o2) -> -o1.compareTo(o2))

-		        .forEach(File::delete);

+			Files.walk(path).map(Path::toFile).sorted((o1, o2) -> -o1.compareTo(o2)).forEach(File::delete);

 		}

 	}

-	

+

 	/**

-	 * Reads entire directory recursively, mapping the contents of each file

-	 * as a string to its path.

+	 * Reads entire directory recursively, mapping the contents of each file as a

+	 * string to its path.

 	 * 

 	 * @param dir The root directory.

 	 * @return The contents of each file in the directory and its subdirectories.

 	 * @throws IOException

 	 * @since 1.6

 	 */

-	public static Map<Path, String> readDirectory(String dir) throws IOException {		

+	public static Map<Path, String> readDirectory(String dir) throws IOException {

 		Map<Path, String> contents = new HashMap<>();

-		

-		for (Path path : ((Iterable<Path>)Files.walk(Paths.get(dir))::iterator)) {

+

+		for (Path path : ((Iterable<Path>) Files.walk(Paths.get(dir))::iterator)) {

 			if (Files.isRegularFile(path)) {

 				contents.put(path, new String(Files.readAllBytes(path)));

 			}

 		}

-		

+

 		return contents;

-	}
+	}

+

+	private static File inputStreamToFile(InputStream inputStream, String name) {

+		logger.debug("inputStreamToFile {}", name);

+		OutputStream outputStream = null;

+		String prefix = name;

+		String suffix = "";

+		Path dirStructure = null;

+		

+		// Name might be a path, get the file name, remove it

+		if (name.contains("/")) {

+			dirStructure = Paths.get(tmpdir.toString(), name.substring(0, name.lastIndexOf("/")), "/");

+			dirStructure.toFile().mkdirs();

+			name = name.substring(name.lastIndexOf("/") + 1);

+			logger.debug("inputStreamToFile {}", name);

+		}

+

+		String[] parts = name.split("\\.");

+		if (parts.length == 2) {

+			prefix = parts[0];

+			suffix = "." + parts[1];

+			logger.debug("splitting name and extension: {} - {}", prefix, suffix);

+		}

+		File file = null;

+		try {

+			Path tempFile;

+			try {

+				// tempFile = Files.createTempFile(prefix, sufix);

+				tempFile = createTempFile(dirStructure, prefix, suffix);

+			} catch (IllegalArgumentException e) {

+				logger.error("Error creating temp file: {}-{}", prefix, suffix, e);

+				throw e;

+			}

+			outputStream = new FileOutputStream(tempFile.toFile());

+

+			int read = 0;

+			byte[] bytes = new byte[1024];

+			logger.debug("{} bytes available", inputStream.available());

+			while ((read = inputStream.read(bytes)) != -1) {

+				logger.debug("{} bytes read from input", read);

+				outputStream.write(bytes, 0, read);

+			}

+			logger.debug("Copying data into temp file Done!");

+//			Runtime.getRuntime().addShutdownHook(new Thread() {

+//	            @Override

+//	            public void run() {

+//	                try {

+//	                    Files.delete(tempFile);

+//	                } catch (IOException e) {

+//	                    e.printStackTrace();

+//	                }

+//	            }

+//	        });

+			file = tempFile.toFile();

+

+		} catch (IOException e) {

+			logger.error("Unable to create File for resoruce", e);

+			e.printStackTrace();

+		} finally {

+			if (inputStream != null) {

+				try {

+					inputStream.close();

+				} catch (IOException e) {

+					e.printStackTrace();

+				}

+			}

+			if (outputStream != null) {

+				try {

+					outputStream.close();

+				} catch (IOException e) {

+					e.printStackTrace();

+				}

+

+			}

+		}

+

+		return file;

+	}

+

+	static Path createTempDirectory(Path dir, String prefix, FileAttribute<?>... attrs) throws IOException {

+		return create(dir, prefix, null, true, attrs);

+	}

+

+	static Path createTempFile(Path dir, String prefix, String suffix, FileAttribute<?>... attrs) throws IOException {

+		return create(dir, prefix, suffix, false, attrs);

+	}

+

+	/**

+	 * Creates a file or directory in in the given given directory (or in the

+	 * temporary directory if dir is {@code null}).

+	 */

+	private static Path create(Path dir, String prefix, String suffix, boolean createDirectory,

+			FileAttribute<?>[] attrs) throws IOException {

+		if (prefix == null)

+			prefix = "";

+		if (suffix == null)

+			suffix = (createDirectory) ? "" : ".tmp";

+		if (dir == null)

+			dir = tmpdir;

+

+		// in POSIX environments use default file and directory permissions

+		// if initial permissions not given by caller.

+		if (isPosix && (dir.getFileSystem() == FileSystems.getDefault())) {

+			if (attrs.length == 0) {

+				// no attributes so use default permissions

+				attrs = new FileAttribute<?>[1];

+				attrs[0] = (createDirectory) ? PosixPermissions.dirPermissions : PosixPermissions.filePermissions;

+			} else {

+				// check if posix permissions given; if not use default

+				boolean hasPermissions = false;

+				for (int i = 0; i < attrs.length; i++) {

+					if (attrs[i].name().equals("posix:permissions")) {

+						hasPermissions = true;

+						break;

+					}

+				}

+				if (!hasPermissions) {

+					FileAttribute<?>[] copy = new FileAttribute<?>[attrs.length + 1];

+					System.arraycopy(attrs, 0, copy, 0, attrs.length);

+					attrs = copy;

+					attrs[attrs.length - 1] = (createDirectory) ? PosixPermissions.dirPermissions

+							: PosixPermissions.filePermissions;

+				}

+			}

+		}

+

+		// loop generating random names until file or directory can be created

+		SecurityManager sm = System.getSecurityManager();

+		//for (;;) {

+			Path f;

+			try {

+				f = generatePath(prefix, suffix, dir);

+			} catch (InvalidPathException e) {

+				// don't reveal temporary directory location

+				if (sm != null)

+					throw new IllegalArgumentException("Invalid prefix or suffix");

+				throw e;

+			}

+			try {

+				if (createDirectory) {

+					return Files.createDirectory(f, attrs);

+				} else {

+					return Files.createFile(f, attrs);

+				}

+			} catch (SecurityException e) {

+				// don't reveal temporary directory location

+				if (dir == tmpdir && sm != null)

+					throw new SecurityException("Unable to create temporary file or directory");

+				throw e;

+			} catch (FileAlreadyExistsException e) {

+				// FIXME Add the file deletion so we dont need this.

+				// FIXME or make each test use a different folder...

+				logger.debug("File found, reusing");

+				return f;

+				

+			}

+		//}

+	}

+

+	private static Path generatePath(String prefix, String suffix, Path dir) {

+		Path name = dir.getFileSystem().getPath(prefix + suffix);

+		// the generated name should be a simple file name

+		if (name.getParent() != null)

+			throw new IllegalArgumentException("Invalid prefix or suffix");

+		return dir.resolve(name);

+	}

 }

diff --git a/plugins/org.eclipse.epsilon.dependencies/META-INF/MANIFEST.MF b/plugins/org.eclipse.epsilon.dependencies/META-INF/MANIFEST.MF
index ec84001..c640bdd 100644
--- a/plugins/org.eclipse.epsilon.dependencies/META-INF/MANIFEST.MF
+++ b/plugins/org.eclipse.epsilon.dependencies/META-INF/MANIFEST.MF
@@ -4,6 +4,7 @@
 Bundle-SymbolicName: org.eclipse.epsilon.dependencies

 Bundle-Version: 1.6.0.qualifier
 Bundle-Vendor: Eclipse Modeling Project

-Require-Bundle: org.antlr.runtime;bundle-version="[3.1.1,3.3.0]";visibility:=reexport

+Require-Bundle: org.antlr.runtime;bundle-version="[3.1.1,3.3.0]";visibility:=reexport,

+ org.slf4j.api;bundle-version="1.7.2";visibility:=reexport

 Bundle-RequiredExecutionEnvironment: JavaSE-1.8

 Automatic-Module-Name: org.eclipse.epsilon.dependencies

diff --git a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfUtil.java b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfUtil.java
index 6495b4e..1e9a8d1 100644
--- a/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfUtil.java
+++ b/plugins/org.eclipse.epsilon.emc.emf/src/org/eclipse/epsilon/emc/emf/EmfUtil.java
@@ -37,8 +37,12 @@
 import org.eclipse.emf.ecore.xmi.impl.EcoreResourceFactoryImpl;

 import org.eclipse.emf.ecore.xmi.impl.XMIResourceFactoryImpl;

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

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 public class EmfUtil {

+	

+	private static Logger logger = LoggerFactory.getLogger(EmfUtil.class);

 		

 	public static EStructuralFeature getEStructuralFeature(EClass eClass, String featureName) {

 		try {

@@ -184,6 +188,7 @@
 				

 				adjustNsAndPrefix(metamodel, p, useUriForResource);

 				registry.put(p.getNsURI(), p);

+				logger.debug("Registered metamodel with URI {}", p.getNsURI());

 				ePackages.add(p);

 			}

 		}

diff --git a/plugins/org.eclipse.epsilon.targetplatform/org.eclipse.epsilon.targetplatform-neon.target b/plugins/org.eclipse.epsilon.targetplatform/org.eclipse.epsilon.targetplatform-neon.target
index 8946de6..d9e88cb 100644
--- a/plugins/org.eclipse.epsilon.targetplatform/org.eclipse.epsilon.targetplatform-neon.target
+++ b/plugins/org.eclipse.epsilon.targetplatform/org.eclipse.epsilon.targetplatform-neon.target
@@ -29,8 +29,6 @@
 <unit id="org.apache.commons.math3.source" version="3.5.0.v20160301-1110"/>
 <unit id="org.dom4j" version="1.6.1.v201312101416"/>
 <unit id="org.dom4j.source" version="1.6.1.v201312101416"/>
-<unit id="org.hamcrest.core" version="1.3.0.v201303031735"/>
-<unit id="org.hamcrest.core.source" version="1.3.0.v201303031735"/>
 <unit id="org.hamcrest.library" version="1.3.0.v201505072020"/>
 <unit id="org.hamcrest.library.source" version="1.3.0.v201505072020"/>
 <unit id="org.slf4j.api" version="1.7.2.v20121108-1250"/>
diff --git a/tests/org.eclipse.epsilon.commons.test/src/org/eclipse/epsilon/commons/util/MultimapTests.java b/tests/org.eclipse.epsilon.commons.test/src/org/eclipse/epsilon/commons/util/MultimapTests.java
index 237709c..454012b 100644
--- a/tests/org.eclipse.epsilon.commons.test/src/org/eclipse/epsilon/commons/util/MultimapTests.java
+++ b/tests/org.eclipse.epsilon.commons.test/src/org/eclipse/epsilon/commons/util/MultimapTests.java
@@ -21,7 +21,6 @@
 import java.util.Arrays;
 import java.util.Collections;
 import org.eclipse.epsilon.common.util.Multimap;
-import org.hamcrest.collection.IsEmptyCollection;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
diff --git a/tests/org.eclipse.epsilon.concordance.core.test/src/org/eclipse/epsilon/concordance/model/UriContentReaderTests.java b/tests/org.eclipse.epsilon.concordance.core.test/src/org/eclipse/epsilon/concordance/model/UriContentReaderTests.java
index 332a3b7..0043b4d 100644
--- a/tests/org.eclipse.epsilon.concordance.core.test/src/org/eclipse/epsilon/concordance/model/UriContentReaderTests.java
+++ b/tests/org.eclipse.epsilon.concordance.core.test/src/org/eclipse/epsilon/concordance/model/UriContentReaderTests.java
@@ -25,7 +25,7 @@
 public class UriContentReaderTests {
 
 	private static final String NEW_LINE = System.getProperty("line.separator");
-	private static final File file = FileUtil.getFile("example.txt", UriContentReaderTests.class);
+	private static final File file = FileUtil.createTempFile("example", ".txt");
 	
 	@BeforeClass
 	public static void setupOnce() throws Exception {
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/Engine.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/Engine.java
index a3a18ab..d632870 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/Engine.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/Engine.java
@@ -13,6 +13,7 @@
 import static org.junit.Assert.assertTrue;
 
 import java.io.File;
+import java.nio.file.Paths;
 import java.util.Collection;
 
 import org.eclipse.epsilon.common.parse.problem.ParseProblem;
@@ -42,7 +43,12 @@
 		NonExistentImport = FileUtil.getFile("NonExistentImport.egl", Engine.class);
 		
 		runtimeExceptionProgram = FileUtil.getFile("RuntimeException.egl", Engine.class);
-		invalidPath             = FileUtil.getFile("Inva*lid.egl",         Engine.class);
+		// FIXME We want a temp file
+		// invalidPath             = FileUtil.getFile("Inva*lid.egl",         Engine.class);
+		invalidPath = Paths.get("Inva*lid.egl").toFile();	
+		// Create imported files
+		FileUtil.getFile("Operations.eol", Engine.class);
+		FileUtil.getFile("Operations.egl", Engine.class);
 	}
 	
 	@Test
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/subtemplates/InvokingSubtemplates.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/subtemplates/InvokingSubtemplates.java
index 25e7228..96c8254 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/subtemplates/InvokingSubtemplates.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/engine/subtemplates/InvokingSubtemplates.java
@@ -40,6 +40,9 @@
 		factory.getTemplateExecutionListeners().add(listener);
 		
 		final File driver = getFile("Driver.egl", InvokingSubtemplates.class);
+		// Load imported files
+		getFile("first/First.egl", InvokingSubtemplates.class);
+		getFile("second/Second.egl", InvokingSubtemplates.class);
 		actual = AcceptanceTestUtil.run(factory, driver, new IModel[]{});
 	}
 	
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/extensibility/Extensibility.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/extensibility/Extensibility.java
index 7ef4d9f..74ae509 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/extensibility/Extensibility.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/extensibility/Extensibility.java
@@ -30,19 +30,23 @@
 	@BeforeClass
 	public static void setUpOnce() {
 		Driver = FileUtil.getFile("Driver.egl", Extensibility.class);
+		// Load imported files
+		FileUtil.getFile("GenerateClasses.egl", Extensibility.class);
+		FileUtil.getFile("GenerateFields.egl", Extensibility.class);
 	}
 	
 	@Test
 	public void testValid() throws Exception {
 		AcceptanceTestUtil.run(initialiseFactory(), Driver, Model.OOInstance);
 		
-		final File generatedFile = FileUtil.getFile("Pet.java", Extensibility.class);
+		final File generatedFile = FileUtil.createTempFile("Pet", ".java");
 		assertEquals(2, CountingTemplate.countFor(generatedFile));
 	}
 
 	private static CountingTemplateFactory initialiseFactory() throws EglRuntimeException {
 		final CountingTemplateFactory factory = new CountingTemplateFactory();
-		factory.setOutputRoot(FileUtil.getDirectoryOf(Extensibility.class).getAbsolutePath());
+		factory.setOutputRoot(FileUtil.createTempDir(Extensibility.class.getSimpleName()).getAbsolutePath());
+		//factory.setOutputRoot(FileUtil.getDirectoryOf(Extensibility.class).getAbsolutePath());
 		return factory;
 	}
 }
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/formatters/Formatters.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/formatters/Formatters.java
index 551c308..566ccb7 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/formatters/Formatters.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/formatters/Formatters.java
@@ -41,6 +41,10 @@
 		
 		TemplateSpecificFormatterGroup         = FileUtil.getFile("TemplateSpecificFormatterGroup.egl", Formatters.class);
 		TemplateSpecificFormatterGroupExpected = FileUtil.getFile("TemplateSpecificFormatterGroup.txt", Formatters.class);
+		
+		// Load imported files
+		FileUtil.getFile("FirstSubtemplate.egl", Formatters.class);
+		FileUtil.getFile("SecondSubtemplate.egl", Formatters.class);
 	}
 	
 	@Test
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/merge/Merge.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/merge/Merge.java
index e1dca48..9a9bd63 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/merge/Merge.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/merge/Merge.java
@@ -64,7 +64,10 @@
 		ExpectedGenerate       = FileUtil.getFile("Expected_generate.txt", Merge.class);
 		ExpectedGenerateAbsent = FileUtil.getFile("Expected_generateAbsent.txt", Merge.class);
 		ExpectedOverwrite      = FileUtil.getFile("Expected_overwrite.txt", Merge.class);
-		
+			
+		// Load imported files
+		FileUtil.getFile("OOClass2JavaClass.egl", Merge.class);
+		FileUtil.getFile("OOClass2JavaClassUnprotected.egl", Merge.class);
 		
 		org.eclipse.epsilon.egl.util.FileUtil.write(PetStore,          ExpectedStore);
 		org.eclipse.epsilon.egl.util.FileUtil.write(PetOverwrite,      ExpectedStore);
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/Output.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/Output.java
index 08f4dbd..9799bea 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/Output.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/Output.java
@@ -27,6 +27,12 @@
 	public static void setUpOnce() {
 		process  = FileUtil.getFile("Process.egl",  Output.class);
 		hierachy = FileUtil.getFile("Hierachy.egl", Output.class);
+		// Create imported files
+		FileUtil.getFile("SubTemplate1.egl", Output.class);
+		FileUtil.getFile("SubTemplate2.egl", Output.class);
+		FileUtil.getFile("SubTemplate3.egl", Output.class);
+		FileUtil.getFile("HierachySubTemplate.egl", Output.class);
+		FileUtil.getFile("HierachySubSubTemplate.egl", Output.class);
 	}
 	
 	@Test
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/lineNumbers/CurrentLineNumber.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/lineNumbers/CurrentLineNumber.java
index 8640284..0c3bb65 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/lineNumbers/CurrentLineNumber.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/output/lineNumbers/CurrentLineNumber.java
@@ -47,6 +47,8 @@
 	
 	
 	private static File getParentTemplate() {
+		// Load imported file
+		FileUtil.getFile("Child.egl",  CurrentLineNumber.class);
 		return FileUtil.getFile("Parent.egl",  CurrentLineNumber.class);
 	}
 
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/traceability/Traceability.java b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/traceability/Traceability.java
index 74f660e..e20f786 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/traceability/Traceability.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.acceptance/src/org/eclipse/epsilon/egl/test/acceptance/traceability/Traceability.java
@@ -32,8 +32,8 @@
 	private static final File program          = FileUtil.getFile("Hierachy.egl", Traceability.class);
 	private static final File subProgram       = FileUtil.getFile("Traceability.egl", Traceability.class);
 	private static final File subSubProgram    = FileUtil.getFile("OOClass2JavaClass.egl", Traceability.class);
-	private static final File programOutput    = FileUtil.getFile("Traceability.txt", Traceability.class);
-	private static final File subProgramOutput = FileUtil.getFile("OO2Java.txt", Traceability.class);
+	private static final File programOutput    = FileUtil.createTempFile("Traceability", ".txt");
+	private static final File subProgramOutput = FileUtil.createTempFile("OO2Java", ".txt");
 	
 	@Before
 	public void setUp() throws IOException {
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglFileGeneratingTemplate.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglFileGeneratingTemplate.java
index a6cf990..0a848f4 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglFileGeneratingTemplate.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglFileGeneratingTemplate.java
@@ -37,15 +37,15 @@
 	
 	@BeforeClass
 	public static void setUpOnce() throws IOException {
-		PROGRAM   = org.eclipse.epsilon.common.util.FileUtil.getFile("Generate.egl",  TestEglFileGeneratingTemplate.class);
-		OUTPUT1   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output1.txt",   TestEglFileGeneratingTemplate.class);
-		OUTPUT2   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output2.txt",   TestEglFileGeneratingTemplate.class);
-		OUTPUT3   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output3.txt",   TestEglFileGeneratingTemplate.class);
-		OUTPUT4   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output4.txt",   TestEglFileGeneratingTemplate.class);
-		OUTPUT5   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output5.txt",   TestEglFileGeneratingTemplate.class);
-		OUTPUT6   = org.eclipse.epsilon.common.util.FileUtil.getFile("Output6.txt",   TestEglFileGeneratingTemplate.class);
-		EXISTING  = org.eclipse.epsilon.common.util.FileUtil.getFile("Existing.txt",  TestEglFileGeneratingTemplate.class);
-		GENERATED = org.eclipse.epsilon.common.util.FileUtil.getFile("Generated.txt", TestEglFileGeneratingTemplate.class);
+		PROGRAM   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Generate", ".egl");
+		OUTPUT1   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output1", ".txt");
+		OUTPUT2   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output2", ".txt");
+		OUTPUT3   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output3", ".txt");
+		OUTPUT4   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output4", ".txt");
+		OUTPUT5   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output5", ".txt");
+		OUTPUT6   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Output6", ".txt");
+		EXISTING  = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Existing", ".txt");
+		GENERATED = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Generated", ".txt");
 		
 		if (!EXISTING.exists()) EXISTING.createNewFile();
 	}
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglTemplate.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglTemplate.java
index 5ed221d..0220429 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglTemplate.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestEglTemplate.java
@@ -44,13 +44,13 @@
 	
 	@BeforeClass
 	public static void setUpOnce() {
-		SIMPLE   = org.eclipse.epsilon.common.util.FileUtil.getFile("Simple.egl", TestEglTemplate.class);
-		ABSENT   = org.eclipse.epsilon.common.util.FileUtil.getFile("Absent.egl", TestEglTemplate.class);
+		SIMPLE   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Simple", ".egl");
+		ABSENT   = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Absent", ".egl");
 		
-		POPULATE = org.eclipse.epsilon.common.util.FileUtil.getFile("Populate.egl", TestEglTemplate.class);
+		POPULATE = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Populate", ".egl");
 		
-		MERGE    = org.eclipse.epsilon.common.util.FileUtil.getFile("Merge.egl", TestEglTemplate.class);
-		EXISTING = org.eclipse.epsilon.common.util.FileUtil.getFile("Existing.txt", TestEglTemplate.class);
+		MERGE    = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Merge", ".egl");
+		EXISTING = org.eclipse.epsilon.common.util.FileUtil.createTempFile("Existing", ".txt");
 		
 		if (ABSENT.exists()) ABSENT.delete();
 	}
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestTemplateFactoryModuleAdapter.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestTemplateFactoryModuleAdapter.java
index e30b49e..a9e5c66 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestTemplateFactoryModuleAdapter.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/TestTemplateFactoryModuleAdapter.java
@@ -38,9 +38,9 @@
 	
 	@BeforeClass
 	public static void setUpOnce() throws IOException {	
-		VALID_PATH           = FileUtil.getFile("Valid.txt",          TestTemplateFactoryModuleAdapter.class);
-		INVALID_PATH         = FileUtil.getFile("Invalid.txt",        TestTemplateFactoryModuleAdapter.class);
-		INVALID_RUNTIME_PATH = FileUtil.getFile("InvalidRuntime.txt", TestTemplateFactoryModuleAdapter.class);
+		VALID_PATH           = FileUtil.createTempFile("Valid", ".txt");
+		INVALID_PATH         = FileUtil.createTempFile("Invalid.", "t.xt");
+		INVALID_RUNTIME_PATH = FileUtil.createTempFile("InvalidRuntime", ".txt");
 		
 		org.eclipse.epsilon.egl.util.FileUtil.write(VALID_PATH,           valid);
 		org.eclipse.epsilon.egl.util.FileUtil.write(INVALID_PATH,         invalid);
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLConfigFileReader.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLConfigFileReader.java
index dd5d1d3..3cbbdf5 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLConfigFileReader.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLConfigFileReader.java
@@ -56,30 +56,30 @@
 	
 	@BeforeClass
 	public static void setUpOnce() throws UnsupportedEncodingException {
-		invalidPath      = FileUtil.getPath("In*alid.xml", TestXMLConfigFileReader.class);
-		nonExistentPath  = FileUtil.getPath("Absent.xml", TestXMLConfigFileReader.class);
+		invalidPath      = "In*alid.xml";
+		nonExistentPath  = "Absent.xml";
 		
-		empty          = FileUtil.getPath("Empty.xml", TestXMLConfigFileReader.class);
-		incorrectRoot  = FileUtil.getPath("IncorrectRoot.xml", TestXMLConfigFileReader.class);
+		empty          = FileUtil.getFile("Empty.xml", TestXMLConfigFileReader.class).getPath();
+		incorrectRoot  = FileUtil.getFile("IncorrectRoot.xml", TestXMLConfigFileReader.class).getPath();
 		
-		contentTypesContainingCDATA      = FileUtil.getPath("ContentTypesContainingCDATA.xml", TestXMLConfigFileReader.class);
-		contentTypesContainingWrongChild = FileUtil.getPath("ContentTypesContainingWrongChild.xml", TestXMLConfigFileReader.class);
-		contentTypesExtraAttributes      = FileUtil.getPath("ContentTypesExtraAttributes.xml", TestXMLConfigFileReader.class);
-		emptyContentTypes                = FileUtil.getPath("EmptyContentTypes.xml", TestXMLConfigFileReader.class);
+		contentTypesContainingCDATA      = FileUtil.getFile("ContentTypesContainingCDATA.xml", TestXMLConfigFileReader.class).getPath();
+		contentTypesContainingWrongChild = FileUtil.getFile("ContentTypesContainingWrongChild.xml", TestXMLConfigFileReader.class).getPath();
+		contentTypesExtraAttributes      = FileUtil.getFile("ContentTypesExtraAttributes.xml", TestXMLConfigFileReader.class).getPath();
+		emptyContentTypes                = FileUtil.getFile("EmptyContentTypes.xml", TestXMLConfigFileReader.class).getPath();
 		
-		contentTypeContainingCDATA      = FileUtil.getPath("ContentTypeContainingCDATA.xml", TestXMLConfigFileReader.class);
-		contentTypeContainingWrongChild = FileUtil.getPath("ContentTypeContainingWrongChild.xml", TestXMLConfigFileReader.class);
-		contentTypeExtraAttributes      = FileUtil.getPath("ContentTypeExtraAttributes.xml", TestXMLConfigFileReader.class);
-		emptyContentType                = FileUtil.getPath("EmptyContentType.xml", TestXMLConfigFileReader.class);
-		unnamedContentType              = FileUtil.getPath("UnnamedContentType.xml", TestXMLConfigFileReader.class);
+		contentTypeContainingCDATA      = FileUtil.getFile("ContentTypeContainingCDATA.xml", TestXMLConfigFileReader.class).getPath();
+		contentTypeContainingWrongChild = FileUtil.getFile("ContentTypeContainingWrongChild.xml", TestXMLConfigFileReader.class).getPath();
+		contentTypeExtraAttributes      = FileUtil.getFile("ContentTypeExtraAttributes.xml", TestXMLConfigFileReader.class).getPath();
+		emptyContentType                = FileUtil.getFile("EmptyContentType.xml", TestXMLConfigFileReader.class).getPath();
+		unnamedContentType              = FileUtil.getFile("UnnamedContentType.xml", TestXMLConfigFileReader.class).getPath();
 		
-		commentStyleContainingCDATA = FileUtil.getPath("CommentStyleContainingCDATA.xml", TestXMLConfigFileReader.class);
-		commentStyleEmptyEndsWith   = FileUtil.getPath("CommentStyleEmptyEndsWith.xml", TestXMLConfigFileReader.class);
-		commentStyleEmptyStartsWith = FileUtil.getPath("CommentStyleEmptyStartsWith.xml", TestXMLConfigFileReader.class);
-		commentStyleExtraAttributes = FileUtil.getPath("CommentStyleExtraAttributes.xml", TestXMLConfigFileReader.class);
-		emptyCommentStyle           = FileUtil.getPath("EmptyCommentStyle.xml", TestXMLConfigFileReader.class);
+		commentStyleContainingCDATA = FileUtil.getFile("CommentStyleContainingCDATA.xml", TestXMLConfigFileReader.class).getPath();
+		commentStyleEmptyEndsWith   = FileUtil.getFile("CommentStyleEmptyEndsWith.xml", TestXMLConfigFileReader.class).getPath();
+		commentStyleEmptyStartsWith = FileUtil.getFile("CommentStyleEmptyStartsWith.xml", TestXMLConfigFileReader.class).getPath();
+		commentStyleExtraAttributes = FileUtil.getFile("CommentStyleExtraAttributes.xml", TestXMLConfigFileReader.class).getPath();
+		emptyCommentStyle           = FileUtil.getFile("EmptyCommentStyle.xml", TestXMLConfigFileReader.class).getPath();
 		
-		valid = FileUtil.getPath("Valid.xml", TestXMLConfigFileReader.class);
+		valid = FileUtil.getFile("Valid.xml", TestXMLConfigFileReader.class).getPath();
 	}
 	
 	private Map<String, CompositePartitioner> read(String path) throws FileNotFoundException, PersistenceException {
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLContentTypeRepository.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLContentTypeRepository.java
index 643f8c4..d3c0da8 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLContentTypeRepository.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/config/TestXMLContentTypeRepository.java
@@ -14,6 +14,7 @@
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileNotFoundException;
+import java.nio.file.Paths;
 
 import org.eclipse.epsilon.egl.EglTemplateFactory;
 import org.eclipse.epsilon.egl.execute.context.EglContext;
@@ -34,9 +35,9 @@
 	
 	@BeforeClass
 	public static void setUpOnce() {
-		invalidPath     = FileUtil.getPath("In*alid.xml", TestXMLContentTypeRepository.class);
-		nonExistentPath = FileUtil.getPath("Absent.xml", TestXMLContentTypeRepository.class);
-		valid           = FileUtil.getPath("Valid.xml", TestXMLContentTypeRepository.class);
+		invalidPath     = Paths.get("Inva*lid.xml").toString();
+		nonExistentPath = "Absent.xml";
+		valid           = FileUtil.getFile("Valid.xml", TestXMLContentTypeRepository.class).getPath();
 	}
 	
 	
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/output/TestWriter.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/output/TestWriter.java
index 0825107..9a3d58c 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/output/TestWriter.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/output/TestWriter.java
@@ -30,10 +30,13 @@
 	
 	@BeforeClass
 	public static void setUpOnce() throws IOException {	
-		VALID_PATH     = FileUtil.getFile("Valid.txt", TestWriter.class);
-		READ_ONLY_PATH = FileUtil.getFile("ReadOnly.txt", TestWriter.class);
+		// FIXME What we actually want is some temp paths
+		//VALID_PATH     = FileUtil.getFile("Valid.txt", TestWriter.class);
+		//READ_ONLY_PATH = FileUtil.getFile("ReadOnly.txt", TestWriter.class);
+		VALID_PATH     = FileUtil.createTempFile("Valid.txt");
+		READ_ONLY_PATH = FileUtil.createTempFile("ReadOnly.txt");
 		
-		READ_ONLY_PATH.createNewFile();
+		// READ_ONLY_PATH.createNewFile();
 		READ_ONLY_PATH.setReadOnly();
 	}
 	
diff --git a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/parse/TestEglLexer.java b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/parse/TestEglLexer.java
index 16184f3..5c1ba37 100644
--- a/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/parse/TestEglLexer.java
+++ b/tests/org.eclipse.epsilon.egl.engine.test.unit/src/org/eclipse/epsilon/egl/parse/TestEglLexer.java
@@ -35,7 +35,9 @@
 	
 	@BeforeClass
 	public static void setUpOnce() throws IOException {
-		TEST_FILE = FileUtil.getFile("Test.txt", TestEglLexer.class);
+		// FIXME We want a temp file
+		//TEST_FILE = FileUtil.getFile("Test.txt", TestEglLexer.class);
+		TEST_FILE = FileUtil.createTempFile("Test.txt");
 		
 		final String program = "[% for(i in Sequence(1..10) { %]" + NEWLINE +
 		                       "i is [%=i%]" + NEWLINE +
diff --git a/tests/org.eclipse.epsilon.egl.traceability.fine.test.acceptance/src/org/eclipse/epsilon/egl/engine/traceability/fine/test/acceptance/EglFineGrainedTraceabilityAcceptanceTest.java b/tests/org.eclipse.epsilon.egl.traceability.fine.test.acceptance/src/org/eclipse/epsilon/egl/engine/traceability/fine/test/acceptance/EglFineGrainedTraceabilityAcceptanceTest.java
index ee7161c..c076bda 100644
--- a/tests/org.eclipse.epsilon.egl.traceability.fine.test.acceptance/src/org/eclipse/epsilon/egl/engine/traceability/fine/test/acceptance/EglFineGrainedTraceabilityAcceptanceTest.java
+++ b/tests/org.eclipse.epsilon.egl.traceability.fine.test.acceptance/src/org/eclipse/epsilon/egl/engine/traceability/fine/test/acceptance/EglFineGrainedTraceabilityAcceptanceTest.java
@@ -41,7 +41,7 @@
 	}
 	
 	protected static String getOutputPath() {
-		return FileUtil.getDirectoryOf(EglFineGrainedTraceabilityAcceptanceTest.class).getAbsolutePath();
+		return FileUtil.createTempDir(EglFineGrainedTraceabilityAcceptanceTest.class.getSimpleName(), true).getAbsolutePath();
 	}
 	
 	protected static boolean deleteOutputFile(String relativePath) {
diff --git a/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/EgxAcceptanceTestUtil.java b/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/EgxAcceptanceTestUtil.java
index 9859bce..768627e 100644
--- a/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/EgxAcceptanceTestUtil.java
+++ b/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/EgxAcceptanceTestUtil.java
@@ -55,7 +55,9 @@
 	public static Collection<EgxRunConfiguration> getScenarios(
 		List<String[]> testInputs,
 		Collection<Supplier<? extends IEgxModule>> moduleGetters) {
-			return getScenarios(EgxRunConfiguration.class, testInputs, moduleGetters, null);
+			// Load thrift-helper-functions.eol
+			FileUtil.getFile("thrift/thrift-helper-functions.eol", EgxAcceptanceTestUtil.class);
+			return getScenarios(EgxRunConfiguration.class, testInputs, moduleGetters, null, EgxAcceptanceTestUtil.class);
 	}
 	
 	public static void deleteOutputDirectories() throws IOException {
diff --git a/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/util/EgxAcceptanceTest.java b/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/util/EgxAcceptanceTest.java
index 49dbede..67aea85 100644
--- a/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/util/EgxAcceptanceTest.java
+++ b/tests/org.eclipse.epsilon.egx.engine.test.acceptance/src/org/eclipse/epsilon/egx/engine/test/acceptance/util/EgxAcceptanceTest.java
@@ -44,8 +44,9 @@
 		for (Template template : templates) {
 			factory.addVirtualTemplate(template.name, template.content);
 		}
-		
-		File egxFile = FileUtil.getFile("base.egx", EgxAcceptanceTest.class);
+		// FIXME We want a temp file or reuse the previous one
+		//File egxFile = FileUtil.getFile("base.egx", EgxAcceptanceTest.class);
+		File egxFile = FileUtil.createTempFile("base",  "egx");
 		factory.setRoot(egxFile.getParentFile().toURI());
 		return egxFile;
 	}
diff --git a/tests/org.eclipse.epsilon.emc.emf.test/src/org/eclipse/epsilon/emc/emf/EmfModelPackageForNameTests.java b/tests/org.eclipse.epsilon.emc.emf.test/src/org/eclipse/epsilon/emc/emf/EmfModelPackageForNameTests.java
index a098e65..4a8666f 100644
--- a/tests/org.eclipse.epsilon.emc.emf.test/src/org/eclipse/epsilon/emc/emf/EmfModelPackageForNameTests.java
+++ b/tests/org.eclipse.epsilon.emc.emf.test/src/org/eclipse/epsilon/emc/emf/EmfModelPackageForNameTests.java
@@ -47,8 +47,8 @@
 		for (EPackage p : metamodel) {
 			EPackage.Registry.INSTANCE.put(p.getNsURI(), p);
 		}
-		
-		final File modelFile = FileUtil.getFile("Test.model", EmfModelPackageForNameTests.class);
+		// final File modelFile = FileUtil.getFile("Test.model", EmfModelPackageForNameTests.class);
+		final File modelFile = FileUtil.createTempFile("Test.model");
 		model = EmfModelFactory.getInstance().loadEmfModel("Test", modelFile, metamodel, AccessMode.WRITE_ONLY);
 	}
 	
diff --git a/tests/org.eclipse.epsilon.emc.hutn.test/src/org/eclipse/epsilon/emc/hutn/HutnModelTests.java b/tests/org.eclipse.epsilon.emc.hutn.test/src/org/eclipse/epsilon/emc/hutn/HutnModelTests.java
index 350d863..725de0b 100644
--- a/tests/org.eclipse.epsilon.emc.hutn.test/src/org/eclipse/epsilon/emc/hutn/HutnModelTests.java
+++ b/tests/org.eclipse.epsilon.emc.hutn.test/src/org/eclipse/epsilon/emc/hutn/HutnModelTests.java
@@ -23,9 +23,11 @@
 import org.junit.Test;
 
 public class HutnModelTests extends HutnTestWithFamiliesMetaModel {
-
-	private static final String MODEL_PATH = FileUtil.getPath("temp.model", HutnModelTests.class);
-
+	
+	// FIXME We want a temp file
+	//private static final String MODEL_PATH = FileUtil.getPath("temp.model", HutnModelTests.class);
+	private static final String MODEL_PATH = FileUtil.createTempFile("temp.model").getAbsolutePath();
+	
 	private static final String hutn = families("Person \"p\" {" +
 	                                            "  name: \"John\" " +
 	                                            "}");
diff --git a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/EolAcceptanceTestSuite.java b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/EolAcceptanceTestSuite.java
index a0db26c..5d5b0ce 100644
--- a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/EolAcceptanceTestSuite.java
+++ b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/EolAcceptanceTestSuite.java
@@ -25,7 +25,7 @@
 import org.junit.runners.Suite.SuiteClasses;
 
 @RunWith(Suite.class)
-@SuiteClasses({AssignmentTests.class, CollectionPropertyTests.class, ComparisonTests.class, CreateDeleteTests.class, EqualityTests.class, CollectionsTests.class, MathTests.class, StringTests.class, AnnotatedOperationTests.class, IsDefinedTests.class, IterableTests.class,
+@SuiteClasses({AssignmentTests.class,CollectionPropertyTests.class, ComparisonTests.class, CreateDeleteTests.class, EqualityTests.class, CollectionsTests.class, MathTests.class, StringTests.class, AnnotatedOperationTests.class, IsDefinedTests.class, IterableTests.class,
 	           EqualityBecomesAssignmentInStatements.class, ReturnTypeTests.class, BuiltInVariablesTests.class, ModelElementTypeResolutionTests.class, BooleanTests.class, PropertyAccessRecording.class, ScopeTests.class, ContextlessFirstOrderOperationTests.class, DomTests.class,
 	           OperationOrderTests.class, PostfixOperatorTests.class, CompositeAssignmentTests.class, SwitchTests.class, TransactionTests.class, ModelElementConstructorTests.class,
 	           FirstOrderOperationTests.class, ParallelFirstOrderOperationTests.class, ParallelFirstOrderOperationEquivalenceTests.class, FirstOrderOperationAdvancedTests.class, FirstOrderOperationExceptionHandlingTests.class, NestedParallelOperationTests.class,
diff --git a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/EUnitRunner.java b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/EUnitRunner.java
index 46c19f8..ad2fb9a 100644
--- a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/EUnitRunner.java
+++ b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/EUnitRunner.java
@@ -38,9 +38,13 @@
 import org.junit.runner.Runner;

 import org.junit.runner.notification.Failure;

 import org.junit.runner.notification.RunNotifier;

+import org.slf4j.Logger;

+import org.slf4j.LoggerFactory;

 

 public class EUnitRunner extends Runner {

 	

+	private static Logger logger = LoggerFactory.getLogger(EUnitRunner.class);

+	

 	protected Class<?> clazz;

 	protected EUnitModule module;

 	protected HashMap<String, Description> descriptions = new HashMap<>();

@@ -59,6 +63,7 @@
 		

 		try {

 			eolFile = FileUtil.getFile(clazz.getSimpleName() + ".eol", clazz);

+			logger.debug("Test file is: {}", eolFile);

 			module.parse(eolFile);

 		} catch (Exception e) {

 			return testSuiteDescription;

diff --git a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/ModelManager.java b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/ModelManager.java
index 7327153..76096ad 100644
--- a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/ModelManager.java
+++ b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/eunit/ModelManager.java
@@ -9,8 +9,10 @@
  ******************************************************************************/
 package org.eclipse.epsilon.eol.engine.test.acceptance.eunit;
 
-import static org.eclipse.epsilon.common.util.FileUtil.getPath;
+import static org.eclipse.epsilon.common.util.FileUtil.copyToTemp;
+import static org.eclipse.epsilon.common.util.FileUtil.getFile;
 
+import java.io.File;
 import java.util.List;
 
 import org.eclipse.emf.common.util.URI;
@@ -23,14 +25,16 @@
 import org.eclipse.epsilon.eol.models.IModel;
 
 public class ModelManager {
-
+	
 	private final IEolContext context;
 	
 	public ModelManager(IEolContext context) throws Exception {
 		this.context = context;
-		
-		register(getPath("ecore_lite.ecore", ModelManager.class));
-		register(getPath("fruits.ecore",     ModelManager.class));
+		// We need to copy the metamodels cause EMF cant read from Jars
+		File ecoreLite = getFile("ecore_lite.ecore", ModelManager.class);
+		File fruits = getFile("fruits.ecore",     ModelManager.class);
+		register(copyToTemp(ecoreLite).getAbsolutePath());
+		register(copyToTemp(fruits).getAbsolutePath());
 	}
 	
 	private List<EPackage> register(String metamodelPath) throws Exception {
diff --git a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/util/EolAcceptanceTestUtil.java b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/util/EolAcceptanceTestUtil.java
index c36ab35..8596ec1 100644
--- a/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/util/EolAcceptanceTestUtil.java
+++ b/tests/org.eclipse.epsilon.eol.engine.test.acceptance/src/org/eclipse/epsilon/eol/engine/test/acceptance/util/EolAcceptanceTestUtil.java
@@ -108,17 +108,20 @@
 			Class<C> clazz,
 			List<String[]> testInputs,
 			Collection<Supplier<? extends M>> moduleGetters,
-			Function<String[], Integer> idCalculator) {
+			Function<String[], Integer> idCalculator,
+			Class<?> inputResourceOWner) {
 
 		if (idCalculator == null) idCalculator = EolAcceptanceTestUtil::getScenarioID;
 		
 		List<C> scenarios = new ArrayList<>(moduleGetters.size()*(testInputs.size()+2));
 		
 		for (String[] testInput : testInputs) {
-			Path eolScript = Paths.get(testInput[0]);
-			
-			Path modelFile = Paths.get(testInput[1]);
-			Path metamodelFile = Paths.get(testInput[2]);
+//			Path eolScript = Paths.get(testInput[0]);
+//			Path modelFile = Paths.get(testInput[1]);
+//			Path metamodelFile = Paths.get(testInput[2]);
+			Path eolScript = Paths.get(FileUtil.getFile(testInput[0], inputResourceOWner).toURI());
+			Path modelFile = Paths.get(FileUtil.getFile(testInput[1], inputResourceOWner).toURI());
+			Path metamodelFile = Paths.get(FileUtil.getFile(testInput[2], inputResourceOWner).toURI());
 			
 			for (Supplier<? extends M> moduleGetter : moduleGetters) {
 				scenarios.add(IEolRunConfiguration.Builder(clazz)
diff --git a/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlAcceptanceTestUtil.java b/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlAcceptanceTestUtil.java
index 92d4ae0..8a92b52 100644
--- a/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlAcceptanceTestUtil.java
+++ b/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlAcceptanceTestUtil.java
@@ -18,6 +18,7 @@
 import java.util.function.Function;
 import java.util.function.Supplier;
 import org.eclipse.epsilon.common.util.CollectionUtil;
+import org.eclipse.epsilon.common.util.FileUtil;
 import org.eclipse.epsilon.eol.engine.test.acceptance.util.EolAcceptanceTestUtil;
 import org.eclipse.epsilon.eol.launch.IEolRunConfiguration;
 import org.eclipse.epsilon.evl.*;
@@ -35,7 +36,7 @@
 	
 	public static final String
 		// Core
-		testsBase = getTestBaseDir(EvlAcceptanceTestUtil.class),
+		testsBase = "", // getTestBaseDir(EvlAcceptanceTestUtil.class),
 		metamodelsRoot = testsBase+"metamodels/",
 		scriptsRoot = testsBase+"scripts/",
 		modelsRoot = testsBase+"models/",
@@ -107,7 +108,7 @@
 	public static Collection<EvlRunConfiguration> getScenarios(List<String[]> testInputs, boolean includeTest, Collection<Supplier<? extends IEvlModule>> moduleGetters, Function<String[], Integer> idCalculator) {
 		if (testInputs == null) testInputs = allInputs;
 		if (moduleGetters == null) moduleGetters = modules();
-		Collection<EvlRunConfiguration> scenarios = EolAcceptanceTestUtil.getScenarios(EvlRunConfiguration.class, testInputs, moduleGetters, idCalculator);
+		Collection<EvlRunConfiguration> scenarios = EolAcceptanceTestUtil.getScenarios(EvlRunConfiguration.class, testInputs, moduleGetters, idCalculator, EvlAcceptanceTestUtil.class);
 		
 		if (includeTest) {
 			for (Supplier<? extends IEvlModule> moduleGetter : moduleGetters) {
@@ -150,6 +151,7 @@
 		return getScenarios(null, true, Arrays.asList(moduleGetters), null);
 	}
 	public static Collection<EvlRunConfiguration> getScenarios(List<String[]> testInputs, boolean includeTest, Collection<Supplier<? extends IEvlModule>> moduleGetters) {
+		FileUtil.getFile("thrift-helper-functions.eol", EvlAcceptanceTestUtil.class);
 		return getScenarios(testInputs, includeTest, moduleGetters, null);
 	}
 	public static Collection<Supplier<? extends IEvlModule>> modules() {
diff --git a/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlTests.java b/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlTests.java
index 1c251be..ba0dd5e 100644
--- a/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlTests.java
+++ b/tests/org.eclipse.epsilon.evl.engine.test.acceptance/src/org/eclipse/epsilon/evl/engine/test/acceptance/EvlTests.java
@@ -11,6 +11,7 @@
 
 import static org.junit.Assert.*;
 import java.io.File;
+import java.nio.file.FileSystemNotFoundException;
 import java.util.*;
 import java.util.Map.Entry;
 import java.util.function.Supplier;
@@ -42,14 +43,14 @@
 @RunWith(Parameterized.class)
 public class EvlTests {
 
-	private static final IModel
-		TEST_MODEL = setUpModel("test.xml"),
-		OPTIMISED_MODEL = setUpModel("optimised.xml");
+//	private static final IModel
+//		TEST_MODEL = setUpModel("test.xml"),
+//		OPTIMISED_MODEL = setUpModel("optimised.xml");
 	
 	@BeforeClass
 	public static void setUpBeforeClass() throws Exception {
-		TEST_MODEL.load();
-		OPTIMISED_MODEL.load();
+//		TEST_MODEL.load();
+//		OPTIMISED_MODEL.load();
 	}
 	
 	@Parameter
@@ -65,14 +66,23 @@
 	
 	private static IModel setUpModel(String modelName) {
 		PlainXmlModel model = new PlainXmlModel();
-		model.setFile(new File(EvlAcceptanceTestUtil.modelsRoot+modelName));
+		try {
+			File modelFile = FileUtil.getFile(EvlAcceptanceTestUtil.modelsRoot+modelName, EvlAcceptanceTestUtil.class);
+			model.setFile(modelFile);
+		}
+		catch (FileSystemNotFoundException ex) {
+			System.err.println(EvlAcceptanceTestUtil.modelsRoot+modelName);
+		}
+		
 		model.setName(FileUtil.removeExtension(model.getFile().getName()));
 		//model.setCachingEnabled(true);
 		return model;
 	}
 	
 	public static IModel getTestModel(boolean optimised) {
-		return optimised ? OPTIMISED_MODEL : TEST_MODEL;
+		String modelName = optimised ? "optimised.xml" : "test.xml";
+		
+		return setUpModel(modelName);
 	}
 	
 	public static File getTestScript(IEvlModule module) {
@@ -87,7 +97,9 @@
 				Variable.createReadOnlyVariable("blackboard", new HashMap<>())
 			);
 		}
-		return new File(EvlAcceptanceTestUtil.scriptsRoot+scriptName+".evl");
+		// Load utils in case its needed
+		FileUtil.getFile(EvlAcceptanceTestUtil.scriptsRoot + "utils.eol", EvlAcceptanceTestUtil.class);
+		return FileUtil.getFile(EvlAcceptanceTestUtil.scriptsRoot+scriptName + ".evl", EvlAcceptanceTestUtil.class);
 	}
 	
 	public static void loadEVL(IEvlModule module, boolean optimised) throws Exception {
diff --git a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/FlexmiTests.java b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/FlexmiTests.java
index c62117e..1a78864 100644
--- a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/FlexmiTests.java
+++ b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/FlexmiTests.java
@@ -11,10 +11,13 @@
 
 import static org.junit.Assert.assertEquals;
 
+import java.io.File;
+
 import org.eclipse.emf.common.util.URI;
 import org.eclipse.emf.ecore.EcorePackage;
 import org.eclipse.emf.ecore.resource.ResourceSet;
 import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.epsilon.common.util.FileUtil;
 import org.eclipse.epsilon.emc.emf.InMemoryEmfModel;
 import org.eclipse.epsilon.eol.EolEvaluator;
 import org.eclipse.epsilon.flexmi.FlexmiResource;
@@ -26,7 +29,8 @@
 		ResourceSet resourceSet = new ResourceSetImpl();
 		resourceSet.getResourceFactoryRegistry().getExtensionToFactoryMap().put("flexmi", new FlexmiResourceFactory());
 		resourceSet.getPackageRegistry().put(EcorePackage.eINSTANCE.getNsURI(), EcorePackage.eINSTANCE);
-		FlexmiResource resource = (FlexmiResource) resourceSet.createResource(URI.createURI(FlexmiTestSuite.class.getResource("models/" + filename).toURI().toString()));
+		File resourceFile = FileUtil.getFile("models/" + filename, FlexmiTestSuite.class);
+		FlexmiResource resource = (FlexmiResource) resourceSet.createResource(URI.createURI(resourceFile.toURI().toString()));
 		resource.load(null);
 		return resource;
 	}
diff --git a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
index 2337fe7..5dd07da 100644
--- a/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
+++ b/tests/org.eclipse.epsilon.flexmi.test/src/org/eclipse/epsilon/flexmi/test/TemplateTests.java
@@ -9,6 +9,7 @@
 **********************************************************************/
 package org.eclipse.epsilon.flexmi.test;
 
+import org.eclipse.epsilon.common.util.FileUtil;
 import org.eclipse.epsilon.flexmi.FlexmiResource;
 import static org.junit.Assert.*;
 
@@ -21,7 +22,7 @@
 	@Test
 	public void testModelWithTemplate() throws Exception {
 		FlexmiResource resource = loadResource("templates/model-with-template.flexmi");
-		
+		FileUtil.getFile("/models/templates/subdir/template-importing-eol.flexmi", TemplateTests.class);
 		assertEquals(0, resource.getWarnings().size());
 		assertEquals(3, resource.getTemplates().size());
 		assertEquals("t1", resource.getTemplates().get(0).getName());
diff --git a/tests/org.eclipse.epsilon.hutn.test.acceptance/src/org/eclipse/epsilon/hutn/test/acceptance/valid/ExternalObjectReferenceRelative.java b/tests/org.eclipse.epsilon.hutn.test.acceptance/src/org/eclipse/epsilon/hutn/test/acceptance/valid/ExternalObjectReferenceRelative.java
index 2f1f413..8aabaab 100644
--- a/tests/org.eclipse.epsilon.hutn.test.acceptance/src/org/eclipse/epsilon/hutn/test/acceptance/valid/ExternalObjectReferenceRelative.java
+++ b/tests/org.eclipse.epsilon.hutn.test.acceptance/src/org/eclipse/epsilon/hutn/test/acceptance/valid/ExternalObjectReferenceRelative.java
@@ -22,7 +22,9 @@
 
 public class ExternalObjectReferenceRelative extends HutnAcceptanceTest {
 	
-	private static File hutnSource = FileUtil.getFile("temp.hutn", ExternalObjectReferenceRelative.class);
+	// FIXME We want a temp file
+	//private static File hutnSource = FileUtil.getFile("temp.hutn", ExternalObjectReferenceRelative.class);
+	private static File hutnSource = FileUtil.createTempFile("temp.hutn");
 	
 	@BeforeClass
 	public static void executeHutn() throws Exception {
diff --git a/tests/org.eclipse.epsilon.test.dependencies/META-INF/MANIFEST.MF b/tests/org.eclipse.epsilon.test.dependencies/META-INF/MANIFEST.MF
index 11375ef..613183e 100644
--- a/tests/org.eclipse.epsilon.test.dependencies/META-INF/MANIFEST.MF
+++ b/tests/org.eclipse.epsilon.test.dependencies/META-INF/MANIFEST.MF
@@ -4,15 +4,16 @@
 Bundle-Name: Epsilon Test Dependencies (Incubation)
 Bundle-SymbolicName: org.eclipse.epsilon.test.dependencies
 Bundle-Version: 1.6.0.qualifier
-Require-Bundle: org.hamcrest.library;bundle-version="1.3.0";visibility:=reexport,
+Require-Bundle: org.slf4j.api;bundle-version="1.7.2";visibility:=reexport,
+ org.hamcrest.library;bundle-version="1.3.0";visibility:=reexport,
+ org.mockito_1.8.4;visibility:=reexport,
+ org.easymock_2.4;visibility:=reexport,
  org.junit;bundle-version="4.12.0";visibility:=reexport,
  org.eclipse.epsilon.dependencies;visibility:=reexport,
  org.eclipse.epsilon.eol.engine;visibility:=reexport,
  org.eclipse.epsilon.eunit.engine;visibility:=reexport,
  org.eclipse.epsilon.emc.emf;visibility:=reexport,
  org.eclipse.epsilon.hutn.engine;visibility:=reexport,
- org.mockito_1.8.4;visibility:=reexport,
- org.easymock_2.4;visibility:=reexport,
  org.eclipse.epsilon.emc.plainxml;visibility:=reexport
 Bundle-Vendor: Eclipse.org
 Export-Package: org.antlr.gunit,
diff --git a/tests/org.eclipse.epsilon.test.unit/.classpath b/tests/org.eclipse.epsilon.test.unit/.classpath
new file mode 100644
index 0000000..eca7bdb
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<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 kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/tests/org.eclipse.epsilon.test.unit/.gitignore b/tests/org.eclipse.epsilon.test.unit/.gitignore
new file mode 100644
index 0000000..2941331
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/.gitignore
@@ -0,0 +1,2 @@
+bin/
+target/
\ No newline at end of file
diff --git a/tests/org.eclipse.epsilon.test.unit/EPL-2.0.html b/tests/org.eclipse.epsilon.test.unit/EPL-2.0.html
new file mode 100644
index 0000000..637a181
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/EPL-2.0.html
@@ -0,0 +1,300 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
+  <head>
+    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+    <title>Eclipse Public License - Version 2.0</title>
+    <style type="text/css">
+      body {
+        margin: 1.5em 3em;
+      }
+      h1{
+        font-size:1.5em;
+      }
+      h2{
+        font-size:1em;
+        margin-bottom:0.5em;
+        margin-top:1em;
+      }
+      p {
+        margin-top:  0.5em;
+        margin-bottom: 0.5em;
+      }
+      ul, ol{
+        list-style-type:none;
+      }
+    </style>
+  </head>
+  <body>
+    <h1>Eclipse Public License - v 2.0</h1>
+    <p>THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS ECLIPSE
+      PUBLIC LICENSE (&ldquo;AGREEMENT&rdquo;). ANY USE, REPRODUCTION OR DISTRIBUTION
+      OF THE PROGRAM CONSTITUTES RECIPIENT&#039;S ACCEPTANCE OF THIS AGREEMENT.
+    </p>
+    <h2 id="definitions">1. DEFINITIONS</h2>
+    <p>&ldquo;Contribution&rdquo; means:</p>
+    <ul>
+      <li>a) in the case of the initial Contributor, the initial content
+        Distributed under this Agreement, and
+      </li>
+      <li>
+        b) in the case of each subsequent Contributor:
+        <ul>
+          <li>i) changes to the Program, and</li>
+          <li>ii) additions to the Program;</li>
+        </ul>
+        where such changes and/or additions to the Program originate from
+        and are Distributed by that particular Contributor. A Contribution
+        &ldquo;originates&rdquo; from a Contributor if it was added to the Program by such
+        Contributor itself or anyone acting on such Contributor&#039;s behalf.
+        Contributions do not include changes or additions to the Program that
+        are not Modified Works.
+      </li>
+    </ul>
+    <p>&ldquo;Contributor&rdquo; means any person or entity that Distributes the Program.</p>
+    <p>&ldquo;Licensed Patents&rdquo; mean patent claims licensable by a Contributor which
+      are necessarily infringed by the use or sale of its Contribution alone
+      or when combined with the Program.
+    </p>
+    <p>&ldquo;Program&rdquo; means the Contributions Distributed in accordance with this
+      Agreement.
+    </p>
+    <p>&ldquo;Recipient&rdquo; means anyone who receives the Program under this Agreement
+      or any Secondary License (as applicable), including Contributors.
+    </p>
+    <p>&ldquo;Derivative Works&rdquo; shall mean any work, whether in Source Code or other
+      form, that is based on (or derived from) the Program and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship.
+    </p>
+    <p>&ldquo;Modified Works&rdquo; shall mean any work in Source Code or other form that
+      results from an addition to, deletion from, or modification of the
+      contents of the Program, including, for purposes of clarity any new file
+      in Source Code form that contains any contents of the Program. Modified
+      Works shall not include works that contain only declarations, interfaces,
+      types, classes, structures, or files of the Program solely in each case
+      in order to link to, bind by name, or subclass the Program or Modified
+      Works thereof.
+    </p>
+    <p>&ldquo;Distribute&rdquo; means the acts of a) distributing or b) making available
+      in any manner that enables the transfer of a copy.
+    </p>
+    <p>&ldquo;Source Code&rdquo; means the form of a Program preferred for making
+      modifications, including but not limited to software source code,
+      documentation source, and configuration files.
+    </p>
+    <p>&ldquo;Secondary License&rdquo; means either the GNU General Public License,
+      Version 2.0, or any later versions of that license, including any
+      exceptions or additional permissions as identified by the initial
+      Contributor.
+    </p>
+    <h2 id="grant-of-rights">2. GRANT OF RIGHTS</h2>
+    <ul>
+      <li>a) Subject to the terms of this Agreement, each Contributor hereby
+        grants Recipient a non-exclusive, worldwide, royalty-free copyright
+        license to reproduce, prepare Derivative Works of, publicly display,
+        publicly perform, Distribute and sublicense the Contribution of such
+        Contributor, if any, and such Derivative Works.
+      </li>
+      <li>b) Subject to the terms of this Agreement, each Contributor hereby
+        grants Recipient a non-exclusive, worldwide, royalty-free patent
+        license under Licensed Patents to make, use, sell, offer to sell,
+        import and otherwise transfer the Contribution of such Contributor,
+        if any, in Source Code or other form. This patent license shall
+        apply to the combination of the Contribution and the Program if,
+        at the time the Contribution is added by the Contributor, such
+        addition of the Contribution causes such combination to be covered
+        by the Licensed Patents. The patent license shall not apply to any
+        other combinations which include the Contribution. No hardware per
+        se is licensed hereunder.
+      </li>
+      <li>c) Recipient understands that although each Contributor grants the
+        licenses to its Contributions set forth herein, no assurances are
+        provided by any Contributor that the Program does not infringe the
+        patent or other intellectual property rights of any other entity.
+        Each Contributor disclaims any liability to Recipient for claims
+        brought by any other entity based on infringement of intellectual
+        property rights or otherwise. As a condition to exercising the rights
+        and licenses granted hereunder, each Recipient hereby assumes sole
+        responsibility to secure any other intellectual property rights needed,
+        if any. For example, if a third party patent license is required to
+        allow Recipient to Distribute the Program, it is Recipient&#039;s
+        responsibility to acquire that license before distributing the Program.
+      </li>
+      <li>d) Each Contributor represents that to its knowledge it has sufficient
+        copyright rights in its Contribution, if any, to grant the copyright
+        license set forth in this Agreement.
+      </li>
+      <li>e) Notwithstanding the terms of any Secondary License, no Contributor
+        makes additional grants to any Recipient (other than those set forth
+        in this Agreement) as a result of such Recipient&#039;s receipt of the
+        Program under the terms of a Secondary License (if permitted under
+        the terms of Section 3).
+      </li>
+    </ul>
+    <h2 id="requirements">3. REQUIREMENTS</h2>
+    <p>3.1 If a Contributor Distributes the Program in any form, then:</p>
+    <ul>
+      <li>a) the Program must also be made available as Source Code, in
+        accordance with section 3.2, and the Contributor must accompany
+        the Program with a statement that the Source Code for the Program
+        is available under this Agreement, and informs Recipients how to
+        obtain it in a reasonable manner on or through a medium customarily
+        used for software exchange; and
+      </li>
+      <li>
+        b) the Contributor may Distribute the Program under a license
+        different than this Agreement, provided that such license:
+        <ul>
+          <li>i) effectively disclaims on behalf of all other Contributors all
+            warranties and conditions, express and implied, including warranties
+            or conditions of title and non-infringement, and implied warranties
+            or conditions of merchantability and fitness for a particular purpose;
+          </li>
+          <li>ii) effectively excludes on behalf of all other Contributors all
+            liability for damages, including direct, indirect, special, incidental
+            and consequential damages, such as lost profits;
+          </li>
+          <li>iii) does not attempt to limit or alter the recipients&#039; rights in the
+            Source Code under section 3.2; and
+          </li>
+          <li>iv) requires any subsequent distribution of the Program by any party
+            to be under a license that satisfies the requirements of this section 3.
+          </li>
+        </ul>
+      </li>
+    </ul>
+    <p>3.2 When the Program is Distributed as Source Code:</p>
+    <ul>
+      <li>a) it must be made available under this Agreement, or if the Program (i)
+        is combined with other material in a separate file or files made available
+        under a Secondary License, and (ii) the initial Contributor attached to
+        the Source Code the notice described in Exhibit A of this Agreement,
+        then the Program may be made available under the terms of such
+        Secondary Licenses, and
+      </li>
+      <li>b) a copy of this Agreement must be included with each copy of the Program.</li>
+    </ul>
+    <p>3.3 Contributors may not remove or alter any copyright, patent, trademark,
+      attribution notices, disclaimers of warranty, or limitations of liability
+      (&lsquo;notices&rsquo;) contained within the Program from any copy of the Program which
+      they Distribute, provided that Contributors may add their own appropriate
+      notices.
+    </p>
+    <h2 id="commercial-distribution">4. COMMERCIAL DISTRIBUTION</h2>
+    <p>Commercial distributors of software may accept certain responsibilities
+      with respect to end users, business partners and the like. While this
+      license is intended to facilitate the commercial use of the Program, the
+      Contributor who includes the Program in a commercial product offering should
+      do so in a manner which does not create potential liability for other
+      Contributors. Therefore, if a Contributor includes the Program in a
+      commercial product offering, such Contributor (&ldquo;Commercial Contributor&rdquo;)
+      hereby agrees to defend and indemnify every other Contributor
+      (&ldquo;Indemnified Contributor&rdquo;) against any losses, damages and costs
+      (collectively &ldquo;Losses&rdquo;) arising from claims, lawsuits and other legal actions
+      brought by a third party against the Indemnified Contributor to the extent
+      caused by the acts or omissions of such Commercial Contributor in connection
+      with its distribution of the Program in a commercial product offering.
+      The obligations in this section do not apply to any claims or Losses relating
+      to any actual or alleged intellectual property infringement. In order to
+      qualify, an Indemnified Contributor must: a) promptly notify the
+      Commercial Contributor in writing of such claim, and b) allow the Commercial
+      Contributor to control, and cooperate with the Commercial Contributor in,
+      the defense and any related settlement negotiations. The Indemnified
+      Contributor may participate in any such claim at its own expense.
+    </p>
+    <p>For example, a Contributor might include the Program
+      in a commercial product offering, Product X. That Contributor is then a
+      Commercial Contributor. If that Commercial Contributor then makes performance
+      claims, or offers warranties related to Product X, those performance claims
+      and warranties are such Commercial Contributor&#039;s responsibility alone.
+      Under this section, the Commercial Contributor would have to defend claims
+      against the other Contributors related to those performance claims and
+      warranties, and if a court requires any other Contributor to pay any damages
+      as a result, the Commercial Contributor must pay those damages.
+    </p>
+    <h2 id="warranty">5. NO WARRANTY</h2>
+    <p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED
+      BY APPLICABLE LAW, THE PROGRAM IS PROVIDED ON AN &ldquo;AS IS&rdquo; BASIS, WITHOUT
+      WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING,
+      WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT,
+      MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is
+      solely responsible for determining the appropriateness of using and
+      distributing the Program and assumes all risks associated with its
+      exercise of rights under this Agreement, including but not limited to the
+      risks and costs of program errors, compliance with applicable laws, damage
+      to or loss of data, programs or equipment, and unavailability or
+      interruption of operations.
+    </p>
+    <h2 id="disclaimer">6. DISCLAIMER OF LIABILITY</h2>
+    <p>EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, AND TO THE EXTENT PERMITTED
+      BY APPLICABLE LAW, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY
+      LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,
+      OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS),
+      HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+      LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+      OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS
+      GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+    </p>
+    <h2 id="general">7. GENERAL</h2>
+    <p>If any provision of this Agreement is invalid or unenforceable under
+      applicable law, it shall not affect the validity or enforceability of the
+      remainder of the terms of this Agreement, and without further action by the
+      parties hereto, such provision shall be reformed to the minimum extent
+      necessary to make such provision valid and enforceable.
+    </p>
+    <p>If Recipient institutes patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Program itself
+      (excluding combinations of the Program with other software or hardware)
+      infringes such Recipient&#039;s patent(s), then such Recipient&#039;s rights granted
+      under Section 2(b) shall terminate as of the date such litigation is filed.
+    </p>
+    <p>All Recipient&#039;s rights under this Agreement shall terminate if it fails to
+      comply with any of the material terms or conditions of this Agreement and
+      does not cure such failure in a reasonable period of time after becoming
+      aware of such noncompliance. If all Recipient&#039;s rights under this Agreement
+      terminate, Recipient agrees to cease use and distribution of the Program
+      as soon as reasonably practicable. However, Recipient&#039;s obligations under
+      this Agreement and any licenses granted by Recipient relating to the
+      Program shall continue and survive.
+    </p>
+    <p>Everyone is permitted to copy and distribute copies of this Agreement,
+      but in order to avoid inconsistency the Agreement is copyrighted and may
+      only be modified in the following manner. The Agreement Steward reserves
+      the right to publish new versions (including revisions) of this Agreement
+      from time to time. No one other than the Agreement Steward has the right
+      to modify this Agreement. The Eclipse Foundation is the initial Agreement
+      Steward. The Eclipse Foundation may assign the responsibility to serve as
+      the Agreement Steward to a suitable separate entity. Each new version of
+      the Agreement will be given a distinguishing version number. The Program
+      (including Contributions) may always be Distributed subject to the version
+      of the Agreement under which it was received. In addition, after a new
+      version of the Agreement is published, Contributor may elect to Distribute
+      the Program (including its Contributions) under the new version.
+    </p>
+    <p>Except as expressly stated in Sections 2(a) and 2(b) above, Recipient
+      receives no rights or licenses to the intellectual property of any
+      Contributor under this Agreement, whether expressly, by implication,
+      estoppel or otherwise. All rights in the Program not expressly granted
+      under this Agreement are reserved. Nothing in this Agreement is intended
+      to be enforceable by any entity that is not a Contributor or Recipient.
+      No third-party beneficiary rights are created under this Agreement.
+    </p>
+    <h2 id="exhibit-a">Exhibit A &ndash; Form of Secondary Licenses Notice</h2>
+    <p>&ldquo;This Source Code may also be made available under the following 
+    	Secondary Licenses when the conditions for such availability set forth 
+    	in the Eclipse Public License, v. 2.0 are satisfied: {name license(s),
+    	version(s), and exceptions or additional permissions here}.&rdquo;
+    </p>
+    <blockquote>
+      <p>Simply including a copy of this Agreement, including this Exhibit A
+        is not sufficient to license the Source Code under Secondary Licenses.
+      </p>
+      <p>If it is not possible or desirable to put the notice in a particular file,
+        then You may include the notice in a location (such as a LICENSE file in a
+        relevant directory) where a recipient would be likely to look for
+        such a notice.
+      </p>
+      <p>You may add additional accurate notices of copyright ownership.</p>
+    </blockquote>
+  </body>
+</html>
\ No newline at end of file
diff --git a/tests/org.eclipse.epsilon.test.unit/EpsilonPluggedInTestSuite.launch b/tests/org.eclipse.epsilon.test.unit/EpsilonPluggedInTestSuite.launch
new file mode 100644
index 0000000..7be5dfe
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/EpsilonPluggedInTestSuite.launch
@@ -0,0 +1,41 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
+<booleanAttribute key="append.args" value="true"/>
+<booleanAttribute key="askclear" value="false"/>
+<booleanAttribute key="automaticAdd" value="true"/>
+<booleanAttribute key="automaticValidate" value="false"/>
+<stringAttribute key="bootstrap" value=""/>
+<stringAttribute key="checked" value="[NONE]"/>
+<booleanAttribute key="clearConfig" value="true"/>
+<booleanAttribute key="clearws" value="true"/>
+<booleanAttribute key="clearwslog" value="false"/>
+<stringAttribute key="configLocation" value="${workspace_loc}/.metadata/.plugins/org.eclipse.pde.core/pde-junit"/>
+<booleanAttribute key="default" value="true"/>
+<booleanAttribute key="includeOptional" value="true"/>
+<stringAttribute key="location" value="${workspace_loc}/../junit-workspace"/>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_PATHS">
+<listEntry value="/org.eclipse.epsilon.test/src/org/eclipse/epsilon/test/EpsilonPluggedInTestSuite.java"/>
+</listAttribute>
+<listAttribute key="org.eclipse.debug.core.MAPPED_RESOURCE_TYPES">
+<listEntry value="1"/>
+</listAttribute>
+<stringAttribute key="org.eclipse.jdt.junit.CONTAINER" value=""/>
+<booleanAttribute key="org.eclipse.jdt.junit.KEEPRUNNING_ATTR" value="false"/>
+<stringAttribute key="org.eclipse.jdt.junit.TESTNAME" value=""/>
+<stringAttribute key="org.eclipse.jdt.junit.TEST_KIND" value="org.eclipse.jdt.junit.loader.junit4"/>
+<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.epsilon.test.EpsilonPluggedInTestSuite"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl}"/>
+<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.epsilon.test"/>
+<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
+<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Xmx4g"/>
+<stringAttribute key="pde.version" value="3.3"/>
+<stringAttribute key="product" value="org.eclipse.emf.cdo.server.product"/>
+<booleanAttribute key="run_in_ui_thread" value="true"/>
+<booleanAttribute key="show_selected_only" value="false"/>
+<stringAttribute key="templateConfig" value="${target_home}/configuration/config.ini"/>
+<booleanAttribute key="tracing" value="false"/>
+<booleanAttribute key="useCustomFeatures" value="false"/>
+<booleanAttribute key="useDefaultConfig" value="true"/>
+<booleanAttribute key="useDefaultConfigArea" value="false"/>
+<booleanAttribute key="useProduct" value="false"/>
+</launchConfiguration>
diff --git a/tests/org.eclipse.epsilon.test.unit/META-INF/MANIFEST.MF b/tests/org.eclipse.epsilon.test.unit/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..fa7dd19
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/META-INF/MANIFEST.MF
@@ -0,0 +1,54 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Epsilon Test Suite (Incubation)
+Bundle-SymbolicName: org.eclipse.epsilon.test.unit
+Bundle-Version: 1.6.0.qualifier
+Bundle-Vendor: Eclipse.org
+Bundle-RequiredExecutionEnvironment: JavaSE-1.8
+Automatic-Module-Name: org.eclipse.epsilon.test
+Require-Bundle: org.eclipse.epsilon.test.dependencies,
+ org.eclipse.epsilon.eol.engine.test.acceptance,
+ org.eclipse.epsilon.egl.engine.test,
+ org.eclipse.epsilon.egx.engine.test.acceptance,
+ org.eclipse.epsilon.egl.dt.test,
+ org.eclipse.epsilon.hutn.test,
+ org.eclipse.epsilon.hutn.unparser.test.unit,
+ org.eclipse.epsilon.hutn.xmi.test,
+ org.eclipse.epsilon.emc.emf.test,
+ org.eclipse.epsilon.flock.engine.test,
+ org.eclipse.epsilon.eol.engine.test.unit,
+ org.eclipse.epsilon.common.dt.test,
+ org.eclipse.epsilon.concordance.test,
+ org.eclipse.epsilon.etl.engine.test.acceptance,
+ org.eclipse.epsilon.emc.hutn.test,
+ org.eclipse.epsilon.emc.plainxml.test,
+ org.eclipse.epsilon.common.test,
+ org.eclipse.epsilon.workflow.test,
+ org.eclipse.epsilon.evl.engine.test.acceptance,
+ org.eclipse.epsilon.ecl.engine.test.acceptance,
+ org.eclipse.epsilon.eml.engine.test.acceptance,
+ org.eclipse.epsilon.ewl.engine.test.acceptance,
+ org.eclipse.epsilon.emc.bibtex.test,
+ org.eclipse.epsilon.egl.dt.traceability.editor.tests,
+ org.eclipse.epsilon.egl.traceability.fine.test.acceptance,
+ org.eclipse.epsilon.egl.traceability.fine.test.unit,
+ org.eclipse.epsilon.emc.graphml.tests;bundle-version="1.0.0",
+ org.eclipse.epsilon.epl.engine.test.acceptance,
+ org.eclipse.epsilon.emc.spreadsheets.test;bundle-version="1.5.0",
+ org.eclipse.epsilon.workflow;bundle-version="1.5.0",
+ org.eclipse.epsilon.workflow.csv;bundle-version="1.5.0",
+ org.eclipse.epsilon.workflow.emf;bundle-version="1.5.0",
+ org.eclipse.epsilon.workflow.eugenia;bundle-version="1.5.0",
+ org.eclipse.epsilon.eunit.dt;bundle-version="1.5.0",
+ org.eclipse.epsilon.eunit.dt.cmp.emf;bundle-version="1.5.0",
+ org.eclipse.epsilon.eunit.dt.diff.emf;bundle-version="1.5.0",
+ org.eclipse.epsilon.eunit.dt.diff.files;bundle-version="1.5.0",
+ org.eclipse.epsilon.concordance.clients;bundle-version="1.5.0",
+ org.eclipse.epsilon.concordance.core;bundle-version="1.5.0",
+ org.eclipse.epsilon.concordance.core.hashing;bundle-version="1.5.0",
+ org.eclipse.emf.emfatic.core;bundle-version="0.8.0",
+ org.eclipse.gmf.bridge,
+ org.eclipse.gmf.bridge.trace;bundle-version="1.3.0",
+ org.eclipse.epsilon.emc.csv.test,
+ org.eclipse.epsilon.flexmi.test,
+ org.eclipse.epsilon.emc.simulink.test
diff --git a/tests/org.eclipse.epsilon.test.unit/build.properties b/tests/org.eclipse.epsilon.test.unit/build.properties
new file mode 100644
index 0000000..9d822f5
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/build.properties
@@ -0,0 +1,7 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               EPL-2.0.html,\
+               .,\
+               logback.xml
+jre.compilation.profile = JavaSE-1.8
diff --git a/tests/org.eclipse.epsilon.test.unit/foo.ecore b/tests/org.eclipse.epsilon.test.unit/foo.ecore
new file mode 100644
index 0000000..19fc3c2
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/foo.ecore
@@ -0,0 +1,6 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<hutnConfig:Configuration xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+    xmlns:hutnConfig="http://www.eclipse.org/gmt/epsilon/hutnConfig">
+  <rules xsi:type="hutnConfig:DefaultValueRule" classifier="Family" attribute="nuclear"
+      defaultValue="4"/>
+</hutnConfig:Configuration>
diff --git a/tests/org.eclipse.epsilon.test.unit/logback.xml b/tests/org.eclipse.epsilon.test.unit/logback.xml
new file mode 100644
index 0000000..7d2c519
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/logback.xml
@@ -0,0 +1,11 @@
+<configuration>
+  <appender name="STDOUT" class="ch.qos.logback.core.ConsoleAppender">
+    <encoder>
+      <pattern>%d{HH:mm:ss.SSS} %-5level %logger{36} - %msg%n</pattern>
+    </encoder>
+  </appender>
+
+  <root level="DEBUG">
+    <appender-ref ref="STDOUT" />
+  </root>
+</configuration>
\ No newline at end of file
diff --git a/tests/org.eclipse.epsilon.test.unit/pom.xml b/tests/org.eclipse.epsilon.test.unit/pom.xml
new file mode 100644
index 0000000..e679881
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/pom.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project
+	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
+	xmlns="http://maven.apache.org/POM/4.0.0"
+	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
+	<modelVersion>4.0.0</modelVersion>
+	<parent>
+		<groupId>org.eclipse.epsilon</groupId>
+		<artifactId>tests</artifactId>
+		<version>0.0.1-SNAPSHOT</version>
+	</parent>
+
+	<groupId>org.eclipse.epsilon</groupId>
+	<artifactId>org.eclipse.epsilon.test.unit</artifactId>
+	<version>1.6.0-SNAPSHOT</version>
+	<packaging>eclipse-test-plugin</packaging>
+	<dependencies>
+		<dependency>
+			<groupId>ch.qos.logback</groupId>
+			<artifactId>logback-classic</artifactId>
+			<version>1.0.13</version>
+		</dependency>
+		<dependency>
+			<groupId>org.hamcrest</groupId>
+			<artifactId>hamcrest-library</artifactId>
+			<version>1.3</version>
+			<scope>test</scope>
+		</dependency>
+		<dependency>
+			<groupId>junit</groupId>
+			<artifactId>junit</artifactId>
+			<version>4.12</version>
+			<scope>test</scope>
+		</dependency>
+
+	</dependencies>
+	<build>
+		<testSourceDirectory>${project.basedir}/src</testSourceDirectory>
+		<testOutputDirectory>${project.basedir}/target/classes</testOutputDirectory>
+		<pluginManagement>
+			<plugins>
+				<plugin>
+					<groupId>org.apache.maven.plugins</groupId>
+					<artifactId>maven-surefire-plugin</artifactId>
+					<version>3.0.0-M3</version>
+				</plugin>
+			</plugins>
+		</pluginManagement>
+		<plugins>
+			<plugin>
+				<groupId>org.apache.maven.plugins</groupId>
+				<artifactId>maven-surefire-plugin</artifactId>
+				<version>3.0.0-M3</version>
+				<configuration>
+					<includes>
+						<include>EpsilonTestSuite.java</include>
+					</includes>
+					<!-->argLine>-Xmx4096m</argLine -->
+				</configuration>
+			</plugin>
+
+		</plugins>
+	</build>
+</project>
diff --git a/tests/org.eclipse.epsilon.test.unit/src/org/eclipse/epsilon/test/EpsilonTestSuite.java b/tests/org.eclipse.epsilon.test.unit/src/org/eclipse/epsilon/test/EpsilonTestSuite.java
new file mode 100644
index 0000000..9460591
--- /dev/null
+++ b/tests/org.eclipse.epsilon.test.unit/src/org/eclipse/epsilon/test/EpsilonTestSuite.java
@@ -0,0 +1,89 @@
+/*******************************************************************************
+ * Copyright (c) 2009-2011 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/
+ * 
+ * Contributors:
+ *     Louis Rose - initial API and implementation
+ *     Antonio Garcia-Dominguez - added WorkflowTestSuite
+ ******************************************************************************
+ *
+ * $Id$
+ */
+package org.eclipse.epsilon.test;
+
+import org.eclipse.epsilon.commons.test.CommonsTestSuite;
+import org.eclipse.epsilon.concordance.test.ConcordanceTestSuite;
+import org.eclipse.epsilon.ecl.engine.test.acceptance.EclAcceptanceTestSuite;
+import org.eclipse.epsilon.egl.dt.test.EglDevelopmentToolsTestSuite;
+import org.eclipse.epsilon.egl.dt.traceability.editor.EglTraceabilityEditorTestSuite;
+import org.eclipse.epsilon.egl.engine.traceability.fine.test.acceptance.EglFineGrainedTraceabilityAcceptanceTestSuite;
+import org.eclipse.epsilon.egl.engine.traceability.fine.test.unit.EglFineGrainedTraceabilityUnitTestSuite;
+import org.eclipse.epsilon.egl.test.EglTestSuite;
+import org.eclipse.epsilon.egx.engine.test.acceptance.EgxAcceptanceTestSuite;
+import org.eclipse.epsilon.emc.bibtex.BibtexModelTestSuite;
+import org.eclipse.epsilon.emc.csv.test.CsvModelTestSuite;
+import org.eclipse.epsilon.emc.emf.test.EmfTestSuite;
+import org.eclipse.epsilon.emc.graphml.tests.GraphmlTestSuite;
+import org.eclipse.epsilon.emc.hutn.test.HutnEmcDriverTestSuite;
+import org.eclipse.epsilon.emc.plainxml.test.PlainXmlTestSuite;
+import org.eclipse.epsilon.emc.simulink.test.suite.SimulinkTestSuite;
+import org.eclipse.epsilon.emc.spreadsheets.test.SpreadsheetDriverTestSuite;
+import org.eclipse.epsilon.eml.engine.test.acceptance.EmlAcceptanceTestSuite;
+import org.eclipse.epsilon.eol.engine.test.acceptance.EolAcceptanceTestSuite;
+import org.eclipse.epsilon.eol.test.unit.EolUnitTestSuite;
+import org.eclipse.epsilon.epl.engine.test.acceptance.EplAcceptanceTestSuite;
+import org.eclipse.epsilon.etl.engine.test.acceptance.EtlAcceptanceTestSuite;
+import org.eclipse.epsilon.evl.engine.test.acceptance.EvlAcceptanceTestSuite;
+import org.eclipse.epsilon.ewl.engine.test.acceptance.EwlAcceptanceTestSuite;
+import org.eclipse.epsilon.flexmi.test.FlexmiTestSuite;
+import org.eclipse.epsilon.flock.test.EpsilonFlockEngineTestSuite;
+import org.eclipse.epsilon.hutn.test.HutnTestSuite;
+import org.eclipse.epsilon.hutn.unparser.HutnUnparserUnitTestSuite;
+import org.eclipse.epsilon.hutn.xmi.test.HutnXmiTestSuite;
+import org.eclipse.epsilon.workflow.test.WorkflowTestSuite;
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+import org.junit.runners.Suite.SuiteClasses;
+import junit.framework.JUnit4TestAdapter;
+import junit.framework.Test;
+
+@RunWith(Suite.class)
+@SuiteClasses({CommonsTestSuite.class,
+               EolUnitTestSuite.class, 
+               EolAcceptanceTestSuite.class,
+               EvlAcceptanceTestSuite.class,
+               EtlAcceptanceTestSuite.class,
+               EclAcceptanceTestSuite.class,
+               EmlAcceptanceTestSuite.class,
+               EwlAcceptanceTestSuite.class,
+               EglTestSuite.class,
+               EplAcceptanceTestSuite.class,
+               EglDevelopmentToolsTestSuite.class,
+               EglTraceabilityEditorTestSuite.class,
+               EglFineGrainedTraceabilityAcceptanceTestSuite.class,
+               EglFineGrainedTraceabilityUnitTestSuite.class,
+               EgxAcceptanceTestSuite.class,
+               HutnTestSuite.class,
+               HutnUnparserUnitTestSuite.class,
+               HutnXmiTestSuite.class,
+               HutnEmcDriverTestSuite.class,
+               PlainXmlTestSuite.class,
+               BibtexModelTestSuite.class,
+               EpsilonFlockEngineTestSuite.class,
+               ConcordanceTestSuite.class,
+               WorkflowTestSuite.class,
+               GraphmlTestSuite.class,
+               EmfTestSuite.class,
+               SimulinkTestSuite.class,
+               SpreadsheetDriverTestSuite.class,
+               CsvModelTestSuite.class,
+               FlexmiTestSuite.class
+               })
+
+public class EpsilonTestSuite {
+	public static Test suite() {
+		return new JUnit4TestAdapter(EpsilonTestSuite.class);
+	}
+}
diff --git a/tests/pom.xml b/tests/pom.xml
index 1de936c..7678e19 100644
--- a/tests/pom.xml
+++ b/tests/pom.xml
@@ -68,7 +68,8 @@
     <module>org.eclipse.epsilon.hutn.xmi.test.dependencies</module>
     <module>org.eclipse.epsilon.hutn.xmi.test.integration</module>
     <module>org.eclipse.epsilon.hutn.xmi.test.unit</module>
-    <module>org.eclipse.epsilon.test</module>
+    <module>org.eclipse.epsilon.test</module>  
+    <module>org.eclipse.epsilon.test.unit</module>
     <module>org.eclipse.epsilon.test.dependencies</module>
     <module>org.eclipse.epsilon.test.fixtures.hutn</module>
     <module>org.eclipse.epsilon.workflow.test</module>