diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.checkstyle b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.checkstyle
deleted file mode 100644
index 2f2667a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.checkstyle
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
-  <fileset name="all" enabled="true" check-config-name="emfstoreStyle" local="false">
-    <file-match-pattern match-pattern="." include-pattern="true"/>
-  </fileset>
-</fileset-config>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.project
deleted file mode 100644
index fd3a91e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy.emf.edit</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/META-INF/MANIFEST.MF
deleted file mode 100644
index 8bf97e2..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,14 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Fuzzy EMF Edit plugin
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy.emf.edit;singleton:=true
-Bundle-Version: 0.9.3.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.emf.emfstore.fuzzy.emf.config.provider.ConfigEditPlugin$Implementation
-Bundle-Vendor: Eclipse Modeling Project
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.emf.emfstore.fuzzy.emf.config.provider
-Require-Bundle: org.eclipse.emf.emfstore.fuzzy.emf;visibility:=reexport,
- org.eclipse.emf.edit;bundle-version="[2.5.0,3.0.0)";visibility:=reexport
-Bundle-ActivationPolicy: lazy
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/build.properties
deleted file mode 100644
index baa3b2a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-bin.includes = .,\
-               icons/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin/
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateDiffReport_diffs_TestDiff.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateDiffReport_diffs_TestDiff.gif
deleted file mode 100644
index ebeaeeb..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateDiffReport_diffs_TestDiff.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_DiffReport.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_DiffReport.gif
deleted file mode 100644
index 338a9a6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_DiffReport.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_MutatorConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_MutatorConfig.gif
deleted file mode 100644
index dc3ca18..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_MutatorConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_Root.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_Root.gif
deleted file mode 100644
index 9ea845b..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_Root.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestConfig.gif
deleted file mode 100644
index 21b4d39..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestDiff.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestDiff.gif
deleted file mode 100644
index 6203d5c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestDiff.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestResult.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestResult.gif
deleted file mode 100644
index 17db365..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestResult.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestRun.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestRun.gif
deleted file mode 100644
index 1875b13..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateRoot_elements_TestRun.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestConfig_mutatorConfig_MutatorConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestConfig_mutatorConfig_MutatorConfig.gif
deleted file mode 100644
index c28f2e6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestConfig_mutatorConfig_MutatorConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_newResult_TestResult.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_newResult_TestResult.gif
deleted file mode 100644
index 5fb0c4c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_newResult_TestResult.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_oldResult_TestResult.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_oldResult_TestResult.gif
deleted file mode 100644
index 5fb0c4c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestDiff_oldResult_TestResult.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_config_TestConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_config_TestConfig.gif
deleted file mode 100644
index 9073955..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_config_TestConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_results_TestResult.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_results_TestResult.gif
deleted file mode 100644
index e178517..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/ctool16/CreateTestRun_results_TestResult.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/DiffReport.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/DiffReport.gif
deleted file mode 100644
index 14af8aa..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/DiffReport.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/MutatorConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/MutatorConfig.gif
deleted file mode 100644
index 7bac4fd..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/MutatorConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/Root.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/Root.gif
deleted file mode 100644
index cb1755a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/Root.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestConfig.gif
deleted file mode 100644
index c3370c7..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestDiff.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestDiff.gif
deleted file mode 100644
index e4b530e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestDiff.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestResult.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestResult.gif
deleted file mode 100644
index 136e3b2..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestResult.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestRun.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestRun.gif
deleted file mode 100644
index 739ebbf..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/icons/full/obj16/TestRun.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.properties
deleted file mode 100644
index 26d8b12..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.properties
+++ /dev/null
@@ -1,64 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-pluginName = Config Edit Support
-providerName = www.example.org
-
-_UI_CreateChild_text = {0}
-_UI_CreateChild_text2 = {1} {0}
-_UI_CreateChild_text3 = {1}
-_UI_CreateChild_tooltip = Create New {0} Under {1} Feature
-_UI_CreateChild_description = Create a new child of type {0} for the {1} feature of the selected {2}.
-_UI_CreateSibling_description = Create a new sibling of type {0} for the selected {2}, under the {1} feature of their parent.
-
-_UI_PropertyDescriptor_description = The {0} of the {1}
-
-_UI_TestConfig_type = Test Config
-_UI_TestRun_type = Test Run
-_UI_TestResult_type = Test Result
-_UI_TestDiff_type = Test Diff
-_UI_DiffReport_type = Diff Report
-_UI_Root_type = Root
-_UI_MutatorConfig_type = Mutator Config
-_UI_Unknown_type = Object
-
-_UI_Unknown_datatype= Value
-
-_UI_TestConfig_seed_feature = Seed
-_UI_TestConfig_count_feature = Count
-_UI_TestConfig_testClass_feature = Test Class
-_UI_TestConfig_id_feature = Id
-_UI_TestConfig_mutatorConfig_feature = Mutator Config
-_UI_TestRun_config_feature = Config
-_UI_TestRun_time_feature = Time
-_UI_TestRun_results_feature = Results
-_UI_TestResult_seedCount_feature = Seed Count
-_UI_TestResult_testName_feature = Test Name
-_UI_TestResult_error_feature = Error
-_UI_TestResult_failure_feature = Failure
-_UI_TestResult_executionTime_feature = Execution Time
-_UI_TestDiff_lastUpdate_feature = Last Update
-_UI_TestDiff_config_feature = Config
-_UI_TestDiff_oldResult_feature = Old Result
-_UI_TestDiff_newResult_feature = New Result
-_UI_DiffReport_diffs_feature = Diffs
-_UI_Root_elements_feature = Elements
-_UI_MutatorConfig_nsURI_feature = Ns URI
-_UI_MutatorConfig_rootEClass_feature = Root EClass
-_UI_MutatorConfig_depth_feature = Depth
-_UI_MutatorConfig_width_feature = Width
-_UI_MutatorConfig_ignoreAndLog_feature = Ignore And Log
-_UI_MutatorConfig_doNotGenerateRoot_feature = Do Not Generate Root
-_UI_MutatorConfig_useEcoreUtilDelete_feature = Use Ecore Util Delete
-_UI_Unknown_feature = Unspecified
-
-_UI_MutatorConfig_eClassesToIgnore_feature = EClasses To Ignore
-_UI_MutatorConfig_eStructuralFeaturesToIgnore_feature = EStructural Features To Ignore
-_UI_MutatorConfig_ePackage_feature = EPackage
-_UI_MutatorConfig_minObjectsCount_feature = Min Objects Count
-_UI_MutatorConfig_useRemoveCommand_feature = Use Remove Command
-_UI_MutatorConfig_maxDeleteCount_feature = Max Delete Count
-_UI_MutatorConfig_ePackages_feature = EPackages
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.xml
deleted file mode 100644
index bdbbe1d..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/plugin.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id$
--->
-
-<plugin>
-
-   <extension point="org.eclipse.emf.edit.itemProviderAdapterFactories">
-      <factory
-            uri="http://org/eclipse/emf/emfstore/fuzzy/emf/config"
-            class="org.eclipse.emf.emfstore.fuzzy.emf.config.provider.ConfigItemProviderAdapterFactory"
-            supportedTypes=
-              "org.eclipse.emf.edit.provider.IEditingDomainItemProvider
-               org.eclipse.emf.edit.provider.IStructuredItemContentProvider
-               org.eclipse.emf.edit.provider.ITreeItemContentProvider
-               org.eclipse.emf.edit.provider.IItemLabelProvider
-               org.eclipse.emf.edit.provider.IItemPropertySource"/>
-   </extension>
-
-</plugin>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/pom.xml
deleted file mode 100644
index 29af54b..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy.emf.edit</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigEditPlugin.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigEditPlugin.java
deleted file mode 100644
index 81485bc..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigEditPlugin.java
+++ /dev/null
@@ -1,103 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import org.eclipse.emf.common.EMFPlugin;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the Config edit plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public final class ConfigEditPlugin extends EMFPlugin {
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static final ConfigEditPlugin INSTANCE = new ConfigEditPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigEditPlugin() {
-		super(new ResourceLocator[] {});
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static class Implementation extends EclipsePlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigItemProviderAdapterFactory.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigItemProviderAdapterFactory.java
deleted file mode 100644
index 9c0229a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/ConfigItemProviderAdapterFactory.java
+++ /dev/null
@@ -1,395 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.Notifier;
-
-import org.eclipse.emf.edit.provider.ChangeNotifier;
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.IChangeNotifier;
-import org.eclipse.emf.edit.provider.IDisposable;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.INotifyChangedListener;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.util.ConfigAdapterFactory;
-
-/**
- * This is the factory that is used to provide the interfaces needed to support Viewers.
- * The adapters generated by this factory convert EMF adapter notifications into calls to {@link #fireNotifyChanged
- * fireNotifyChanged}.
- * The adapters also support Eclipse property sheets.
- * Note that most of the adapters are shared among multiple instances.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigItemProviderAdapterFactory extends ConfigAdapterFactory implements ComposeableAdapterFactory,
-	IChangeNotifier, IDisposable {
-	/**
-	 * This keeps track of the root adapter factory that delegates to this adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ComposedAdapterFactory parentAdapterFactory;
-
-	/**
-	 * This is used to implement {@link org.eclipse.emf.edit.provider.IChangeNotifier}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IChangeNotifier changeNotifier = new ChangeNotifier();
-
-	/**
-	 * This keeps track of all the supported types checked by {@link #isFactoryForType isFactoryForType}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<Object> supportedTypes = new ArrayList<Object>();
-
-	/**
-	 * This constructs an instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigItemProviderAdapterFactory() {
-		supportedTypes.add(IEditingDomainItemProvider.class);
-		supportedTypes.add(IStructuredItemContentProvider.class);
-		supportedTypes.add(ITreeItemContentProvider.class);
-		supportedTypes.add(IItemLabelProvider.class);
-		supportedTypes.add(IItemPropertySource.class);
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestConfigItemProvider testConfigItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createTestConfigAdapter() {
-		if (testConfigItemProvider == null) {
-			testConfigItemProvider = new TestConfigItemProvider(this);
-		}
-
-		return testConfigItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestRunItemProvider testRunItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createTestRunAdapter() {
-		if (testRunItemProvider == null) {
-			testRunItemProvider = new TestRunItemProvider(this);
-		}
-
-		return testRunItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestResultItemProvider testResultItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createTestResultAdapter() {
-		if (testResultItemProvider == null) {
-			testResultItemProvider = new TestResultItemProvider(this);
-		}
-
-		return testResultItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestDiffItemProvider testDiffItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createTestDiffAdapter() {
-		if (testDiffItemProvider == null) {
-			testDiffItemProvider = new TestDiffItemProvider(this);
-		}
-
-		return testDiffItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected DiffReportItemProvider diffReportItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createDiffReportAdapter() {
-		if (diffReportItemProvider == null) {
-			diffReportItemProvider = new DiffReportItemProvider(this);
-		}
-
-		return diffReportItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected RootItemProvider rootItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createRootAdapter() {
-		if (rootItemProvider == null) {
-			rootItemProvider = new RootItemProvider(this);
-		}
-
-		return rootItemProvider;
-	}
-
-	/**
-	 * This keeps track of the one adapter used for all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig}
-	 * instances.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected MutatorConfigItemProvider mutatorConfigItemProvider;
-
-	/**
-	 * This creates an adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter createMutatorConfigAdapter() {
-		if (mutatorConfigItemProvider == null) {
-			mutatorConfigItemProvider = new MutatorConfigItemProvider(this);
-		}
-
-		return mutatorConfigItemProvider;
-	}
-
-	/**
-	 * This returns the root adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ComposeableAdapterFactory getRootAdapterFactory() {
-		return parentAdapterFactory == null ? this : parentAdapterFactory.getRootAdapterFactory();
-	}
-
-	/**
-	 * This sets the composed adapter factory that contains this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setParentAdapterFactory(ComposedAdapterFactory parentAdapterFactory) {
-		this.parentAdapterFactory = parentAdapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object type) {
-		return supportedTypes.contains(type) || super.isFactoryForType(type);
-	}
-
-	/**
-	 * This implementation substitutes the factory itself as the key for the adapter.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Adapter adapt(Notifier notifier, Object type) {
-		return super.adapt(notifier, this);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object adapt(Object object, Object type) {
-		if (isFactoryForType(type)) {
-			Object adapter = super.adapt(object, type);
-			if (!(type instanceof Class<?>) || (((Class<?>) type).isInstance(adapter))) {
-				return adapter;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * This adds a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void addListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.addListener(notifyChangedListener);
-	}
-
-	/**
-	 * This removes a listener.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void removeListener(INotifyChangedListener notifyChangedListener) {
-		changeNotifier.removeListener(notifyChangedListener);
-	}
-
-	/**
-	 * This delegates to {@link #changeNotifier} and to {@link #parentAdapterFactory}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void fireNotifyChanged(Notification notification) {
-		changeNotifier.fireNotifyChanged(notification);
-
-		if (parentAdapterFactory != null) {
-			parentAdapterFactory.fireNotifyChanged(notification);
-		}
-	}
-
-	/**
-	 * This disposes all of the item providers created by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void dispose() {
-		if (testConfigItemProvider != null)
-			testConfigItemProvider.dispose();
-		if (testRunItemProvider != null)
-			testRunItemProvider.dispose();
-		if (testResultItemProvider != null)
-			testResultItemProvider.dispose();
-		if (testDiffItemProvider != null)
-			testDiffItemProvider.dispose();
-		if (diffReportItemProvider != null)
-			diffReportItemProvider.dispose();
-		if (rootItemProvider != null)
-			rootItemProvider.dispose();
-		if (mutatorConfigItemProvider != null)
-			mutatorConfigItemProvider.dispose();
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/DiffReportItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/DiffReportItemProvider.java
deleted file mode 100644
index c580c57..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/DiffReportItemProvider.java
+++ /dev/null
@@ -1,176 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class DiffReportItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public DiffReportItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ConfigPackage.Literals.DIFF_REPORT__DIFFS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns DiffReport.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/DiffReport"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		return getString("_UI_DiffReport_type");
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(DiffReport.class)) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.DIFF_REPORT__DIFFS,
-			ConfigFactory.eINSTANCE.createTestDiff()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/MutatorConfigItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/MutatorConfigItemProvider.java
deleted file mode 100644
index 36d0c16..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/MutatorConfigItemProvider.java
+++ /dev/null
@@ -1,307 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class MutatorConfigItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public MutatorConfigItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addRootEClassPropertyDescriptor(object);
-			addMinObjectsCountPropertyDescriptor(object);
-			addIgnoreAndLogPropertyDescriptor(object);
-			addDoNotGenerateRootPropertyDescriptor(object);
-			addUseEcoreUtilDeletePropertyDescriptor(object);
-			addEClassesToIgnorePropertyDescriptor(object);
-			addEStructuralFeaturesToIgnorePropertyDescriptor(object);
-			addEPackagesPropertyDescriptor(object);
-			addMaxDeleteCountPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Root EClass feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addRootEClassPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_rootEClass_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_rootEClass_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__ROOT_ECLASS, true, false, true, null,
-			null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Min Objects Count feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addMinObjectsCountPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_minObjectsCount_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_minObjectsCount_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__MIN_OBJECTS_COUNT, true, false,
-			false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Ignore And Log feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addIgnoreAndLogPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_ignoreAndLog_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_ignoreAndLog_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__IGNORE_AND_LOG, true, false, false,
-			ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Do Not Generate Root feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addDoNotGenerateRootPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_doNotGenerateRoot_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_doNotGenerateRoot_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT, true, false,
-			false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Use Ecore Util Delete feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addUseEcoreUtilDeletePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_useEcoreUtilDelete_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_useEcoreUtilDelete_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE, true, false,
-			false, ItemPropertyDescriptor.BOOLEAN_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the EClasses To Ignore feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addEClassesToIgnorePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_eClassesToIgnore_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_eClassesToIgnore_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__ECLASSES_TO_IGNORE, true, false,
-			true, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the EStructural Features To Ignore feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addEStructuralFeaturesToIgnorePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_eStructuralFeaturesToIgnore_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_eStructuralFeaturesToIgnore_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE, true,
-			false, true, null, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the EPackages feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addEPackagesPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_ePackages_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_ePackages_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__EPACKAGES, true, false, true, null,
-			null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Max Delete Count feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addMaxDeleteCountPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_MutatorConfig_maxDeleteCount_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_MutatorConfig_maxDeleteCount_feature",
-				"_UI_MutatorConfig_type"), ConfigPackage.Literals.MUTATOR_CONFIG__MAX_DELETE_COUNT, true, false, false,
-			ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns MutatorConfig.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/MutatorConfig"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		MutatorConfig mutatorConfig = (MutatorConfig) object;
-		return getString("_UI_MutatorConfig_type") + " " + mutatorConfig.getMinObjectsCount();
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(MutatorConfig.class)) {
-		case ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT:
-		case ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG:
-		case ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT:
-		case ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE:
-		case ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/RootItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/RootItemProvider.java
deleted file mode 100644
index 2ab5e2d..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/RootItemProvider.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class RootItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public RootItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ConfigPackage.Literals.ROOT__ELEMENTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns Root.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/Root"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		return getString("_UI_Root_type");
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(Root.class)) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createTestConfig()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createTestRun()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createTestResult()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createTestDiff()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createDiffReport()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createRoot()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.ROOT__ELEMENTS,
-			ConfigFactory.eINSTANCE.createMutatorConfig()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestConfigItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestConfigItemProvider.java
deleted file mode 100644
index ccf4d74..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestConfigItemProvider.java
+++ /dev/null
@@ -1,254 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class TestConfigItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestConfigItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addSeedPropertyDescriptor(object);
-			addCountPropertyDescriptor(object);
-			addTestClassPropertyDescriptor(object);
-			addIdPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Seed feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addSeedPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestConfig_seed_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestConfig_seed_feature", "_UI_TestConfig_type"),
-			ConfigPackage.Literals.TEST_CONFIG__SEED, true, false, false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-			null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Count feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addCountPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestConfig_count_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestConfig_count_feature", "_UI_TestConfig_type"),
-			ConfigPackage.Literals.TEST_CONFIG__COUNT, true, false, false, ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE,
-			null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Test Class feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addTestClassPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestConfig_testClass_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestConfig_testClass_feature", "_UI_TestConfig_type"),
-			ConfigPackage.Literals.TEST_CONFIG__TEST_CLASS, true, false, false,
-			ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Id feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addIdPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestConfig_id_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestConfig_id_feature", "_UI_TestConfig_type"),
-			ConfigPackage.Literals.TEST_CONFIG__ID, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-			null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ConfigPackage.Literals.TEST_CONFIG__MUTATOR_CONFIG);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns TestConfig.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TestConfig"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((TestConfig) object).getId();
-		return label == null || label.length() == 0 ? getString("_UI_TestConfig_type")
-			: getString("_UI_TestConfig_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TestConfig.class)) {
-		case ConfigPackage.TEST_CONFIG__SEED:
-		case ConfigPackage.TEST_CONFIG__COUNT:
-		case ConfigPackage.TEST_CONFIG__TEST_CLASS:
-		case ConfigPackage.TEST_CONFIG__ID:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-			return;
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.TEST_CONFIG__MUTATOR_CONFIG,
-			ConfigFactory.eINSTANCE.createMutatorConfig()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestDiffItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestDiffItemProvider.java
deleted file mode 100644
index a3c4b91..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestDiffItemProvider.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class TestDiffItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestDiffItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addLastUpdatePropertyDescriptor(object);
-			addConfigPropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Last Update feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addLastUpdatePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestDiff_lastUpdate_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestDiff_lastUpdate_feature", "_UI_TestDiff_type"),
-			ConfigPackage.Literals.TEST_DIFF__LAST_UPDATE, true, false, false,
-			ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Config feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addConfigPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestDiff_config_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestDiff_config_feature", "_UI_TestDiff_type"),
-			ConfigPackage.Literals.TEST_DIFF__CONFIG, true, false, true, null, null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ConfigPackage.Literals.TEST_DIFF__OLD_RESULT);
-			childrenFeatures.add(ConfigPackage.Literals.TEST_DIFF__NEW_RESULT);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns TestDiff.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TestDiff"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Date labelValue = ((TestDiff) object).getLastUpdate();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ? getString("_UI_TestDiff_type") : getString("_UI_TestDiff_type")
-			+ " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TestDiff.class)) {
-		case ConfigPackage.TEST_DIFF__LAST_UPDATE:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-			return;
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.TEST_DIFF__OLD_RESULT,
-			ConfigFactory.eINSTANCE.createTestResult()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.TEST_DIFF__NEW_RESULT,
-			ConfigFactory.eINSTANCE.createTestResult()));
-	}
-
-	/**
-	 * This returns the label text for {@link org.eclipse.emf.edit.command.CreateChildCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getCreateChildText(Object owner, Object feature, Object child, Collection<?> selection) {
-		Object childFeature = feature;
-		Object childObject = child;
-
-		boolean qualify = childFeature == ConfigPackage.Literals.TEST_DIFF__OLD_RESULT
-			|| childFeature == ConfigPackage.Literals.TEST_DIFF__NEW_RESULT;
-
-		if (qualify) {
-			return getString("_UI_CreateChild_text2", new Object[] { getTypeText(childObject),
-				getFeatureText(childFeature), getTypeText(owner) });
-		}
-		return super.getCreateChildText(owner, feature, child, selection);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestResultItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestResultItemProvider.java
deleted file mode 100644
index cff23f3..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestResultItemProvider.java
+++ /dev/null
@@ -1,232 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class TestResultItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestResultItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addSeedCountPropertyDescriptor(object);
-			addTestNamePropertyDescriptor(object);
-			addErrorPropertyDescriptor(object);
-			addFailurePropertyDescriptor(object);
-			addExecutionTimePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Seed Count feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addSeedCountPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestResult_seedCount_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestResult_seedCount_feature", "_UI_TestResult_type"),
-			ConfigPackage.Literals.TEST_RESULT__SEED_COUNT, true, false, false,
-			ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Test Name feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addTestNamePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestResult_testName_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestResult_testName_feature", "_UI_TestResult_type"),
-			ConfigPackage.Literals.TEST_RESULT__TEST_NAME, true, false, false,
-			ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Error feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addErrorPropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestResult_error_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestResult_error_feature", "_UI_TestResult_type"),
-			ConfigPackage.Literals.TEST_RESULT__ERROR, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-			null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Failure feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addFailurePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestResult_failure_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestResult_failure_feature", "_UI_TestResult_type"),
-			ConfigPackage.Literals.TEST_RESULT__FAILURE, true, false, false,
-			ItemPropertyDescriptor.GENERIC_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This adds a property descriptor for the Execution Time feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addExecutionTimePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(),
-			getResourceLocator(),
-			getString("_UI_TestResult_executionTime_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestResult_executionTime_feature",
-				"_UI_TestResult_type"), ConfigPackage.Literals.TEST_RESULT__EXECUTION_TIME, true, false, false,
-			ItemPropertyDescriptor.INTEGRAL_VALUE_IMAGE, null, null));
-	}
-
-	/**
-	 * This returns TestResult.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TestResult"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		String label = ((TestResult) object).getTestName();
-		return label == null || label.length() == 0 ? getString("_UI_TestResult_type")
-			: getString("_UI_TestResult_type") + " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TestResult.class)) {
-		case ConfigPackage.TEST_RESULT__SEED_COUNT:
-		case ConfigPackage.TEST_RESULT__TEST_NAME:
-		case ConfigPackage.TEST_RESULT__ERROR:
-		case ConfigPackage.TEST_RESULT__FAILURE:
-		case ConfigPackage.TEST_RESULT__EXECUTION_TIME:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestRunItemProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestRunItemProvider.java
deleted file mode 100644
index 328eeba..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.edit/src/org/eclipse/emf/emfstore/fuzzy/emf/config/provider/TestRunItemProvider.java
+++ /dev/null
@@ -1,207 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.provider;
-
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-import org.eclipse.emf.edit.provider.ComposeableAdapterFactory;
-import org.eclipse.emf.edit.provider.IEditingDomainItemProvider;
-import org.eclipse.emf.edit.provider.IItemLabelProvider;
-import org.eclipse.emf.edit.provider.IItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.IItemPropertySource;
-import org.eclipse.emf.edit.provider.IStructuredItemContentProvider;
-import org.eclipse.emf.edit.provider.ITreeItemContentProvider;
-import org.eclipse.emf.edit.provider.ItemPropertyDescriptor;
-import org.eclipse.emf.edit.provider.ItemProviderAdapter;
-import org.eclipse.emf.edit.provider.ViewerNotification;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * This is the item provider adapter for a {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun} object.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class TestRunItemProvider extends ItemProviderAdapter implements IEditingDomainItemProvider,
-	IStructuredItemContentProvider, ITreeItemContentProvider, IItemLabelProvider, IItemPropertySource {
-	/**
-	 * This constructs an instance from a factory and a notifier.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestRunItemProvider(AdapterFactory adapterFactory) {
-		super(adapterFactory);
-	}
-
-	/**
-	 * This returns the property descriptors for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public List<IItemPropertyDescriptor> getPropertyDescriptors(Object object) {
-		if (itemPropertyDescriptors == null) {
-			super.getPropertyDescriptors(object);
-
-			addTimePropertyDescriptor(object);
-		}
-		return itemPropertyDescriptors;
-	}
-
-	/**
-	 * This adds a property descriptor for the Time feature.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void addTimePropertyDescriptor(Object object) {
-		itemPropertyDescriptors.add(createItemPropertyDescriptor(
-			((ComposeableAdapterFactory) adapterFactory).getRootAdapterFactory(), getResourceLocator(),
-			getString("_UI_TestRun_time_feature"),
-			getString("_UI_PropertyDescriptor_description", "_UI_TestRun_time_feature", "_UI_TestRun_type"),
-			ConfigPackage.Literals.TEST_RUN__TIME, true, false, false, ItemPropertyDescriptor.GENERIC_VALUE_IMAGE,
-			null, null));
-	}
-
-	/**
-	 * This specifies how to implement {@link #getChildren} and is used to deduce an appropriate feature for an
-	 * {@link org.eclipse.emf.edit.command.AddCommand}, {@link org.eclipse.emf.edit.command.RemoveCommand} or
-	 * {@link org.eclipse.emf.edit.command.MoveCommand} in {@link #createCommand}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Collection<? extends EStructuralFeature> getChildrenFeatures(Object object) {
-		if (childrenFeatures == null) {
-			super.getChildrenFeatures(object);
-			childrenFeatures.add(ConfigPackage.Literals.TEST_RUN__CONFIG);
-			childrenFeatures.add(ConfigPackage.Literals.TEST_RUN__RESULTS);
-		}
-		return childrenFeatures;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EStructuralFeature getChildFeature(Object object, Object child) {
-		// Check the type of the specified child object and return the proper feature to use for
-		// adding (see {@link AddCommand}) it as a child.
-
-		return super.getChildFeature(object, child);
-	}
-
-	/**
-	 * This returns TestRun.gif.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object getImage(Object object) {
-		return overlayImage(object, getResourceLocator().getImage("full/obj16/TestRun"));
-	}
-
-	/**
-	 * This returns the label text for the adapted class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String getText(Object object) {
-		Date labelValue = ((TestRun) object).getTime();
-		String label = labelValue == null ? null : labelValue.toString();
-		return label == null || label.length() == 0 ? getString("_UI_TestRun_type") : getString("_UI_TestRun_type")
-			+ " " + label;
-	}
-
-	/**
-	 * This handles model notifications by calling {@link #updateChildren} to update any cached
-	 * children and by creating a viewer notification, which it passes to {@link #fireNotifyChanged}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void notifyChanged(Notification notification) {
-		updateChildren(notification);
-
-		switch (notification.getFeatureID(TestRun.class)) {
-		case ConfigPackage.TEST_RUN__TIME:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), false, true));
-			return;
-		case ConfigPackage.TEST_RUN__CONFIG:
-		case ConfigPackage.TEST_RUN__RESULTS:
-			fireNotifyChanged(new ViewerNotification(notification, notification.getNotifier(), true, false));
-			return;
-		}
-		super.notifyChanged(notification);
-	}
-
-	/**
-	 * This adds {@link org.eclipse.emf.edit.command.CommandParameter}s describing the children
-	 * that can be created under this object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void collectNewChildDescriptors(Collection<Object> newChildDescriptors, Object object) {
-		super.collectNewChildDescriptors(newChildDescriptors, object);
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.TEST_RUN__CONFIG,
-			ConfigFactory.eINSTANCE.createTestConfig()));
-
-		newChildDescriptors.add(createChildParameter(ConfigPackage.Literals.TEST_RUN__RESULTS,
-			ConfigFactory.eINSTANCE.createTestResult()));
-	}
-
-	/**
-	 * Return the resource locator for this item provider's resources.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getResourceLocator() {
-		return ConfigEditPlugin.INSTANCE;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.checkstyle b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.checkstyle
deleted file mode 100644
index 2f2667a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.checkstyle
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
-  <fileset name="all" enabled="true" check-config-name="emfstoreStyle" local="false">
-    <file-match-pattern match-pattern="." include-pattern="true"/>
-  </fileset>
-</fileset-config>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.classpath
deleted file mode 100644
index 472ee29..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.project
deleted file mode 100644
index 261eae6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy.emf.editor</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/META-INF/MANIFEST.MF
deleted file mode 100644
index ae55196..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,16 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EMFDataProvider Editor
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy.emf.editor;singleton:=true
-Bundle-Version: 0.9.3.qualifier
-Bundle-ClassPath: .
-Bundle-Activator: org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigEditorPlugin$Implementation
-Bundle-Vendor: Eclipse Modeling Project
-Bundle-Localization: plugin
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Export-Package: org.eclipse.emf.emfstore.fuzzy.emf.config.presentation
-Require-Bundle: org.eclipse.core.resources;bundle-version="[3.7.0,4.0.0)";visibility:=reexport,
- org.eclipse.emf.emfstore.fuzzy.emf.edit;visibility:=reexport,
- org.eclipse.emf.edit.ui;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
- org.eclipse.ui.ide;bundle-version="[3.7.0,4.0.0)";visibility:=reexport
-Bundle-ActivationPolicy: lazy
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/build.properties
deleted file mode 100644
index 10c87a0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/build.properties
+++ /dev/null
@@ -1,14 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-bin.includes = .,\
-               icons/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/obj16/ConfigModelFile.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/obj16/ConfigModelFile.gif
deleted file mode 100644
index 8b3ad80..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/obj16/ConfigModelFile.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/wizban/NewConfig.gif b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/wizban/NewConfig.gif
deleted file mode 100644
index 33f212f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/icons/full/wizban/NewConfig.gif
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.properties
deleted file mode 100644
index 6c5340c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.properties
+++ /dev/null
@@ -1,57 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-pluginName = Config Editor
-providerName = www.example.org
-
-_UI_ConfigEditor_menu = &Config Editor
-
-_UI_CreateChild_menu_item = &New Child
-_UI_CreateSibling_menu_item = N&ew Sibling
-
-_UI_ShowPropertiesView_menu_item = Show &Properties View
-_UI_RefreshViewer_menu_item = &Refresh
-
-_UI_SelectionPage_label = Selection
-_UI_ParentPage_label = Parent
-_UI_ListPage_label = List
-_UI_TreePage_label = Tree
-_UI_TablePage_label = Table
-_UI_TreeWithColumnsPage_label = Tree with Columns
-_UI_ObjectColumn_label = Object
-_UI_SelfColumn_label = Self
-
-_UI_NoObjectSelected = Selected Nothing
-_UI_SingleObjectSelected = Selected Object: {0}
-_UI_MultiObjectSelected = Selected {0} Objects
-
-_UI_OpenEditorError_label = Open Editor
-
-_UI_Wizard_category = Example EMF Model Creation Wizards
-
-_UI_CreateModelError_message = Problems encountered in file "{0}"
-
-_UI_ConfigModelWizard_label = Config Model
-_UI_ConfigModelWizard_description = Create a new Config model
-
-_UI_ConfigEditor_label = Config Model Editor
-
-_UI_ConfigEditorFilenameDefaultBase = My
-_UI_ConfigEditorFilenameExtensions = fuzzy
-
-_UI_Wizard_label = New
-
-_WARN_FilenameExtension = The file name must end in ''.{0}''
-_WARN_FilenameExtensions = The file name must have one of the following extensions: {0}
-
-_UI_ModelObject = &Model Object
-_UI_XMLEncoding = &XML Encoding
-_UI_XMLEncodingChoices = UTF-8 ASCII UTF-16 UTF-16BE UTF-16LE ISO-8859-1
-_UI_Wizard_initial_object_description = Select a model object to create
-
-_UI_FileConflict_label = File Conflict
-_WARN_FileConflict = There are unsaved changes that conflict with changes made outside the editor.  Do you wish to discard this editor's changes?
-
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.xml
deleted file mode 100644
index 96bb383..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/plugin.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id$
--->
-
-<plugin>
-
-   <extension point="org.eclipse.ui.newWizards">
-      <category
-            id="org.eclipse.emf.ecore.Wizard.category.ID"
-            name="%_UI_Wizard_category"/>
-      <wizard
-            id="org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigModelWizardID"
-            name="%_UI_ConfigModelWizard_label"
-            class="org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigModelWizard"
-            category="org.eclipse.emf.ecore.Wizard.category.ID"
-            icon="icons/full/obj16/ConfigModelFile.gif">
-         <description>%_UI_ConfigModelWizard_description</description>
-         <selection class="org.eclipse.core.resources.IResource"/>
-      </wizard>
-   </extension>
-
-   <extension point="org.eclipse.ui.editors">
-      <editor
-            id="org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigEditorID"
-            name="%_UI_ConfigEditor_label"
-            icon="icons/full/obj16/ConfigModelFile.gif"
-            extensions="fuzzy"
-            class="org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigEditor"
-            contributorClass="org.eclipse.emf.emfstore.fuzzy.emf.config.presentation.ConfigActionBarContributor">
-      </editor>
-   </extension>
-
-</plugin>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/pom.xml
deleted file mode 100644
index 7684dca..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy.emf.editor</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigActionBarContributor.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigActionBarContributor.java
deleted file mode 100644
index 9905102..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigActionBarContributor.java
+++ /dev/null
@@ -1,450 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.presentation;
-
-import java.util.ArrayList;
-import java.util.Collection;
-
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-
-import org.eclipse.emf.edit.ui.action.ControlAction;
-import org.eclipse.emf.edit.ui.action.CreateChildAction;
-import org.eclipse.emf.edit.ui.action.CreateSiblingAction;
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-import org.eclipse.emf.edit.ui.action.LoadResourceAction;
-import org.eclipse.emf.edit.ui.action.ValidateAction;
-
-import org.eclipse.jface.action.Action;
-import org.eclipse.jface.action.ActionContributionItem;
-import org.eclipse.jface.action.IAction;
-import org.eclipse.jface.action.IContributionItem;
-import org.eclipse.jface.action.IContributionManager;
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-import org.eclipse.jface.action.SubContributionItem;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.Viewer;
-
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This is the action bar contributor for the Config model editor.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigActionBarContributor extends EditingDomainActionBarContributor implements ISelectionChangedListener {
-	/**
-	 * This keeps track of the active editor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IEditorPart activeEditorPart;
-
-	/**
-	 * This keeps track of the current selection provider.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelectionProvider selectionProvider;
-
-	/**
-	 * This action opens the Properties view.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IAction showPropertiesViewAction = new Action(
-		ConfigEditorPlugin.INSTANCE.getString("_UI_ShowPropertiesView_menu_item")) {
-		@Override
-		public void run() {
-			try {
-				getPage().showView("org.eclipse.ui.views.PropertySheet");
-			} catch (PartInitException exception) {
-				ConfigEditorPlugin.INSTANCE.log(exception);
-			}
-		}
-	};
-
-	/**
-	 * This action refreshes the viewer of the current editor if the editor
-	 * implements {@link org.eclipse.emf.common.ui.viewer.IViewerProvider}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IAction refreshViewerAction = new Action(
-		ConfigEditorPlugin.INSTANCE.getString("_UI_RefreshViewer_menu_item")) {
-		@Override
-		public boolean isEnabled() {
-			return activeEditorPart instanceof IViewerProvider;
-		}
-
-		@Override
-		public void run() {
-			if (activeEditorPart instanceof IViewerProvider) {
-				Viewer viewer = ((IViewerProvider) activeEditorPart).getViewer();
-				if (viewer != null) {
-					viewer.refresh();
-				}
-			}
-		}
-	};
-
-	/**
-	 * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateChildAction} corresponding to each descriptor
-	 * generated for the current selection by the item provider.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<IAction> createChildActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be added for CreateChild actions.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IMenuManager createChildMenuManager;
-
-	/**
-	 * This will contain one {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} corresponding to each descriptor
-	 * generated for the current selection by the item provider.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<IAction> createSiblingActions;
-
-	/**
-	 * This is the menu manager into which menu contribution items should be added for CreateSibling actions.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IMenuManager createSiblingMenuManager;
-
-	/**
-	 * This creates an instance of the contributor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigActionBarContributor() {
-		super(ADDITIONS_LAST_STYLE);
-		loadResourceAction = new LoadResourceAction();
-		validateAction = new ValidateAction();
-		controlAction = new ControlAction();
-	}
-
-	/**
-	 * This adds Separators for editor additions to the tool bar.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void contributeToToolBar(IToolBarManager toolBarManager) {
-		toolBarManager.add(new Separator("config-settings"));
-		toolBarManager.add(new Separator("config-additions"));
-	}
-
-	/**
-	 * This adds to the menu bar a menu and some separators for editor additions,
-	 * as well as the sub-menus for object creation items.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void contributeToMenu(IMenuManager menuManager) {
-		super.contributeToMenu(menuManager);
-
-		IMenuManager submenuManager = new MenuManager(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigEditor_menu"),
-			"org.eclipse.emf.emfstore.fuzzy.emf.configMenuID");
-		menuManager.insertAfter("additions", submenuManager);
-		submenuManager.add(new Separator("settings"));
-		submenuManager.add(new Separator("actions"));
-		submenuManager.add(new Separator("additions"));
-		submenuManager.add(new Separator("additions-end"));
-
-		// Prepare for CreateChild item addition or removal.
-		//
-		createChildMenuManager = new MenuManager(ConfigEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
-		submenuManager.insertBefore("additions", createChildMenuManager);
-
-		// Prepare for CreateSibling item addition or removal.
-		//
-		createSiblingMenuManager = new MenuManager(ConfigEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
-		submenuManager.insertBefore("additions", createSiblingMenuManager);
-
-		// Force an update because Eclipse hides empty menus now.
-		//
-		submenuManager.addMenuListener(new IMenuListener() {
-			public void menuAboutToShow(IMenuManager menuManager) {
-				menuManager.updateAll(true);
-			}
-		});
-
-		addGlobalActions(submenuManager);
-	}
-
-	/**
-	 * When the active editor changes, this remembers the change and registers with it as a selection provider.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void setActiveEditor(IEditorPart part) {
-		super.setActiveEditor(part);
-		activeEditorPart = part;
-
-		// Switch to the new selection provider.
-		//
-		if (selectionProvider != null) {
-			selectionProvider.removeSelectionChangedListener(this);
-		}
-		if (part == null) {
-			selectionProvider = null;
-		} else {
-			selectionProvider = part.getSite().getSelectionProvider();
-			selectionProvider.addSelectionChangedListener(this);
-
-			// Fake a selection changed event to update the menus.
-			//
-			if (selectionProvider.getSelection() != null) {
-				selectionChanged(new SelectionChangedEvent(selectionProvider, selectionProvider.getSelection()));
-			}
-		}
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionChangedListener},
-	 * handling {@link org.eclipse.jface.viewers.SelectionChangedEvent}s by querying for the children and siblings
-	 * that can be added to the selected object and updating the menus accordingly.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void selectionChanged(SelectionChangedEvent event) {
-		// Remove any menu items for old selection.
-		//
-		if (createChildMenuManager != null) {
-			depopulateManager(createChildMenuManager, createChildActions);
-		}
-		if (createSiblingMenuManager != null) {
-			depopulateManager(createSiblingMenuManager, createSiblingActions);
-		}
-
-		// Query the new selection for appropriate new child/sibling descriptors
-		//
-		Collection<?> newChildDescriptors = null;
-		Collection<?> newSiblingDescriptors = null;
-
-		ISelection selection = event.getSelection();
-		if (selection instanceof IStructuredSelection && ((IStructuredSelection) selection).size() == 1) {
-			Object object = ((IStructuredSelection) selection).getFirstElement();
-
-			EditingDomain domain = ((IEditingDomainProvider) activeEditorPart).getEditingDomain();
-
-			newChildDescriptors = domain.getNewChildDescriptors(object, null);
-			newSiblingDescriptors = domain.getNewChildDescriptors(null, object);
-		}
-
-		// Generate actions for selection; populate and redraw the menus.
-		//
-		createChildActions = generateCreateChildActions(newChildDescriptors, selection);
-		createSiblingActions = generateCreateSiblingActions(newSiblingDescriptors, selection);
-
-		if (createChildMenuManager != null) {
-			populateManager(createChildMenuManager, createChildActions, null);
-			createChildMenuManager.update(true);
-		}
-		if (createSiblingMenuManager != null) {
-			populateManager(createSiblingMenuManager, createSiblingActions, null);
-			createSiblingMenuManager.update(true);
-		}
-	}
-
-	/**
-	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateChildAction} for each object in
-	 * <code>descriptors</code>,
-	 * and returns the collection of these actions.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<IAction> generateCreateChildActions(Collection<?> descriptors, ISelection selection) {
-		Collection<IAction> actions = new ArrayList<IAction>();
-		if (descriptors != null) {
-			for (Object descriptor : descriptors) {
-				actions.add(new CreateChildAction(activeEditorPart, selection, descriptor));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This generates a {@link org.eclipse.emf.edit.ui.action.CreateSiblingAction} for each object in
-	 * <code>descriptors</code>,
-	 * and returns the collection of these actions.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<IAction> generateCreateSiblingActions(Collection<?> descriptors, ISelection selection) {
-		Collection<IAction> actions = new ArrayList<IAction>();
-		if (descriptors != null) {
-			for (Object descriptor : descriptors) {
-				actions.add(new CreateSiblingAction(activeEditorPart, selection, descriptor));
-			}
-		}
-		return actions;
-	}
-
-	/**
-	 * This populates the specified <code>manager</code> with {@link org.eclipse.jface.action.ActionContributionItem}s
-	 * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection,
-	 * by inserting them before the specified contribution item <code>contributionID</code>.
-	 * If <code>contributionID</code> is <code>null</code>, they are simply added.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void populateManager(IContributionManager manager, Collection<? extends IAction> actions,
-		String contributionID) {
-		if (actions != null) {
-			for (IAction action : actions) {
-				if (contributionID != null) {
-					manager.insertBefore(contributionID, action);
-				} else {
-					manager.add(action);
-				}
-			}
-		}
-	}
-
-	/**
-	 * This removes from the specified <code>manager</code> all {@link org.eclipse.jface.action.ActionContributionItem}s
-	 * based on the {@link org.eclipse.jface.action.IAction}s contained in the <code>actions</code> collection.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void depopulateManager(IContributionManager manager, Collection<? extends IAction> actions) {
-		if (actions != null) {
-			IContributionItem[] items = manager.getItems();
-			for (int i = 0; i < items.length; i++) {
-				// Look into SubContributionItems
-				//
-				IContributionItem contributionItem = items[i];
-				while (contributionItem instanceof SubContributionItem) {
-					contributionItem = ((SubContributionItem) contributionItem).getInnerItem();
-				}
-
-				// Delete the ActionContributionItems with matching action.
-				//
-				if (contributionItem instanceof ActionContributionItem) {
-					IAction action = ((ActionContributionItem) contributionItem).getAction();
-					if (actions.contains(action)) {
-						manager.remove(contributionItem);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * This populates the pop-up menu before it appears.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void menuAboutToShow(IMenuManager menuManager) {
-		super.menuAboutToShow(menuManager);
-		MenuManager submenuManager = null;
-
-		submenuManager = new MenuManager(ConfigEditorPlugin.INSTANCE.getString("_UI_CreateChild_menu_item"));
-		populateManager(submenuManager, createChildActions, null);
-		menuManager.insertBefore("edit", submenuManager);
-
-		submenuManager = new MenuManager(ConfigEditorPlugin.INSTANCE.getString("_UI_CreateSibling_menu_item"));
-		populateManager(submenuManager, createSiblingActions, null);
-		menuManager.insertBefore("edit", submenuManager);
-	}
-
-	/**
-	 * This inserts global actions before the "additions-end" separator.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void addGlobalActions(IMenuManager menuManager) {
-		menuManager.insertAfter("additions-end", new Separator("ui-actions"));
-		menuManager.insertAfter("ui-actions", showPropertiesViewAction);
-
-		refreshViewerAction.setEnabled(refreshViewerAction.isEnabled());
-		menuManager.insertAfter("ui-actions", refreshViewerAction);
-
-		super.addGlobalActions(menuManager);
-	}
-
-	/**
-	 * This ensures that a delete action will clean up all references to deleted objects.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected boolean removeAllReferencesOnDelete() {
-		return true;
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditor.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditor.java
deleted file mode 100644
index a7b4919..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditor.java
+++ /dev/null
@@ -1,1851 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.presentation;
-
-import java.io.IOException;
-import java.io.InputStream;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.EventObject;
-import java.util.HashMap;
-import java.util.Iterator;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IMarker;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.IResourceChangeEvent;
-import org.eclipse.core.resources.IResourceChangeListener;
-import org.eclipse.core.resources.IResourceDelta;
-import org.eclipse.core.resources.IResourceDeltaVisitor;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.core.runtime.CoreException;
-import org.eclipse.core.runtime.IPath;
-import org.eclipse.core.runtime.IProgressMonitor;
-import org.eclipse.core.runtime.NullProgressMonitor;
-
-import org.eclipse.jface.action.IMenuListener;
-import org.eclipse.jface.action.IMenuManager;
-import org.eclipse.jface.action.IStatusLineManager;
-import org.eclipse.jface.action.IToolBarManager;
-import org.eclipse.jface.action.MenuManager;
-import org.eclipse.jface.action.Separator;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-import org.eclipse.jface.dialogs.ProgressMonitorDialog;
-
-import org.eclipse.jface.viewers.ColumnWeightData;
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.ISelectionChangedListener;
-import org.eclipse.jface.viewers.ISelectionProvider;
-import org.eclipse.jface.viewers.IStructuredSelection;
-import org.eclipse.jface.viewers.ListViewer;
-import org.eclipse.jface.viewers.SelectionChangedEvent;
-import org.eclipse.jface.viewers.StructuredSelection;
-import org.eclipse.jface.viewers.StructuredViewer;
-import org.eclipse.jface.viewers.TableLayout;
-import org.eclipse.jface.viewers.TableViewer;
-import org.eclipse.jface.viewers.TreeViewer;
-import org.eclipse.jface.viewers.Viewer;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.custom.CTabFolder;
-
-import org.eclipse.swt.dnd.DND;
-import org.eclipse.swt.dnd.Transfer;
-
-import org.eclipse.swt.events.ControlAdapter;
-import org.eclipse.swt.events.ControlEvent;
-
-import org.eclipse.swt.graphics.Point;
-
-import org.eclipse.swt.layout.FillLayout;
-
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Menu;
-import org.eclipse.swt.widgets.Table;
-import org.eclipse.swt.widgets.TableColumn;
-import org.eclipse.swt.widgets.Tree;
-import org.eclipse.swt.widgets.TreeColumn;
-
-import org.eclipse.ui.IActionBars;
-import org.eclipse.ui.IEditorInput;
-import org.eclipse.ui.IEditorPart;
-import org.eclipse.ui.IEditorSite;
-import org.eclipse.ui.IPartListener;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.PartInitException;
-
-import org.eclipse.ui.dialogs.SaveAsDialog;
-
-import org.eclipse.ui.ide.IGotoMarker;
-
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.MultiPageEditorPart;
-
-import org.eclipse.ui.views.contentoutline.ContentOutline;
-import org.eclipse.ui.views.contentoutline.ContentOutlinePage;
-import org.eclipse.ui.views.contentoutline.IContentOutlinePage;
-
-import org.eclipse.ui.views.properties.IPropertySheetPage;
-import org.eclipse.ui.views.properties.PropertySheet;
-import org.eclipse.ui.views.properties.PropertySheetPage;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.common.command.Command;
-import org.eclipse.emf.common.command.CommandStack;
-import org.eclipse.emf.common.command.CommandStackListener;
-
-import org.eclipse.emf.common.notify.AdapterFactory;
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.ui.MarkerHelper;
-import org.eclipse.emf.common.ui.ViewerPane;
-
-import org.eclipse.emf.common.ui.editor.ProblemEditorPart;
-
-import org.eclipse.emf.common.ui.viewer.IViewerProvider;
-
-import org.eclipse.emf.common.util.BasicDiagnostic;
-import org.eclipse.emf.common.util.Diagnostic;
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EValidator;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.emf.ecore.util.EContentAdapter;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.edit.domain.IEditingDomainProvider;
-
-import org.eclipse.emf.edit.provider.AdapterFactoryItemDelegator;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.edit.provider.ReflectiveItemProviderAdapterFactory;
-
-import org.eclipse.emf.edit.provider.resource.ResourceItemProviderAdapterFactory;
-
-import org.eclipse.emf.edit.ui.action.EditingDomainActionBarContributor;
-
-import org.eclipse.emf.edit.ui.celleditor.AdapterFactoryTreeEditor;
-
-import org.eclipse.emf.edit.ui.dnd.EditingDomainViewerDropAdapter;
-import org.eclipse.emf.edit.ui.dnd.LocalTransfer;
-import org.eclipse.emf.edit.ui.dnd.ViewerDragAdapter;
-
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryContentProvider;
-import org.eclipse.emf.edit.ui.provider.AdapterFactoryLabelProvider;
-import org.eclipse.emf.edit.ui.provider.UnwrappingSelectionProvider;
-
-import org.eclipse.emf.edit.ui.util.EditUIMarkerHelper;
-import org.eclipse.emf.edit.ui.util.EditUIUtil;
-
-import org.eclipse.emf.edit.ui.view.ExtendedPropertySheetPage;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.provider.ConfigItemProviderAdapterFactory;
-
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-/**
- * This is an example of a Config model editor.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigEditor extends MultiPageEditorPart implements IEditingDomainProvider, ISelectionProvider,
-	IMenuListener, IViewerProvider, IGotoMarker {
-	/**
-	 * This keeps track of the editing domain that is used to track all changes to the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected AdapterFactoryEditingDomain editingDomain;
-
-	/**
-	 * This is the one adapter factory used for providing views of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ComposedAdapterFactory adapterFactory;
-
-	/**
-	 * This is the content outline page.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IContentOutlinePage contentOutlinePage;
-
-	/**
-	 * This is a kludge...
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IStatusLineManager contentOutlineStatusLineManager;
-
-	/**
-	 * This is the content outline page's viewer.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer contentOutlineViewer;
-
-	/**
-	 * This is the property sheet page.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected PropertySheetPage propertySheetPage;
-
-	/**
-	 * This is the viewer that shadows the selection in the content outline.
-	 * The parent relation must be correctly defined for this to work.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer selectionViewer;
-
-	/**
-	 * This inverts the roll of parent and child in the content provider and show parents as a tree.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer parentViewer;
-
-	/**
-	 * This shows how a tree view works.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer treeViewer;
-
-	/**
-	 * This shows how a list view works.
-	 * A list viewer doesn't support icons.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ListViewer listViewer;
-
-	/**
-	 * This shows how a table view works.
-	 * A table can be used as a list with icons.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TableViewer tableViewer;
-
-	/**
-	 * This shows how a tree view with columns works.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TreeViewer treeViewerWithColumns;
-
-	/**
-	 * This keeps track of the active viewer pane, in the book.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ViewerPane currentViewerPane;
-
-	/**
-	 * This keeps track of the active content viewer, which may be either one of the viewers in the pages or the content
-	 * outline viewer.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Viewer currentViewer;
-
-	/**
-	 * This listens to which ever viewer is active.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelectionChangedListener selectionChangedListener;
-
-	/**
-	 * This keeps track of all the {@link org.eclipse.jface.viewers.ISelectionChangedListener}s that are listening to
-	 * this editor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<ISelectionChangedListener> selectionChangedListeners = new ArrayList<ISelectionChangedListener>();
-
-	/**
-	 * This keeps track of the selection of the editor as a whole.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ISelection editorSelection = StructuredSelection.EMPTY;
-
-	/**
-	 * The MarkerHelper is responsible for creating workspace resource markers presented
-	 * in Eclipse's Problems View.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected MarkerHelper markerHelper = new EditUIMarkerHelper();
-
-	/**
-	 * This listens for when the outline becomes active
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IPartListener partListener = new IPartListener() {
-		public void partActivated(IWorkbenchPart p) {
-			if (p instanceof ContentOutline) {
-				if (((ContentOutline) p).getCurrentPage() == contentOutlinePage) {
-					getActionBarContributor().setActiveEditor(ConfigEditor.this);
-
-					setCurrentViewer(contentOutlineViewer);
-				}
-			} else if (p instanceof PropertySheet) {
-				if (((PropertySheet) p).getCurrentPage() == propertySheetPage) {
-					getActionBarContributor().setActiveEditor(ConfigEditor.this);
-					handleActivate();
-				}
-			} else if (p == ConfigEditor.this) {
-				handleActivate();
-			}
-		}
-
-		public void partBroughtToTop(IWorkbenchPart p) {
-			// Ignore.
-		}
-
-		public void partClosed(IWorkbenchPart p) {
-			// Ignore.
-		}
-
-		public void partDeactivated(IWorkbenchPart p) {
-			// Ignore.
-		}
-
-		public void partOpened(IWorkbenchPart p) {
-			// Ignore.
-		}
-	};
-
-	/**
-	 * Resources that have been removed since last activation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<Resource> removedResources = new ArrayList<Resource>();
-
-	/**
-	 * Resources that have been changed since last activation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<Resource> changedResources = new ArrayList<Resource>();
-
-	/**
-	 * Resources that have been saved.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<Resource> savedResources = new ArrayList<Resource>();
-
-	/**
-	 * Map to store the diagnostic associated with a resource.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Map<Resource, Diagnostic> resourceToDiagnosticMap = new LinkedHashMap<Resource, Diagnostic>();
-
-	/**
-	 * Controls whether the problem indication should be updated.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected boolean updateProblemIndication = true;
-
-	/**
-	 * Adapter used to update the problem indication when resources are demanded loaded.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EContentAdapter problemIndicationAdapter = new EContentAdapter() {
-		@Override
-		public void notifyChanged(Notification notification) {
-			if (notification.getNotifier() instanceof Resource) {
-				switch (notification.getFeatureID(Resource.class)) {
-				case Resource.RESOURCE__IS_LOADED:
-				case Resource.RESOURCE__ERRORS:
-				case Resource.RESOURCE__WARNINGS: {
-					Resource resource = (Resource) notification.getNotifier();
-					Diagnostic diagnostic = analyzeResourceProblems(resource, null);
-					if (diagnostic.getSeverity() != Diagnostic.OK) {
-						resourceToDiagnosticMap.put(resource, diagnostic);
-					} else {
-						resourceToDiagnosticMap.remove(resource);
-					}
-
-					if (updateProblemIndication) {
-						getSite().getShell().getDisplay().asyncExec(new Runnable() {
-							public void run() {
-								updateProblemIndication();
-							}
-						});
-					}
-					break;
-				}
-				}
-			} else {
-				super.notifyChanged(notification);
-			}
-		}
-
-		@Override
-		protected void setTarget(Resource target) {
-			basicSetTarget(target);
-		}
-
-		@Override
-		protected void unsetTarget(Resource target) {
-			basicUnsetTarget(target);
-		}
-	};
-
-	/**
-	 * This listens for workspace changes.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IResourceChangeListener resourceChangeListener = new IResourceChangeListener() {
-		public void resourceChanged(IResourceChangeEvent event) {
-			IResourceDelta delta = event.getDelta();
-			try {
-				class ResourceDeltaVisitor implements IResourceDeltaVisitor {
-					protected ResourceSet resourceSet = editingDomain.getResourceSet();
-					protected Collection<Resource> changedResources = new ArrayList<Resource>();
-					protected Collection<Resource> removedResources = new ArrayList<Resource>();
-
-					public boolean visit(IResourceDelta delta) {
-						if (delta.getResource().getType() == IResource.FILE) {
-							if (delta.getKind() == IResourceDelta.REMOVED || delta.getKind() == IResourceDelta.CHANGED
-								&& delta.getFlags() != IResourceDelta.MARKERS) {
-								Resource resource = resourceSet.getResource(
-									URI.createPlatformResourceURI(delta.getFullPath().toString(), true), false);
-								if (resource != null) {
-									if (delta.getKind() == IResourceDelta.REMOVED) {
-										removedResources.add(resource);
-									} else if (!savedResources.remove(resource)) {
-										changedResources.add(resource);
-									}
-								}
-							}
-						}
-
-						return true;
-					}
-
-					public Collection<Resource> getChangedResources() {
-						return changedResources;
-					}
-
-					public Collection<Resource> getRemovedResources() {
-						return removedResources;
-					}
-				}
-
-				final ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
-				delta.accept(visitor);
-
-				if (!visitor.getRemovedResources().isEmpty()) {
-					getSite().getShell().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							removedResources.addAll(visitor.getRemovedResources());
-							if (!isDirty()) {
-								getSite().getPage().closeEditor(ConfigEditor.this, false);
-							}
-						}
-					});
-				}
-
-				if (!visitor.getChangedResources().isEmpty()) {
-					getSite().getShell().getDisplay().asyncExec(new Runnable() {
-						public void run() {
-							changedResources.addAll(visitor.getChangedResources());
-							if (getSite().getPage().getActiveEditor() == ConfigEditor.this) {
-								handleActivate();
-							}
-						}
-					});
-				}
-			} catch (CoreException exception) {
-				ConfigEditorPlugin.INSTANCE.log(exception);
-			}
-		}
-	};
-
-	/**
-	 * Handles activation of the editor or it's associated views.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void handleActivate() {
-		// Recompute the read only state.
-		//
-		if (editingDomain.getResourceToReadOnlyMap() != null) {
-			editingDomain.getResourceToReadOnlyMap().clear();
-
-			// Refresh any actions that may become enabled or disabled.
-			//
-			setSelection(getSelection());
-		}
-
-		if (!removedResources.isEmpty()) {
-			if (handleDirtyConflict()) {
-				getSite().getPage().closeEditor(ConfigEditor.this, false);
-			} else {
-				removedResources.clear();
-				changedResources.clear();
-				savedResources.clear();
-			}
-		} else if (!changedResources.isEmpty()) {
-			changedResources.removeAll(savedResources);
-			handleChangedResources();
-			changedResources.clear();
-			savedResources.clear();
-		}
-	}
-
-	/**
-	 * Handles what to do with changed resources on activation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void handleChangedResources() {
-		if (!changedResources.isEmpty() && (!isDirty() || handleDirtyConflict())) {
-			if (isDirty()) {
-				changedResources.addAll(editingDomain.getResourceSet().getResources());
-			}
-			editingDomain.getCommandStack().flush();
-
-			updateProblemIndication = false;
-			for (Resource resource : changedResources) {
-				if (resource.isLoaded()) {
-					resource.unload();
-					try {
-						resource.load(Collections.EMPTY_MAP);
-					} catch (IOException exception) {
-						if (!resourceToDiagnosticMap.containsKey(resource)) {
-							resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
-						}
-					}
-				}
-			}
-
-			if (AdapterFactoryEditingDomain.isStale(editorSelection)) {
-				setSelection(StructuredSelection.EMPTY);
-			}
-
-			updateProblemIndication = true;
-			updateProblemIndication();
-		}
-	}
-
-	/**
-	 * Updates the problems indication with the information described in the specified diagnostic.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void updateProblemIndication() {
-		if (updateProblemIndication) {
-			BasicDiagnostic diagnostic = new BasicDiagnostic(Diagnostic.OK,
-				"org.eclipse.emf.emfstore.fuzzy.emf.editor", 0, null, new Object[] { editingDomain.getResourceSet() });
-			for (Diagnostic childDiagnostic : resourceToDiagnosticMap.values()) {
-				if (childDiagnostic.getSeverity() != Diagnostic.OK) {
-					diagnostic.add(childDiagnostic);
-				}
-			}
-
-			int lastEditorPage = getPageCount() - 1;
-			if (lastEditorPage >= 0 && getEditor(lastEditorPage) instanceof ProblemEditorPart) {
-				((ProblemEditorPart) getEditor(lastEditorPage)).setDiagnostic(diagnostic);
-				if (diagnostic.getSeverity() != Diagnostic.OK) {
-					setActivePage(lastEditorPage);
-				}
-			} else if (diagnostic.getSeverity() != Diagnostic.OK) {
-				ProblemEditorPart problemEditorPart = new ProblemEditorPart();
-				problemEditorPart.setDiagnostic(diagnostic);
-				problemEditorPart.setMarkerHelper(markerHelper);
-				try {
-					addPage(++lastEditorPage, problemEditorPart, getEditorInput());
-					setPageText(lastEditorPage, problemEditorPart.getPartName());
-					setActivePage(lastEditorPage);
-					showTabs();
-				} catch (PartInitException exception) {
-					ConfigEditorPlugin.INSTANCE.log(exception);
-				}
-			}
-
-			if (markerHelper.hasMarkers(editingDomain.getResourceSet())) {
-				markerHelper.deleteMarkers(editingDomain.getResourceSet());
-				if (diagnostic.getSeverity() != Diagnostic.OK) {
-					try {
-						markerHelper.createMarkers(diagnostic);
-					} catch (CoreException exception) {
-						ConfigEditorPlugin.INSTANCE.log(exception);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * Shows a dialog that asks if conflicting changes should be discarded.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected boolean handleDirtyConflict() {
-		return MessageDialog.openQuestion(getSite().getShell(), getString("_UI_FileConflict_label"),
-			getString("_WARN_FileConflict"));
-	}
-
-	/**
-	 * This creates a model editor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigEditor() {
-		super();
-		initializeEditingDomain();
-	}
-
-	/**
-	 * This sets up the editing domain for the model editor.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void initializeEditingDomain() {
-		// Create an adapter factory that yields item providers.
-		//
-		adapterFactory = new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE);
-
-		adapterFactory.addAdapterFactory(new ResourceItemProviderAdapterFactory());
-		adapterFactory.addAdapterFactory(new ConfigItemProviderAdapterFactory());
-		adapterFactory.addAdapterFactory(new ReflectiveItemProviderAdapterFactory());
-
-		// Create the command stack that will notify this editor as commands are executed.
-		//
-		BasicCommandStack commandStack = new BasicCommandStack();
-
-		// Add a listener to set the most recent command's affected objects to be the selection of the viewer with
-		// focus.
-		//
-		commandStack.addCommandStackListener(new CommandStackListener() {
-			public void commandStackChanged(final EventObject event) {
-				getContainer().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						firePropertyChange(IEditorPart.PROP_DIRTY);
-
-						// Try to select the affected objects.
-						//
-						Command mostRecentCommand = ((CommandStack) event.getSource()).getMostRecentCommand();
-						if (mostRecentCommand != null) {
-							setSelectionToViewer(mostRecentCommand.getAffectedObjects());
-						}
-						if (propertySheetPage != null && !propertySheetPage.getControl().isDisposed()) {
-							propertySheetPage.refresh();
-						}
-					}
-				});
-			}
-		});
-
-		// Create the editing domain with a special command stack.
-		//
-		editingDomain = new AdapterFactoryEditingDomain(adapterFactory, commandStack, new HashMap<Resource, Boolean>());
-	}
-
-	/**
-	 * This is here for the listener to be able to call it.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void firePropertyChange(int action) {
-		super.firePropertyChange(action);
-	}
-
-	/**
-	 * This sets the selection into whichever viewer is active.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSelectionToViewer(Collection<?> collection) {
-		final Collection<?> theSelection = collection;
-		// Make sure it's okay.
-		//
-		if (theSelection != null && !theSelection.isEmpty()) {
-			Runnable runnable = new Runnable() {
-				public void run() {
-					// Try to select the items in the current content viewer of the editor.
-					//
-					if (currentViewer != null) {
-						currentViewer.setSelection(new StructuredSelection(theSelection.toArray()), true);
-					}
-				}
-			};
-			getSite().getShell().getDisplay().asyncExec(runnable);
-		}
-	}
-
-	/**
-	 * This returns the editing domain as required by the {@link IEditingDomainProvider} interface.
-	 * This is important for implementing the static methods of {@link AdapterFactoryEditingDomain} and for supporting
-	 * {@link org.eclipse.emf.edit.ui.action.CommandAction}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EditingDomain getEditingDomain() {
-		return editingDomain;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public class ReverseAdapterFactoryContentProvider extends AdapterFactoryContentProvider {
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public ReverseAdapterFactoryContentProvider(AdapterFactory adapterFactory) {
-			super(adapterFactory);
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		public Object[] getElements(Object object) {
-			Object parent = super.getParent(object);
-			return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		public Object[] getChildren(Object object) {
-			Object parent = super.getParent(object);
-			return (parent == null ? Collections.EMPTY_SET : Collections.singleton(parent)).toArray();
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		public boolean hasChildren(Object object) {
-			Object parent = super.getParent(object);
-			return parent != null;
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		public Object getParent(Object object) {
-			return null;
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setCurrentViewerPane(ViewerPane viewerPane) {
-		if (currentViewerPane != viewerPane) {
-			if (currentViewerPane != null) {
-				currentViewerPane.showFocus(false);
-			}
-			currentViewerPane = viewerPane;
-		}
-		setCurrentViewer(currentViewerPane.getViewer());
-	}
-
-	/**
-	 * This makes sure that one content viewer, either for the current page or the outline view, if it has focus,
-	 * is the current one.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setCurrentViewer(Viewer viewer) {
-		// If it is changing...
-		//
-		if (currentViewer != viewer) {
-			if (selectionChangedListener == null) {
-				// Create the listener on demand.
-				//
-				selectionChangedListener = new ISelectionChangedListener() {
-					// This just notifies those things that are affected by the section.
-					//
-					public void selectionChanged(SelectionChangedEvent selectionChangedEvent) {
-						setSelection(selectionChangedEvent.getSelection());
-					}
-				};
-			}
-
-			// Stop listening to the old one.
-			//
-			if (currentViewer != null) {
-				currentViewer.removeSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Start listening to the new one.
-			//
-			if (viewer != null) {
-				viewer.addSelectionChangedListener(selectionChangedListener);
-			}
-
-			// Remember it.
-			//
-			currentViewer = viewer;
-
-			// Set the editors selection based on the current viewer's selection.
-			//
-			setSelection(currentViewer == null ? StructuredSelection.EMPTY : currentViewer.getSelection());
-		}
-	}
-
-	/**
-	 * This returns the viewer as required by the {@link IViewerProvider} interface.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Viewer getViewer() {
-		return currentViewer;
-	}
-
-	/**
-	 * This creates a context menu for the viewer and adds a listener as well registering the menu for extension.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void createContextMenuFor(StructuredViewer viewer) {
-		MenuManager contextMenu = new MenuManager("#PopUp");
-		contextMenu.add(new Separator("additions"));
-		contextMenu.setRemoveAllWhenShown(true);
-		contextMenu.addMenuListener(this);
-		Menu menu = contextMenu.createContextMenu(viewer.getControl());
-		viewer.getControl().setMenu(menu);
-		getSite().registerContextMenu(contextMenu, new UnwrappingSelectionProvider(viewer));
-
-		int dndOperations = DND.DROP_COPY | DND.DROP_MOVE | DND.DROP_LINK;
-		Transfer[] transfers = new Transfer[] { LocalTransfer.getInstance() };
-		viewer.addDragSupport(dndOperations, transfers, new ViewerDragAdapter(viewer));
-		viewer.addDropSupport(dndOperations, transfers, new EditingDomainViewerDropAdapter(editingDomain, viewer));
-	}
-
-	/**
-	 * This is the method called to load a resource into the editing domain's resource set based on the editor's input.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createModel() {
-		URI resourceURI = EditUIUtil.getURI(getEditorInput());
-		Exception exception = null;
-		Resource resource = null;
-		try {
-			// Load the resource through the editing domain.
-			//
-			resource = editingDomain.getResourceSet().getResource(resourceURI, true);
-		} catch (Exception e) {
-			exception = e;
-			resource = editingDomain.getResourceSet().getResource(resourceURI, false);
-		}
-
-		Diagnostic diagnostic = analyzeResourceProblems(resource, exception);
-		if (diagnostic.getSeverity() != Diagnostic.OK) {
-			resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
-		}
-		editingDomain.getResourceSet().eAdapters().add(problemIndicationAdapter);
-	}
-
-	/**
-	 * Returns a diagnostic describing the errors and warnings listed in the resource
-	 * and the specified exception (if any).
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Diagnostic analyzeResourceProblems(Resource resource, Exception exception) {
-		if (!resource.getErrors().isEmpty() || !resource.getWarnings().isEmpty()) {
-			BasicDiagnostic basicDiagnostic = new BasicDiagnostic(Diagnostic.ERROR,
-				"org.eclipse.emf.emfstore.fuzzy.emf.editor", 0, getString("_UI_CreateModelError_message",
-					resource.getURI()), new Object[] { exception == null ? (Object) resource : exception });
-			basicDiagnostic.merge(EcoreUtil.computeDiagnostic(resource, true));
-			return basicDiagnostic;
-		} else if (exception != null) {
-			return new BasicDiagnostic(Diagnostic.ERROR, "org.eclipse.emf.emfstore.fuzzy.emf.editor", 0, getString(
-				"_UI_CreateModelError_message", resource.getURI()), new Object[] { exception });
-		} else {
-			return Diagnostic.OK_INSTANCE;
-		}
-	}
-
-	/**
-	 * This is the method used by the framework to install your own controls.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void createPages() {
-		// Creates the model from the editor input
-		//
-		createModel();
-
-		// Only creates the other pages if there is something that can be edited
-		//
-		if (!getEditingDomain().getResourceSet().getResources().isEmpty()) {
-			// Create a page for the selection tree view.
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						Tree tree = new Tree(composite, SWT.MULTI);
-						TreeViewer newTreeViewer = new TreeViewer(tree);
-						return newTreeViewer;
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-
-				selectionViewer = (TreeViewer) viewerPane.getViewer();
-				selectionViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-
-				selectionViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-				selectionViewer.setInput(editingDomain.getResourceSet());
-				selectionViewer.setSelection(
-					new StructuredSelection(editingDomain.getResourceSet().getResources().get(0)), true);
-				viewerPane.setTitle(editingDomain.getResourceSet());
-
-				new AdapterFactoryTreeEditor(selectionViewer.getTree(), adapterFactory);
-
-				createContextMenuFor(selectionViewer);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_SelectionPage_label"));
-			}
-
-			// Create a page for the parent tree view.
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						Tree tree = new Tree(composite, SWT.MULTI);
-						TreeViewer newTreeViewer = new TreeViewer(tree);
-						return newTreeViewer;
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-
-				parentViewer = (TreeViewer) viewerPane.getViewer();
-				parentViewer.setAutoExpandLevel(30);
-				parentViewer.setContentProvider(new ReverseAdapterFactoryContentProvider(adapterFactory));
-				parentViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-
-				createContextMenuFor(parentViewer);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_ParentPage_label"));
-			}
-
-			// This is the page for the list viewer
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						return new ListViewer(composite);
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-				listViewer = (ListViewer) viewerPane.getViewer();
-				listViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-				listViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-
-				createContextMenuFor(listViewer);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_ListPage_label"));
-			}
-
-			// This is the page for the tree viewer
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						return new TreeViewer(composite);
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-				treeViewer = (TreeViewer) viewerPane.getViewer();
-				treeViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-				treeViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-
-				new AdapterFactoryTreeEditor(treeViewer.getTree(), adapterFactory);
-
-				createContextMenuFor(treeViewer);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_TreePage_label"));
-			}
-
-			// This is the page for the table viewer.
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						return new TableViewer(composite);
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-				tableViewer = (TableViewer) viewerPane.getViewer();
-
-				Table table = tableViewer.getTable();
-				TableLayout layout = new TableLayout();
-				table.setLayout(layout);
-				table.setHeaderVisible(true);
-				table.setLinesVisible(true);
-
-				TableColumn objectColumn = new TableColumn(table, SWT.NONE);
-				layout.addColumnData(new ColumnWeightData(3, 100, true));
-				objectColumn.setText(getString("_UI_ObjectColumn_label"));
-				objectColumn.setResizable(true);
-
-				TableColumn selfColumn = new TableColumn(table, SWT.NONE);
-				layout.addColumnData(new ColumnWeightData(2, 100, true));
-				selfColumn.setText(getString("_UI_SelfColumn_label"));
-				selfColumn.setResizable(true);
-
-				tableViewer.setColumnProperties(new String[] { "a", "b" });
-				tableViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-				tableViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-
-				createContextMenuFor(tableViewer);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_TablePage_label"));
-			}
-
-			// This is the page for the table tree viewer.
-			//
-			{
-				ViewerPane viewerPane = new ViewerPane(getSite().getPage(), ConfigEditor.this) {
-					@Override
-					public Viewer createViewer(Composite composite) {
-						return new TreeViewer(composite);
-					}
-
-					@Override
-					public void requestActivation() {
-						super.requestActivation();
-						setCurrentViewerPane(this);
-					}
-				};
-				viewerPane.createControl(getContainer());
-
-				treeViewerWithColumns = (TreeViewer) viewerPane.getViewer();
-
-				Tree tree = treeViewerWithColumns.getTree();
-				tree.setLayoutData(new FillLayout());
-				tree.setHeaderVisible(true);
-				tree.setLinesVisible(true);
-
-				TreeColumn objectColumn = new TreeColumn(tree, SWT.NONE);
-				objectColumn.setText(getString("_UI_ObjectColumn_label"));
-				objectColumn.setResizable(true);
-				objectColumn.setWidth(250);
-
-				TreeColumn selfColumn = new TreeColumn(tree, SWT.NONE);
-				selfColumn.setText(getString("_UI_SelfColumn_label"));
-				selfColumn.setResizable(true);
-				selfColumn.setWidth(200);
-
-				treeViewerWithColumns.setColumnProperties(new String[] { "a", "b" });
-				treeViewerWithColumns.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-				treeViewerWithColumns.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-
-				createContextMenuFor(treeViewerWithColumns);
-				int pageIndex = addPage(viewerPane.getControl());
-				setPageText(pageIndex, getString("_UI_TreeWithColumnsPage_label"));
-			}
-
-			getSite().getShell().getDisplay().asyncExec(new Runnable() {
-				public void run() {
-					setActivePage(0);
-				}
-			});
-		}
-
-		// Ensures that this editor will only display the page's tab
-		// area if there are more than one page
-		//
-		getContainer().addControlListener(new ControlAdapter() {
-			boolean guard = false;
-
-			@Override
-			public void controlResized(ControlEvent event) {
-				if (!guard) {
-					guard = true;
-					hideTabs();
-					guard = false;
-				}
-			}
-		});
-
-		getSite().getShell().getDisplay().asyncExec(new Runnable() {
-			public void run() {
-				updateProblemIndication();
-			}
-		});
-	}
-
-	/**
-	 * If there is just one page in the multi-page editor part,
-	 * this hides the single tab at the bottom.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void hideTabs() {
-		if (getPageCount() <= 1) {
-			setPageText(0, "");
-			if (getContainer() instanceof CTabFolder) {
-				((CTabFolder) getContainer()).setTabHeight(1);
-				Point point = getContainer().getSize();
-				getContainer().setSize(point.x, point.y + 6);
-			}
-		}
-	}
-
-	/**
-	 * If there is more than one page in the multi-page editor part,
-	 * this shows the tabs at the bottom.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void showTabs() {
-		if (getPageCount() > 1) {
-			setPageText(0, getString("_UI_SelectionPage_label"));
-			if (getContainer() instanceof CTabFolder) {
-				((CTabFolder) getContainer()).setTabHeight(SWT.DEFAULT);
-				Point point = getContainer().getSize();
-				getContainer().setSize(point.x, point.y - 6);
-			}
-		}
-	}
-
-	/**
-	 * This is used to track the active viewer.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected void pageChange(int pageIndex) {
-		super.pageChange(pageIndex);
-
-		if (contentOutlinePage != null) {
-			handleContentOutlineSelection(contentOutlinePage.getSelection());
-		}
-	}
-
-	/**
-	 * This is how the framework determines which interfaces we implement.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@SuppressWarnings("rawtypes")
-	@Override
-	public Object getAdapter(Class key) {
-		if (key.equals(IContentOutlinePage.class)) {
-			return showOutlineView() ? getContentOutlinePage() : null;
-		} else if (key.equals(IPropertySheetPage.class)) {
-			return getPropertySheetPage();
-		} else if (key.equals(IGotoMarker.class)) {
-			return this;
-		} else {
-			return super.getAdapter(key);
-		}
-	}
-
-	/**
-	 * This accesses a cached version of the content outliner.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IContentOutlinePage getContentOutlinePage() {
-		if (contentOutlinePage == null) {
-			// The content outline is just a tree.
-			//
-			class MyContentOutlinePage extends ContentOutlinePage {
-				@Override
-				public void createControl(Composite parent) {
-					super.createControl(parent);
-					contentOutlineViewer = getTreeViewer();
-					contentOutlineViewer.addSelectionChangedListener(this);
-
-					// Set up the tree viewer.
-					//
-					contentOutlineViewer.setContentProvider(new AdapterFactoryContentProvider(adapterFactory));
-					contentOutlineViewer.setLabelProvider(new AdapterFactoryLabelProvider(adapterFactory));
-					contentOutlineViewer.setInput(editingDomain.getResourceSet());
-
-					// Make sure our popups work.
-					//
-					createContextMenuFor(contentOutlineViewer);
-
-					if (!editingDomain.getResourceSet().getResources().isEmpty()) {
-						// Select the root object in the view.
-						//
-						contentOutlineViewer.setSelection(new StructuredSelection(editingDomain.getResourceSet()
-							.getResources().get(0)), true);
-					}
-				}
-
-				@Override
-				public void makeContributions(IMenuManager menuManager, IToolBarManager toolBarManager,
-					IStatusLineManager statusLineManager) {
-					super.makeContributions(menuManager, toolBarManager, statusLineManager);
-					contentOutlineStatusLineManager = statusLineManager;
-				}
-
-				@Override
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					getActionBarContributor().shareGlobalActions(this, actionBars);
-				}
-			}
-
-			contentOutlinePage = new MyContentOutlinePage();
-
-			// Listen to selection so that we can handle it is a special way.
-			//
-			contentOutlinePage.addSelectionChangedListener(new ISelectionChangedListener() {
-				// This ensures that we handle selections correctly.
-				//
-				public void selectionChanged(SelectionChangedEvent event) {
-					handleContentOutlineSelection(event.getSelection());
-				}
-			});
-		}
-
-		return contentOutlinePage;
-	}
-
-	/**
-	 * This accesses a cached version of the property sheet.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IPropertySheetPage getPropertySheetPage() {
-		if (propertySheetPage == null) {
-			propertySheetPage = new ExtendedPropertySheetPage(editingDomain) {
-				@Override
-				public void setSelectionToViewer(List<?> selection) {
-					ConfigEditor.this.setSelectionToViewer(selection);
-					ConfigEditor.this.setFocus();
-				}
-
-				@Override
-				public void setActionBars(IActionBars actionBars) {
-					super.setActionBars(actionBars);
-					getActionBarContributor().shareGlobalActions(this, actionBars);
-				}
-			};
-			propertySheetPage.setPropertySourceProvider(new AdapterFactoryContentProvider(adapterFactory));
-		}
-
-		return propertySheetPage;
-	}
-
-	/**
-	 * This deals with how we want selection in the outliner to affect the other views.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void handleContentOutlineSelection(ISelection selection) {
-		if (currentViewerPane != null && !selection.isEmpty() && selection instanceof IStructuredSelection) {
-			Iterator<?> selectedElements = ((IStructuredSelection) selection).iterator();
-			if (selectedElements.hasNext()) {
-				// Get the first selected element.
-				//
-				Object selectedElement = selectedElements.next();
-
-				// If it's the selection viewer, then we want it to select the same selection as this selection.
-				//
-				if (currentViewerPane.getViewer() == selectionViewer) {
-					ArrayList<Object> selectionList = new ArrayList<Object>();
-					selectionList.add(selectedElement);
-					while (selectedElements.hasNext()) {
-						selectionList.add(selectedElements.next());
-					}
-
-					// Set the selection to the widget.
-					//
-					selectionViewer.setSelection(new StructuredSelection(selectionList));
-				} else {
-					// Set the input to the widget.
-					//
-					if (currentViewerPane.getViewer().getInput() != selectedElement) {
-						currentViewerPane.getViewer().setInput(selectedElement);
-						currentViewerPane.setTitle(selectedElement);
-					}
-				}
-			}
-		}
-	}
-
-	/**
-	 * This is for implementing {@link IEditorPart} and simply tests the command stack.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean isDirty() {
-		return ((BasicCommandStack) editingDomain.getCommandStack()).isSaveNeeded();
-	}
-
-	/**
-	 * This is for implementing {@link IEditorPart} and simply saves the model file.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void doSave(IProgressMonitor progressMonitor) {
-		// Save only resources that have actually changed.
-		//
-		final Map<Object, Object> saveOptions = new HashMap<Object, Object>();
-		saveOptions.put(Resource.OPTION_SAVE_ONLY_IF_CHANGED, Resource.OPTION_SAVE_ONLY_IF_CHANGED_MEMORY_BUFFER);
-
-		// Do the work within an operation because this is a long running activity that modifies the workbench.
-		//
-		WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-			// This is the method that gets invoked when the operation runs.
-			//
-			@Override
-			public void execute(IProgressMonitor monitor) {
-				// Save the resources to the file system.
-				//
-				boolean first = true;
-				for (Resource resource : editingDomain.getResourceSet().getResources()) {
-					if ((first || !resource.getContents().isEmpty() || isPersisted(resource))
-						&& !editingDomain.isReadOnly(resource)) {
-						try {
-							long timeStamp = resource.getTimeStamp();
-							resource.save(saveOptions);
-							if (resource.getTimeStamp() != timeStamp) {
-								savedResources.add(resource);
-							}
-						} catch (Exception exception) {
-							resourceToDiagnosticMap.put(resource, analyzeResourceProblems(resource, exception));
-						}
-						first = false;
-					}
-				}
-			}
-		};
-
-		updateProblemIndication = false;
-		try {
-			// This runs the options, and shows progress.
-			//
-			new ProgressMonitorDialog(getSite().getShell()).run(true, false, operation);
-
-			// Refresh the necessary state.
-			//
-			((BasicCommandStack) editingDomain.getCommandStack()).saveIsDone();
-			firePropertyChange(IEditorPart.PROP_DIRTY);
-		} catch (Exception exception) {
-			// Something went wrong that shouldn't.
-			//
-			ConfigEditorPlugin.INSTANCE.log(exception);
-		}
-		updateProblemIndication = true;
-		updateProblemIndication();
-	}
-
-	/**
-	 * This returns whether something has been persisted to the URI of the specified resource.
-	 * The implementation uses the URI converter from the editor's resource set to try to open an input stream.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected boolean isPersisted(Resource resource) {
-		boolean result = false;
-		try {
-			InputStream stream = editingDomain.getResourceSet().getURIConverter().createInputStream(resource.getURI());
-			if (stream != null) {
-				result = true;
-				stream.close();
-			}
-		} catch (IOException e) {
-			// Ignore
-		}
-		return result;
-	}
-
-	/**
-	 * This always returns true because it is not currently supported.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean isSaveAsAllowed() {
-		return true;
-	}
-
-	/**
-	 * This also changes the editor's input.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void doSaveAs() {
-		SaveAsDialog saveAsDialog = new SaveAsDialog(getSite().getShell());
-		saveAsDialog.open();
-		IPath path = saveAsDialog.getResult();
-		if (path != null) {
-			IFile file = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
-			if (file != null) {
-				doSaveAs(URI.createPlatformResourceURI(file.getFullPath().toString(), true), new FileEditorInput(file));
-			}
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected void doSaveAs(URI uri, IEditorInput editorInput) {
-		(editingDomain.getResourceSet().getResources().get(0)).setURI(uri);
-		setInputWithNotify(editorInput);
-		setPartName(editorInput.getName());
-		IProgressMonitor progressMonitor = getActionBars().getStatusLineManager() != null ? getActionBars()
-			.getStatusLineManager().getProgressMonitor() : new NullProgressMonitor();
-		doSave(progressMonitor);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void gotoMarker(IMarker marker) {
-		try {
-			if (marker.getType().equals(EValidator.MARKER)) {
-				String uriAttribute = marker.getAttribute(EValidator.URI_ATTRIBUTE, null);
-				if (uriAttribute != null) {
-					URI uri = URI.createURI(uriAttribute);
-					EObject eObject = editingDomain.getResourceSet().getEObject(uri, true);
-					if (eObject != null) {
-						setSelectionToViewer(Collections.singleton(editingDomain.getWrapper(eObject)));
-					}
-				}
-			}
-		} catch (CoreException exception) {
-			ConfigEditorPlugin.INSTANCE.log(exception);
-		}
-	}
-
-	/**
-	 * This is called during startup.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void init(IEditorSite site, IEditorInput editorInput) {
-		setSite(site);
-		setInputWithNotify(editorInput);
-		setPartName(editorInput.getName());
-		site.setSelectionProvider(this);
-		site.getPage().addPartListener(partListener);
-		ResourcesPlugin.getWorkspace().addResourceChangeListener(resourceChangeListener,
-			IResourceChangeEvent.POST_CHANGE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void setFocus() {
-		if (currentViewerPane != null) {
-			currentViewerPane.setFocus();
-		} else {
-			getControl(getActivePage()).setFocus();
-		}
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void addSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.add(listener);
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider}.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void removeSelectionChangedListener(ISelectionChangedListener listener) {
-		selectionChangedListeners.remove(listener);
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to return this editor's overall selection.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ISelection getSelection() {
-		return editorSelection;
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.viewers.ISelectionProvider} to set this editor's overall selection.
-	 * Calling this result will notify the listeners.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSelection(ISelection selection) {
-		editorSelection = selection;
-
-		for (ISelectionChangedListener listener : selectionChangedListeners) {
-			listener.selectionChanged(new SelectionChangedEvent(this, selection));
-		}
-		setStatusLineManager(selection);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setStatusLineManager(ISelection selection) {
-		IStatusLineManager statusLineManager = currentViewer != null && currentViewer == contentOutlineViewer ? contentOutlineStatusLineManager
-			: getActionBars().getStatusLineManager();
-
-		if (statusLineManager != null) {
-			if (selection instanceof IStructuredSelection) {
-				Collection<?> collection = ((IStructuredSelection) selection).toList();
-				switch (collection.size()) {
-				case 0: {
-					statusLineManager.setMessage(getString("_UI_NoObjectSelected"));
-					break;
-				}
-				case 1: {
-					String text = new AdapterFactoryItemDelegator(adapterFactory).getText(collection.iterator().next());
-					statusLineManager.setMessage(getString("_UI_SingleObjectSelected", text));
-					break;
-				}
-				default: {
-					statusLineManager.setMessage(getString("_UI_MultiObjectSelected",
-						Integer.toString(collection.size())));
-					break;
-				}
-				}
-			} else {
-				statusLineManager.setMessage("");
-			}
-		}
-	}
-
-	/**
-	 * This looks up a string in the plugin's plugin.properties file.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static String getString(String key) {
-		return ConfigEditorPlugin.INSTANCE.getString(key);
-	}
-
-	/**
-	 * This looks up a string in plugin.properties, making a substitution.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static String getString(String key, Object s1) {
-		return ConfigEditorPlugin.INSTANCE.getString(key, new Object[] { s1 });
-	}
-
-	/**
-	 * This implements {@link org.eclipse.jface.action.IMenuListener} to help fill the context menus with contributions
-	 * from the Edit menu.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void menuAboutToShow(IMenuManager menuManager) {
-		((IMenuListener) getEditorSite().getActionBarContributor()).menuAboutToShow(menuManager);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EditingDomainActionBarContributor getActionBarContributor() {
-		return (EditingDomainActionBarContributor) getEditorSite().getActionBarContributor();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IActionBars getActionBars() {
-		return getActionBarContributor().getActionBars();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public AdapterFactory getAdapterFactory() {
-		return adapterFactory;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void dispose() {
-		updateProblemIndication = false;
-
-		ResourcesPlugin.getWorkspace().removeResourceChangeListener(resourceChangeListener);
-
-		getSite().getPage().removePartListener(partListener);
-
-		adapterFactory.dispose();
-
-		if (getActionBarContributor().getActiveEditor() == this) {
-			getActionBarContributor().setActiveEditor(null);
-		}
-
-		if (propertySheetPage != null) {
-			propertySheetPage.dispose();
-		}
-
-		if (contentOutlinePage != null) {
-			contentOutlinePage.dispose();
-		}
-
-		super.dispose();
-	}
-
-	/**
-	 * Returns whether the outline view should be presented to the user.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected boolean showOutlineView() {
-		return true;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditorPlugin.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditorPlugin.java
deleted file mode 100644
index 9651194..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigEditorPlugin.java
+++ /dev/null
@@ -1,105 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.presentation;
-
-import org.eclipse.emf.common.EMFPlugin;
-
-import org.eclipse.emf.common.ui.EclipseUIPlugin;
-
-import org.eclipse.emf.common.util.ResourceLocator;
-
-/**
- * This is the central singleton for the Config editor plugin.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public final class ConfigEditorPlugin extends EMFPlugin {
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static final ConfigEditorPlugin INSTANCE = new ConfigEditorPlugin();
-
-	/**
-	 * Keep track of the singleton.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static Implementation plugin;
-
-	/**
-	 * Create the instance.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigEditorPlugin() {
-		super(new ResourceLocator[] {});
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	@Override
-	public ResourceLocator getPluginResourceLocator() {
-		return plugin;
-	}
-
-	/**
-	 * Returns the singleton instance of the Eclipse plugin.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the singleton instance.
-	 * @generated
-	 */
-	public static Implementation getPlugin() {
-		return plugin;
-	}
-
-	/**
-	 * The actual implementation of the Eclipse <b>Plugin</b>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static class Implementation extends EclipseUIPlugin {
-		/**
-		 * Creates an instance.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public Implementation() {
-			super();
-
-			// Remember the static instance.
-			//
-			plugin = this;
-		}
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigModelWizard.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigModelWizard.java
deleted file mode 100644
index 1793d4e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.editor/src/org/eclipse/emf/emfstore/fuzzy/emf/config/presentation/ConfigModelWizard.java
+++ /dev/null
@@ -1,662 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.presentation;
-
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.MissingResourceException;
-import java.util.StringTokenizer;
-
-import org.eclipse.emf.common.CommonPlugin;
-
-import org.eclipse.emf.common.util.URI;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EClassifier;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.resource.ResourceSet;
-
-import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
-
-import org.eclipse.emf.ecore.EObject;
-
-import org.eclipse.emf.ecore.xmi.XMLResource;
-
-import org.eclipse.emf.edit.ui.provider.ExtendedImageRegistry;
-
-import org.eclipse.core.resources.IContainer;
-import org.eclipse.core.resources.IFile;
-import org.eclipse.core.resources.IFolder;
-import org.eclipse.core.resources.IProject;
-import org.eclipse.core.resources.IResource;
-import org.eclipse.core.resources.ResourcesPlugin;
-
-import org.eclipse.core.runtime.IProgressMonitor;
-
-import org.eclipse.jface.dialogs.MessageDialog;
-
-import org.eclipse.jface.viewers.IStructuredSelection;
-
-import org.eclipse.jface.wizard.Wizard;
-import org.eclipse.jface.wizard.WizardPage;
-
-import org.eclipse.swt.SWT;
-
-import org.eclipse.swt.events.ModifyListener;
-import org.eclipse.swt.events.ModifyEvent;
-
-import org.eclipse.swt.layout.GridData;
-import org.eclipse.swt.layout.GridLayout;
-
-import org.eclipse.swt.widgets.Combo;
-import org.eclipse.swt.widgets.Composite;
-import org.eclipse.swt.widgets.Label;
-
-import org.eclipse.ui.INewWizard;
-import org.eclipse.ui.IWorkbench;
-
-import org.eclipse.ui.actions.WorkspaceModifyOperation;
-
-import org.eclipse.ui.dialogs.WizardNewFileCreationPage;
-
-import org.eclipse.ui.part.FileEditorInput;
-import org.eclipse.ui.part.ISetSelectionTarget;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.provider.ConfigEditPlugin;
-
-import org.eclipse.core.runtime.Path;
-
-import org.eclipse.jface.viewers.ISelection;
-import org.eclipse.jface.viewers.StructuredSelection;
-
-import org.eclipse.ui.IWorkbenchPage;
-import org.eclipse.ui.IWorkbenchPart;
-import org.eclipse.ui.IWorkbenchWindow;
-import org.eclipse.ui.PartInitException;
-
-/**
- * This is a simple wizard for creating a new model file.
- * <!-- begin-user-doc -->
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigModelWizard extends Wizard implements INewWizard {
-	/**
-	 * The supported extensions for created files.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static final List<String> FILE_EXTENSIONS = Collections.unmodifiableList(Arrays
-		.asList(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigEditorFilenameExtensions").split("\\s*,\\s*")));
-
-	/**
-	 * A formatted list of supported file extensions, suitable for display.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static final String FORMATTED_FILE_EXTENSIONS = ConfigEditorPlugin.INSTANCE.getString(
-		"_UI_ConfigEditorFilenameExtensions").replaceAll("\\s*,\\s*", ", ");
-
-	/**
-	 * This caches an instance of the model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ConfigPackage configPackage = ConfigPackage.eINSTANCE;
-
-	/**
-	 * This caches an instance of the model factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ConfigFactory configFactory = configPackage.getConfigFactory();
-
-	/**
-	 * This is the file creation page.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ConfigModelWizardNewFileCreationPage newFileCreationPage;
-
-	/**
-	 * This is the initial object creation page.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ConfigModelWizardInitialObjectCreationPage initialObjectCreationPage;
-
-	/**
-	 * Remember the selection during initialization for populating the default container.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IStructuredSelection selection;
-
-	/**
-	 * Remember the workbench during initialization.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected IWorkbench workbench;
-
-	/**
-	 * Caches the names of the types that can be created as the root object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected List<String> initialObjectNames;
-
-	/**
-	 * This just records the information.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void init(IWorkbench workbench, IStructuredSelection selection) {
-		this.workbench = workbench;
-		this.selection = selection;
-		setWindowTitle(ConfigEditorPlugin.INSTANCE.getString("_UI_Wizard_label"));
-		setDefaultPageImageDescriptor(ExtendedImageRegistry.INSTANCE.getImageDescriptor(ConfigEditorPlugin.INSTANCE
-			.getImage("full/wizban/NewConfig")));
-	}
-
-	/**
-	 * Returns the names of the types that can be created as the root object.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected Collection<String> getInitialObjectNames() {
-		if (initialObjectNames == null) {
-			initialObjectNames = new ArrayList<String>();
-			for (EClassifier eClassifier : configPackage.getEClassifiers()) {
-				if (eClassifier instanceof EClass) {
-					EClass eClass = (EClass) eClassifier;
-					if (!eClass.isAbstract()) {
-						initialObjectNames.add(eClass.getName());
-					}
-				}
-			}
-			Collections.sort(initialObjectNames, CommonPlugin.INSTANCE.getComparator());
-		}
-		return initialObjectNames;
-	}
-
-	/**
-	 * Create a new model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected EObject createInitialModel() {
-		EClass eClass = (EClass) configPackage.getEClassifier(initialObjectCreationPage.getInitialObjectName());
-		EObject rootObject = configFactory.create(eClass);
-		return rootObject;
-	}
-
-	/**
-	 * Do the work after everything is specified.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean performFinish() {
-		try {
-			// Remember the file.
-			//
-			final IFile modelFile = getModelFile();
-
-			// Do the work within an operation.
-			//
-			WorkspaceModifyOperation operation = new WorkspaceModifyOperation() {
-				@Override
-				protected void execute(IProgressMonitor progressMonitor) {
-					try {
-						// Create a resource set
-						//
-						ResourceSet resourceSet = new ResourceSetImpl();
-
-						// Get the URI of the model file.
-						//
-						URI fileURI = URI.createPlatformResourceURI(modelFile.getFullPath().toString(), true);
-
-						// Create a resource for this file.
-						//
-						Resource resource = resourceSet.createResource(fileURI);
-
-						// Add the initial model object to the contents.
-						//
-						EObject rootObject = createInitialModel();
-						if (rootObject != null) {
-							resource.getContents().add(rootObject);
-						}
-
-						// Save the contents of the resource to the file system.
-						//
-						Map<Object, Object> options = new HashMap<Object, Object>();
-						options.put(XMLResource.OPTION_ENCODING, initialObjectCreationPage.getEncoding());
-						resource.save(options);
-					} catch (Exception exception) {
-						ConfigEditorPlugin.INSTANCE.log(exception);
-					} finally {
-						progressMonitor.done();
-					}
-				}
-			};
-
-			getContainer().run(false, false, operation);
-
-			// Select the new file resource in the current view.
-			//
-			IWorkbenchWindow workbenchWindow = workbench.getActiveWorkbenchWindow();
-			IWorkbenchPage page = workbenchWindow.getActivePage();
-			final IWorkbenchPart activePart = page.getActivePart();
-			if (activePart instanceof ISetSelectionTarget) {
-				final ISelection targetSelection = new StructuredSelection(modelFile);
-				getShell().getDisplay().asyncExec(new Runnable() {
-					public void run() {
-						((ISetSelectionTarget) activePart).selectReveal(targetSelection);
-					}
-				});
-			}
-
-			// Open an editor on the new file.
-			//
-			try {
-				page.openEditor(new FileEditorInput(modelFile),
-					workbench.getEditorRegistry().getDefaultEditor(modelFile.getFullPath().toString()).getId());
-			} catch (PartInitException exception) {
-				MessageDialog.openError(workbenchWindow.getShell(),
-					ConfigEditorPlugin.INSTANCE.getString("_UI_OpenEditorError_label"), exception.getMessage());
-				return false;
-			}
-
-			return true;
-		} catch (Exception exception) {
-			ConfigEditorPlugin.INSTANCE.log(exception);
-			return false;
-		}
-	}
-
-	/**
-	 * This is the one page of the wizard.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public class ConfigModelWizardNewFileCreationPage extends WizardNewFileCreationPage {
-		/**
-		 * Pass in the selection.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public ConfigModelWizardNewFileCreationPage(String pageId, IStructuredSelection selection) {
-			super(pageId, selection);
-		}
-
-		/**
-		 * The framework calls this to see if the file is correct.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		protected boolean validatePage() {
-			if (super.validatePage()) {
-				String extension = new Path(getFileName()).getFileExtension();
-				if (extension == null || !FILE_EXTENSIONS.contains(extension)) {
-					String key = FILE_EXTENSIONS.size() > 1 ? "_WARN_FilenameExtensions" : "_WARN_FilenameExtension";
-					setErrorMessage(ConfigEditorPlugin.INSTANCE.getString(key,
-						new Object[] { FORMATTED_FILE_EXTENSIONS }));
-					return false;
-				}
-				return true;
-			}
-			return false;
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public IFile getModelFile() {
-			return ResourcesPlugin.getWorkspace().getRoot().getFile(getContainerFullPath().append(getFileName()));
-		}
-	}
-
-	/**
-	 * This is the page where the type of object to create is selected.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public class ConfigModelWizardInitialObjectCreationPage extends WizardPage {
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected Combo initialObjectField;
-
-		/**
-		 * @generated
-		 *            <!-- begin-user-doc -->
-		 *            <!-- end-user-doc -->
-		 */
-		protected List<String> encodings;
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected Combo encodingField;
-
-		/**
-		 * Pass in the selection.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public ConfigModelWizardInitialObjectCreationPage(String pageId) {
-			super(pageId);
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public void createControl(Composite parent) {
-			Composite composite = new Composite(parent, SWT.NONE);
-			{
-				GridLayout layout = new GridLayout();
-				layout.numColumns = 1;
-				layout.verticalSpacing = 12;
-				composite.setLayout(layout);
-
-				GridData data = new GridData();
-				data.verticalAlignment = GridData.FILL;
-				data.grabExcessVerticalSpace = true;
-				data.horizontalAlignment = GridData.FILL;
-				composite.setLayoutData(data);
-			}
-
-			Label containerLabel = new Label(composite, SWT.LEFT);
-			{
-				containerLabel.setText(ConfigEditorPlugin.INSTANCE.getString("_UI_ModelObject"));
-
-				GridData data = new GridData();
-				data.horizontalAlignment = GridData.FILL;
-				containerLabel.setLayoutData(data);
-			}
-
-			initialObjectField = new Combo(composite, SWT.BORDER);
-			{
-				GridData data = new GridData();
-				data.horizontalAlignment = GridData.FILL;
-				data.grabExcessHorizontalSpace = true;
-				initialObjectField.setLayoutData(data);
-			}
-
-			for (String objectName : getInitialObjectNames()) {
-				initialObjectField.add(getLabel(objectName));
-			}
-
-			if (initialObjectField.getItemCount() == 1) {
-				initialObjectField.select(0);
-			}
-			initialObjectField.addModifyListener(validator);
-
-			Label encodingLabel = new Label(composite, SWT.LEFT);
-			{
-				encodingLabel.setText(ConfigEditorPlugin.INSTANCE.getString("_UI_XMLEncoding"));
-
-				GridData data = new GridData();
-				data.horizontalAlignment = GridData.FILL;
-				encodingLabel.setLayoutData(data);
-			}
-			encodingField = new Combo(composite, SWT.BORDER);
-			{
-				GridData data = new GridData();
-				data.horizontalAlignment = GridData.FILL;
-				data.grabExcessHorizontalSpace = true;
-				encodingField.setLayoutData(data);
-			}
-
-			for (String encoding : getEncodings()) {
-				encodingField.add(encoding);
-			}
-
-			encodingField.select(0);
-			encodingField.addModifyListener(validator);
-
-			setPageComplete(validatePage());
-			setControl(composite);
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected ModifyListener validator = new ModifyListener() {
-			public void modifyText(ModifyEvent e) {
-				setPageComplete(validatePage());
-			}
-		};
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected boolean validatePage() {
-			return getInitialObjectName() != null && getEncodings().contains(encodingField.getText());
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		@Override
-		public void setVisible(boolean visible) {
-			super.setVisible(visible);
-			if (visible) {
-				if (initialObjectField.getItemCount() == 1) {
-					initialObjectField.clearSelection();
-					encodingField.setFocus();
-				} else {
-					encodingField.clearSelection();
-					initialObjectField.setFocus();
-				}
-			}
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public String getInitialObjectName() {
-			String label = initialObjectField.getText();
-
-			for (String name : getInitialObjectNames()) {
-				if (getLabel(name).equals(label)) {
-					return name;
-				}
-			}
-			return null;
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		public String getEncoding() {
-			return encodingField.getText();
-		}
-
-		/**
-		 * Returns the label for the specified type name.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected String getLabel(String typeName) {
-			try {
-				return ConfigEditPlugin.INSTANCE.getString("_UI_" + typeName + "_type");
-			} catch (MissingResourceException mre) {
-				ConfigEditorPlugin.INSTANCE.log(mre);
-			}
-			return typeName;
-		}
-
-		/**
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		protected Collection<String> getEncodings() {
-			if (encodings == null) {
-				encodings = new ArrayList<String>();
-				for (StringTokenizer stringTokenizer = new StringTokenizer(
-					ConfigEditorPlugin.INSTANCE.getString("_UI_XMLEncodingChoices")); stringTokenizer.hasMoreTokens();) {
-					encodings.add(stringTokenizer.nextToken());
-				}
-			}
-			return encodings;
-		}
-	}
-
-	/**
-	 * The framework calls this to create the contents of the wizard.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void addPages() {
-		// Create a page, set the title, and the initial model file name.
-		//
-		newFileCreationPage = new ConfigModelWizardNewFileCreationPage("Whatever", selection);
-		newFileCreationPage.setTitle(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigModelWizard_label"));
-		newFileCreationPage.setDescription(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigModelWizard_description"));
-		newFileCreationPage.setFileName(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigEditorFilenameDefaultBase")
-			+ "." + FILE_EXTENSIONS.get(0));
-		addPage(newFileCreationPage);
-
-		// Try and get the resource selection to determine a current directory for the file dialog.
-		//
-		if (selection != null && !selection.isEmpty()) {
-			// Get the resource...
-			//
-			Object selectedElement = selection.iterator().next();
-			if (selectedElement instanceof IResource) {
-				// Get the resource parent, if its a file.
-				//
-				IResource selectedResource = (IResource) selectedElement;
-				if (selectedResource.getType() == IResource.FILE) {
-					selectedResource = selectedResource.getParent();
-				}
-
-				// This gives us a directory...
-				//
-				if (selectedResource instanceof IFolder || selectedResource instanceof IProject) {
-					// Set this for the container.
-					//
-					newFileCreationPage.setContainerFullPath(selectedResource.getFullPath());
-
-					// Make up a unique new name here.
-					//
-					String defaultModelBaseFilename = ConfigEditorPlugin.INSTANCE
-						.getString("_UI_ConfigEditorFilenameDefaultBase");
-					String defaultModelFilenameExtension = FILE_EXTENSIONS.get(0);
-					String modelFilename = defaultModelBaseFilename + "." + defaultModelFilenameExtension;
-					for (int i = 1; ((IContainer) selectedResource).findMember(modelFilename) != null; ++i) {
-						modelFilename = defaultModelBaseFilename + i + "." + defaultModelFilenameExtension;
-					}
-					newFileCreationPage.setFileName(modelFilename);
-				}
-			}
-		}
-		initialObjectCreationPage = new ConfigModelWizardInitialObjectCreationPage("Whatever2");
-		initialObjectCreationPage.setTitle(ConfigEditorPlugin.INSTANCE.getString("_UI_ConfigModelWizard_label"));
-		initialObjectCreationPage.setDescription(ConfigEditorPlugin.INSTANCE
-			.getString("_UI_Wizard_initial_object_description"));
-		addPage(initialObjectCreationPage);
-	}
-
-	/**
-	 * Get the file from the page.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public IFile getModelFile() {
-		return newFileCreationPage.getModelFile();
-	}
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.project
deleted file mode 100644
index 5e3bbd6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy.emf.example</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/META-INF/MANIFEST.MF
deleted file mode 100644
index 82702a4..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,8 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Example Plugin for the Fuzzy EMF Testing (Incubation)
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy.emf.example
-Bundle-Version: 0.9.3.qualifier
-Bundle-Vendor: Eclipse Modeling Project
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Require-Bundle: org.eclipse.emf.emfstore.fuzzy.emf;visibility:=reexport
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/build.properties
deleted file mode 100644
index 66e05e6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/build.properties
+++ /dev/null
@@ -1,5 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               fuzzy/
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzy.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzy.properties
deleted file mode 100644
index 6d9398c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzy.properties
+++ /dev/null
@@ -1,4 +0,0 @@
-fuzzy.emfdataprovider.configsFile=fuzzy/fuzzyConfig.fuzzy
-fuzzy.hudson.url=http://localhost
-fuzzy.hudson.port=8080
-fuzzy.hudson.job=Explorer
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzyConfig.fuzzy b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzyConfig.fuzzy
deleted file mode 100644
index 665d9e3..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/fuzzy/fuzzyConfig.fuzzy
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:org.eclipse.emf.emfstore.fuzzy.emf.config="http://org/eclipse/emf/emfstore/fuzzy/emf/config">
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="500" testClass="org.eclipse.emf.emfstore.fuzzy.emf.example.FuzzyTest" id="_r78GhIvSEeGC3oFJZ-5HoM">
-    <mutatorConfig>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-</xmi:XMI>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/pom.xml
deleted file mode 100644
index 816e33e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy.emf.example</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/src/org/eclipse/emf/emfstore/fuzzy/emf/example/FuzzyTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/src/org/eclipse/emf/emfstore/fuzzy/emf/example/FuzzyTest.java
deleted file mode 100644
index 02c58f0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.example/src/org/eclipse/emf/emfstore/fuzzy/emf/example/FuzzyTest.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.example;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Example test for the {@link FuzzyRunner}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class FuzzyTest {
-
-	@Data
-	private EObject root;
-
-	/**
-	 * Test to check if the {@link FuzzyRunner} is working.
-	 */
-	@Test
-	public void test() {
-		Assert.assertNotNull(root);
-	}
-}
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.classpath
deleted file mode 100644
index 64c5e31..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?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/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.project
deleted file mode 100644
index 4380e7e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy.emf.test</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTests.launch b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTests.launch
deleted file mode 100644
index 18d8def..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTests.launch
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="append.args" value="true"/>
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<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="false"/>
-<stringAttribute key="deselected_workspace_plugins" value="org.apache.commons.io,org.eclipse.emf.emfstore.branding,org.eclipse.emf.emfstore.client.test.edit,org.eclipse.emf.emfstore.client.ui,org.eclipse.emf.emfstore.ecore,org.eclipse.emf.emfstore.example.helloworld,org.eclipse.emf.emfstore.examplemodel,org.eclipse.emf.emfstore.examplemodel.edit,org.eclipse.emf.emfstore.fuzzy.emf.edit,org.eclipse.emf.emfstore.fuzzy.emf.editor,org.eclipse.emf.emfstore.fuzzy.emf.example,org.eclipse.emf.emfstore.perspective"/>
-<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.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/AllFuzzyTests.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.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.emfstore.fuzzy.emf.test.AllFuzzyTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.emfstore.fuzzy.emf.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="-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<booleanAttribute key="run_in_ui_thread" value="true"/>
-<stringAttribute key="selected_target_plugins" value="com.ibm.icu@default:default,org.apache.commons.codec@default:default,org.apache.commons.logging@default:default,org.eclipse.ant.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.emf.common.ui@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit.ui@default:default,org.eclipse.emf.edit@default:default,org.eclipse.emf.transaction@default:default,org.eclipse.emf.validation@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.win32.win32.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.text@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit4@default:default,org.junit@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="org.eclipse.emf.emfstore.client.model.edit@default:default,org.eclipse.emf.emfstore.client.test@default:default,org.eclipse.emf.emfstore.client.transaction@default:default,org.eclipse.emf.emfstore.client@default:default,org.eclipse.emf.emfstore.common.model.edit@default:default,org.eclipse.emf.emfstore.common.model@default:default,org.eclipse.emf.emfstore.common@default:default,org.eclipse.emf.emfstore.fuzzy.emf.test@default:default,org.eclipse.emf.emfstore.fuzzy.emf@default:default,org.eclipse.emf.emfstore.fuzzy@default:default,org.eclipse.emf.emfstore.migration@default:default,org.eclipse.emf.emfstore.modelmutator@default:default,org.eclipse.emf.emfstore.server.model.edit@default:default,org.eclipse.emf.emfstore.server.model@default:default,org.eclipse.emf.emfstore.server@default:default"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<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/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTestsFiltered.launch b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTestsFiltered.launch
deleted file mode 100644
index 8ce58c3..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/AllFuzzyTestsFiltered.launch
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="append.args" value="true"/>
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<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="false"/>
-<stringAttribute key="deselected_workspace_plugins" value="org.apache.commons.io,org.eclipse.emf.emfstore.branding,org.eclipse.emf.emfstore.client.test.edit,org.eclipse.emf.emfstore.client.ui,org.eclipse.emf.emfstore.ecore,org.eclipse.emf.emfstore.example.helloworld,org.eclipse.emf.emfstore.examplemodel,org.eclipse.emf.emfstore.examplemodel.edit,org.eclipse.emf.emfstore.fuzzy.emf.edit,org.eclipse.emf.emfstore.fuzzy.emf.editor,org.eclipse.emf.emfstore.fuzzy.emf.example,org.eclipse.emf.emfstore.perspective"/>
-<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.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/AllFuzzyTests.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.JRE_CONTAINER" value="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-<stringAttribute key="org.eclipse.jdt.launching.MAIN_TYPE" value="org.eclipse.emf.emfstore.fuzzy.emf.test.AllFuzzyTests"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.emfstore.fuzzy.emf.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="-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -DfilterTests=true"/>
-<stringAttribute key="pde.version" value="3.3"/>
-<stringAttribute key="product" value="org.eclipse.platform.ide"/>
-<booleanAttribute key="run_in_ui_thread" value="true"/>
-<stringAttribute key="selected_target_plugins" value="com.ibm.icu@default:default,org.apache.commons.codec@default:default,org.apache.commons.logging@default:default,org.eclipse.ant.core@default:default,org.eclipse.core.commands@default:default,org.eclipse.core.contenttype@default:default,org.eclipse.core.databinding.observable@default:default,org.eclipse.core.databinding.property@default:default,org.eclipse.core.databinding@default:default,org.eclipse.core.expressions@default:default,org.eclipse.core.filesystem@default:default,org.eclipse.core.jobs@default:default,org.eclipse.core.resources@default:default,org.eclipse.core.runtime.compatibility.auth@default:default,org.eclipse.core.runtime.compatibility.registry@default:false,org.eclipse.core.runtime@default:true,org.eclipse.core.variables@default:default,org.eclipse.emf.common.ui@default:default,org.eclipse.emf.common@default:default,org.eclipse.emf.ecore.change@default:default,org.eclipse.emf.ecore.edit@default:default,org.eclipse.emf.ecore.xmi@default:default,org.eclipse.emf.ecore@default:default,org.eclipse.emf.edit.ui@default:default,org.eclipse.emf.edit@default:default,org.eclipse.emf.transaction@default:default,org.eclipse.emf.validation@default:default,org.eclipse.equinox.app@default:default,org.eclipse.equinox.common@2:true,org.eclipse.equinox.p2.core@default:default,org.eclipse.equinox.p2.engine@default:default,org.eclipse.equinox.p2.metadata@default:default,org.eclipse.equinox.preferences@default:default,org.eclipse.equinox.registry@default:default,org.eclipse.help@default:default,org.eclipse.jface.databinding@default:default,org.eclipse.jface.text@default:default,org.eclipse.jface@default:default,org.eclipse.osgi@-1:true,org.eclipse.swt.win32.win32.x86_64@default:false,org.eclipse.swt@default:default,org.eclipse.text@default:default,org.eclipse.ui.forms@default:default,org.eclipse.ui.ide@default:default,org.eclipse.ui.views@default:default,org.eclipse.ui.workbench@default:default,org.eclipse.ui@default:default,org.hamcrest.core@default:default,org.junit4@default:default,org.junit@default:default"/>
-<stringAttribute key="selected_workspace_plugins" value="org.eclipse.emf.emfstore.client.model.edit@default:default,org.eclipse.emf.emfstore.client.test@default:default,org.eclipse.emf.emfstore.client.transaction@default:default,org.eclipse.emf.emfstore.client@default:default,org.eclipse.emf.emfstore.common.model.edit@default:default,org.eclipse.emf.emfstore.common.model@default:default,org.eclipse.emf.emfstore.common@default:default,org.eclipse.emf.emfstore.fuzzy.emf.test@default:default,org.eclipse.emf.emfstore.fuzzy.emf@default:default,org.eclipse.emf.emfstore.fuzzy@default:default,org.eclipse.emf.emfstore.migration@default:default,org.eclipse.emf.emfstore.modelmutator@default:default,org.eclipse.emf.emfstore.server.model.edit@default:default,org.eclipse.emf.emfstore.server.model@default:default,org.eclipse.emf.emfstore.server@default:default"/>
-<booleanAttribute key="show_selected_only" value="false"/>
-<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/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/META-INF/MANIFEST.MF
deleted file mode 100644
index 402bbcd..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,10 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Tests for EMFDataprovider (Incubation)
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy.emf.test;singleton:=true
-Bundle-Version: 0.9.3.qualifier
-Require-Bundle: org.eclipse.emf.emfstore.fuzzy.emf;visibility:=reexport,
- org.eclipse.emf.emfstore.client.test;visibility:=reexport
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ClassPath: .
-Bundle-Vendor: Eclipse Modeling Project
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/build.properties
deleted file mode 100644
index 86473f1..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/build.properties
+++ /dev/null
@@ -1,7 +0,0 @@
-source.. = src/
-output.. = bin/
-bin.includes = META-INF/,\
-               .,\
-               plugin.xml,\
-               fuzzy/
-jars.compile.order = .
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzy.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzy.properties
deleted file mode 100644
index c8e74a8..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzy.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#fuzzy.emfdataprovider.configsFile=fuzzy/fuzzyConfig.xml
-fuzzy.hudson.url=https://hudson.eclipse.org/hudson
-#fuzzy.hudson.port=8080
-fuzzy.hudson.job=emf-emfstore-fuzzytests-explorer
-fuzzy.hudson.diffjob=emf-emfstore-fuzzytests-differ
-fuzzy.hudson.artifact.folder=/artifact/git/org.eclipse.emf.emfstore.other/
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzyConfig.fuzzy b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzyConfig.fuzzy
deleted file mode 100644
index 0d9218f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/fuzzy/fuzzyConfig.fuzzy
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="ASCII"?>
-<xmi:XMI xmi:version="2.0" xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" xmlns:org.eclipse.emf.emfstore.fuzzy.emf.config="http://org/eclipse/emf/emfstore/fuzzy/emf/config">
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="10" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.OperationApplyTest" id="_sLQasYvPEeG1B5HDFm-I-w">
-    <mutatorConfig minObjectsCount="10">
-      <rootEClass href="http://eclipse.org/emf/emfstore/common/model#//Project"/>
-      <eStructuralFeaturesToIgnore xsi:type="ecore:EReference" href="http://eclipse.org/emf/emfstore/common/model#//Project/cutElements"/>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="10" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.OperationReverseTest" id="_sLQasYvPEeG1B5HDFm-I-w">
-    <mutatorConfig minObjectsCount="100">
-      <rootEClass href="http://eclipse.org/emf/emfstore/common/model#//Project"/>
-      <eStructuralFeaturesToIgnore xsi:type="ecore:EReference" href="http://eclipse.org/emf/emfstore/common/model#//Project/cutElements"/>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="10" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.SerializationTest" id="_c24GhIvSEeGC3oFJZ-5j24">
-    <mutatorConfig minObjectsCount="100">
-      <rootEClass href="http://eclipse.org/emf/emfstore/common/model#//Project"/>
-      <eStructuralFeaturesToIgnore xsi:type="ecore:EReference" href="http://eclipse.org/emf/emfstore/common/model#//Project/cutElements"/>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="10" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.ServerTest" id="_SCHGhIvSEeGC3oFJZ-5KUS">
-    <mutatorConfig minObjectsCount="100">
-      <rootEClass href="http://eclipse.org/emf/emfstore/common/model#//Project"/>
-      <eStructuralFeaturesToIgnore xsi:type="ecore:EReference" href="http://eclipse.org/emf/emfstore/common/model#//Project/cutElements"/>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="1" count="5000" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.MutatorTest" id="_C11qUIvSEeGC3oFJZ-5VgQ">
-    <mutatorConfig>
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>
-  <org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig seed="2" count="1" testClass="org.eclipse.emf.emfstore.fuzzy.emf.test.BigMutationTest" id="_X34zhIvSEeGC3oFJZ-5VzL">
-    <mutatorConfig minObjectsCount="100000">
-      <ePackages href="http://org/eclipse/example/bowling#/"/>
-    </mutatorConfig>
-  </org.eclipse.emf.emfstore.fuzzy.emf.config:TestConfig>   
-</xmi:XMI>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/plugin.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/plugin.xml
deleted file mode 100644
index 8f09a54..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/plugin.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.4"?>
-<plugin>
-   <extension
-         point="org.eclipse.emf.emfstore.client.inverseCrossReferenceCache">
-      <useInverseCrossReferenceCache
-            activated="true">
-      </useInverseCrossReferenceCache>
-   </extension>
-   <extension
-         point="org.eclipse.emf.emfstore.common.model.modelelementIdGenerator">
-      <idgenerator
-            class="org.eclipse.emf.emfstore.fuzzy.emf.test.FuzzyModelElementIdGenerator">
-      </idgenerator>
-   </extension>
-   <extension
-         point="org.eclipse.emf.emfstore.client.changeRecordingOptions">
-      <RecordingOptions
-            cutOffIncomingCrossReferences="true">
-      </RecordingOptions>
-   </extension>
-
-</plugin>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/pom.xml
deleted file mode 100644
index 327cfb7..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/pom.xml
+++ /dev/null
@@ -1,119 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy.emf.test</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-test-plugin</packaging>
-  
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-surefire-plugin</artifactId>
-        <version>${tycho-version}</version>
-
-        <configuration>
-                   
-          <testSuite>org.eclipse.emf.emfstore.fuzzy.emf.test</testSuite>
-          <testClass>org.eclipse.emf.emfstore.fuzzy.emf.test.AllFuzzyTests</testClass>
-          <useUIHarness>true</useUIHarness>
-          <useUIThread>false</useUIThread>
-          
-          <argLine>-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -DrunFuzzyTests=${runFuzzyTests} -DfilterTests=${filterTests}</argLine>
-          <failIfNoTests>false</failIfNoTests>
-          <testFailureIgnore>true</testFailureIgnore>
-          
-          <dependencies> 
-          	<dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.fuzzy.emf</artifactId>
-              <version>0.0.0</version>
-            </dependency>   
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.fuzzy</artifactId>
-              <version>0.0.0</version>
-            </dependency>        
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client.model.edit</artifactId>
-              <version>0.0.0</version>
-            </dependency>
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client.test</artifactId>
-              <version>0.0.0</version>
-            </dependency>
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client</artifactId>
-              <version>0.0.0</version>
-            </dependency>            
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.modelmutator</artifactId>
-              <version>0.0.0</version>
-            </dependency>            
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.examplemodel.edit</artifactId>
-              <version>0.0.0</version>
-            </dependency>           
-          </dependencies>
-
-          <bundleStartLevel>  
-          	<bundle>
-              <id>org.eclipse.emf.emfstore.fuzzy.emf</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.fuzzy</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>          
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client.model.edit</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client.test</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>        
-            <bundle>
-              <id>org.eclipse.emf.emfstore.modelmutator</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>           
-            <bundle>
-              <id>org.eclipse.emf.emfstore.examplemodel.edit</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.examplemodel</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>            
-          </bundleStartLevel> 
-        </configuration>
-       
-      </plugin>
-	</plugins>
-   </build>
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/AllFuzzyTests.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/AllFuzzyTests.java
deleted file mode 100644
index 33dc5cf..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/AllFuzzyTests.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.FilteredSuite;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-/**
- * Suite for all fuzzy tests.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FilteredSuite.class)
-@Suite.SuiteClasses({ OperationApplyTest.class })
-public class AllFuzzyTests {
-
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/BigMutationTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/BigMutationTest.java
deleted file mode 100644
index 7a876e6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/BigMutationTest.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Util;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.fuzzy.emf.MutateUtil;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutator;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorUtil;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test to run bigger {@link org.eclipse.emf.emfstore.modelmutator.api.ModelMutatorConfiguration}s.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class BigMutationTest {
-
-	@Data
-	private EObject root;
-
-	@Util
-	private MutateUtil util;
-
-	/***/
-	@Test
-	public void createModel() {
-		System.out.println(ModelMutatorUtil.getAllObjectsCount(root));
-
-		System.out.println("CHANGE");
-
-		ModelMutatorConfiguration config = new ModelMutatorConfiguration(util.getEPackages(), root, 1L);
-		config.setMinObjectsCount(util.getMinObjectsCount());
-		ModelMutator.changeModel(config);
-
-		System.out.println(ModelMutatorUtil.getAllObjectsCount(root));
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyModelElementIdGenerator.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyModelElementIdGenerator.java
deleted file mode 100644
index e3dda4e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyModelElementIdGenerator.java
+++ /dev/null
@@ -1,47 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.ModelFactory;
-
-/**
- * Implementation of {@link ModelElementIdGenerator} which increments the ModelElementId for each
- * new modelelement for each IdEObjectCollection starting with 0.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@SuppressWarnings("restriction")
-public class FuzzyModelElementIdGenerator {
-
-	private Map<Object, Integer> collectionsToIds = new HashMap<Object, Integer>();
-
-	/**
-	 * Generates a new {@link ModelElementId}.
-	 * 
-	 * @param collection The {@link org.eclipse.emf.emfstore.internal.common.model.IdEObjectCollection} for which to create a new {@link ModelElementId}.
-	 * @return A new {@link ModelElementId}.
-	 */
-	public ModelElementId generateModelElementId(Object collection) {
-		Integer id = collectionsToIds.get(collection);
-		if (id == null) {
-			id = new Integer(0);
-		}
-		ModelElementId modelElementId = ModelFactory.eINSTANCE.createModelElementId();
-		modelElementId.setId(String.valueOf(id));
-		collectionsToIds.put(collection, id + 1);
-		return modelElementId;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyProjectTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyProjectTest.java
deleted file mode 100644
index 98c9f0a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/FuzzyProjectTest.java
+++ /dev/null
@@ -1,306 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.concurrent.Callable;
-
-import junit.framework.Assert;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.emfstore.client.ESWorkspace;
-import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
-import org.eclipse.emf.emfstore.client.util.RunESCommand;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Options;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Util;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.fuzzy.emf.MutateUtil;
-import org.eclipse.emf.emfstore.internal.client.model.Configuration;
-import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
-import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
-import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
-import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESWorkspaceImpl;
-import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
-import org.eclipse.emf.emfstore.internal.common.CommonUtil;
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.Project;
-import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
-import org.eclipse.emf.emfstore.internal.client.model.impl.WorkspaceBase;
-import org.eclipse.emf.emfstore.internal.client.model.impl.WorkspaceImpl;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.BeforeClass;
-import org.junit.runner.RunWith;
-
-/**
- * Abstract super class for tests handling EMFStore projects.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public abstract class FuzzyProjectTest {
-
-	@Data
-	private Project project;
-
-	@Util
-	private MutateUtil util;
-
-	@SuppressWarnings({ "serial", "unused", "restriction" })
-	@Options
-	private Map<String, Object> options = new HashMap<String, Object>() {
-		{
-			put(EMFDataProvider.MUTATOR_EDITINGDOMAIN, ((ESWorkspaceProviderImpl) ESWorkspaceProvider.INSTANCE).getEditingDomain());
-		}
-	};
-
-	private ProjectSpace projectSpace;
-
-	private ProjectSpace copyProjectSpace;
-
-	/**
-	 * Init the testclasses.
-	 */
-	@BeforeClass
-	public static void init() {
-		// call once to avoid wrong time in first run
-		CommonUtil.setTesting(true);
-	}
-
-	/***/
-	@SuppressWarnings("restriction")
-	@Before
-	public void setup() {
-		// set testing to true so it uses test profile
-		CommonUtil.setTesting(true);
-
-		// necessary to avoid saving of each projectspace
-		// which leads to a very slow performance
-		Configuration.getClientBehavior().setAutoSave(false);
-
-		// import projects		
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				ESWorkspaceImpl esWorkspaceImpl = (ESWorkspaceImpl) ESWorkspaceProvider.INSTANCE.getWorkspace();
-				projectSpace = ((ESLocalProjectImpl) esWorkspaceImpl.createLocalProject("")).toInternalAPI();
-				if (projectSpaceCopyNeeded()) {
-					copyProjectSpace = ((WorkspaceBase) esWorkspaceImpl.toInternalAPI()).cloneProject("", projectSpace.getProject());
-				}
-			}
-		}.run(false);
-	}
-
-	/***/
-	@After
-	@SuppressWarnings("restriction")
-	public void tearDown() {
-		RunESCommand.run(new Callable<Void>() {			
-			public Void call() throws Exception {
-				try {
-					WorkspaceImpl currentWorkspace = (WorkspaceImpl) ESWorkspaceProvider.INSTANCE.getWorkspace();
-					EList<ProjectSpace> projectSpaces = currentWorkspace.getProjectSpaces();
-					if (projectSpace != null && projectSpaces.contains(projectSpace)) {
-						projectSpace.delete(new NullProgressMonitor());
-					}
-					if (copyProjectSpace != null && projectSpaces.contains(copyProjectSpace)) {
-						copyProjectSpace.delete(new NullProgressMonitor());
-					}
-				} catch (FileNotFoundException e) {
-					// do nothing
-				} catch (IOException e) {
-					// do nothing
-				} finally {
-					
-				}
-				return null;
-			}
-		});
-	}
-
-	/**
-	 * Constructs a new {@link ModelMutatorConfiguration} based on the existing one and the given project.
-	 * 
-	 * @param project The root object of the {@link ModelMutatorConfiguration}.
-	 * @return The new {@link ModelMutatorConfiguration}.
-	 */
-	@SuppressWarnings("restriction")
-	public ModelMutatorConfiguration getModelMutatorConfiguration(Project project) {
-		return getModelMutatorConfiguration(project, util);
-	}
-
-	/**
-	 * Constructs a new {@link ModelMutatorConfiguration} based on the given {@link MutateUtil} and the given project.
-	 * 
-	 * @param project The root object of the {@link ModelMutatorConfiguration}.
-	 * @param util The {@link MutateUtil} connected to the {@link EMFDataProvider}.
-	 * @return The new {@link ModelMutatorConfiguration}.
-	 */
-	public static ModelMutatorConfiguration getModelMutatorConfiguration(Project project, MutateUtil util) {
-		final ModelMutatorConfiguration mmc = new ModelMutatorConfiguration(util.getEPackages(), project, 1L);
-		mmc.seteStructuralFeaturesToIgnore(util.getEStructuralFeaturesToIgnore());
-		mmc.seteClassesToIgnore(util.getEClassesToIgnore());
-		mmc.setEditingDomain(((ESWorkspaceProviderImpl) ESWorkspaceProvider.INSTANCE).getEditingDomain());
-		mmc.setMinObjectsCount(util.getMinObjectsCount());
-		return mmc;
-	}
-
-	/**
-	 * Can be overridden by subclasses to modify behavior. Default is <code>true</code>.
-	 * 
-	 * @return Should this class handle/provide also a copy of the projectSpace?
-	 */
-	public boolean projectSpaceCopyNeeded() {
-		return true;
-	}
-
-	/**
-	 * Notify that a test has failed. Saves the projects for later comparison.
-	 * 
-	 * @param project1 The first {@link Project}.
-	 * @param project2 The second {@link Project}.
-	 */
-	public void fail(Project project1, Project project2) {
-		fail(project1, project2, util);
-	}
-
-	/**
-	 * Notify that a test has failed. Saves the projects for later comparison.
-	 * 
-	 * @param project1 The first {@link Project}.
-	 * @param project2 The second {@link Project}.
-	 * @param util The {@link MutateUtil} connected to the {@link EMFDataProvider}.
-	 */
-	public static void fail(Project project1, Project project2, MutateUtil util) {
-		save(project1, project2, util);
-		Assert.fail();
-	}
-
-	/**
-	 * Saves the projects for e.g. later comparison.
-	 * 
-	 * @param project1 The first {@link Project}.
-	 * @param project2 The second {@link Project}.
-	 * @param util The {@link MutateUtil} connected to the {@link EMFDataProvider}.
-	 */
-	public static void save(final Project project1, final Project project2, final MutateUtil util) {
-		final Map<Object, Object> options = new HashMap<Object, Object>();
-		options.put(XMLResource.OPTION_PROCESS_DANGLING_HREF, XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD);
-
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				try {
-					ModelUtil.saveEObjectToResource(Arrays.asList(project1), util.getRunResourceURI("original"),
-						options);
-					ModelUtil.saveEObjectToResource(Arrays.asList(project2), util.getRunResourceURI("copy"), options);
-				} catch (IOException e) {
-					throw new RuntimeException(e);
-				}
-			}
-		}.run(false);
-	}
-
-	/**
-	 * Compare two projects but ignore the order of the elements.
-	 * 
-	 * @param project1 The first {@link Project}.
-	 * @param project2 The second {@link Project}.
-	 */
-	public void compareIgnoreOrder(Project project1, Project project2) {
-		compareIgnoreOrder(project1, project2, util);
-	}
-
-	/**
-	 * Compare two projects but ignore the order of the elements.
-	 * 
-	 * @param project1 The first {@link Project}.
-	 * @param project2 The second {@link Project}.
-	 * @param util The {@link MutateUtil} connected to the {@link EMFDataProvider}.
-	 */
-	public static void compareIgnoreOrder(Project project1, Project project2, MutateUtil util) {
-		if (project1.getModelElements().size() != project2.getModelElements().size()) {
-			fail(project1, project2, util);
-		}
-
-		int index = 0;
-		// sort elements in modelElement reference of projects to avoid differences only in indices.
-		for (EObject eObject1 : project1.getModelElements()) {
-			ModelElementId modelElementId1 = project1.getModelElementId(eObject1);
-			EObject eObject2 = project2.getModelElement(modelElementId1);
-			if (eObject2 == null || !project2.getModelElements().contains(eObject2)) {
-				fail(project1, project2, util);
-			}
-			project2.getModelElements().move(index, eObject2);
-			index++;
-		}
-
-		if (!ModelUtil.areEqual(project1, project2)) {
-			fail(project1, project2, util);
-		}
-	}
-
-	/**
-	 * @return The {@link MutateUtil} connected with the {@link EMFDataProvider}.
-	 */
-	public MutateUtil getUtil() {
-		return util;
-	}
-
-	/**
-	 * @return The {@link ProjectSpace} imported into the WorkSpace.
-	 */
-	public ProjectSpace getProjectSpace() {
-		return projectSpace;
-	}
-
-	/**
-	 * @param projectSpace The {@link ProjectSpace} of the test.
-	 */
-	public void setProjectSpace(ProjectSpace projectSpace) {
-		this.projectSpace = projectSpace;
-	}
-
-	/**
-	 * @return The {@link ProjectSpace} copied from the original one.
-	 * @throws IllegalStateException When {@link #projectSpaceCopyNeeded()} returns false.
-	 */
-	public ProjectSpace getCopyProjectSpace() throws IllegalStateException {
-		if (!projectSpaceCopyNeeded()) {
-			throw new IllegalStateException("This test does not have a copied projectSpace!");
-		}
-		return copyProjectSpace;
-	}
-
-	/**
-	 * @param copyProjectSpace The {@link ProjectSpace} copied from the original one.
-	 * @throws IllegalStateException When {@link #projectSpaceCopyNeeded()} returns false.
-	 */
-	public void setCopyProjectSpace(ProjectSpace copyProjectSpace) throws IllegalStateException {
-		if (!projectSpaceCopyNeeded()) {
-			throw new IllegalStateException("This test does not have a copied projectSpace!");
-		}
-		this.copyProjectSpace = copyProjectSpace;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/MutatorTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/MutatorTest.java
deleted file mode 100644
index 966478a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/MutatorTest.java
+++ /dev/null
@@ -1,121 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.Iterator;
-
-import org.eclipse.emf.common.util.TreeIterator;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Util;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.fuzzy.emf.MutateUtil;
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.ModelFactory;
-import org.eclipse.emf.emfstore.internal.common.model.ModelPackage;
-import org.eclipse.emf.emfstore.internal.common.model.Project;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutator;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test to test the {@link ModelMutator}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class MutatorTest {
-
-	@SuppressWarnings("unused")
-	@Data
-	private EObject obj;
-
-	@Util
-	private MutateUtil util;
-
-	/**
-	 * Tests if two generated models are equal.
-	 */
-	@Test
-	public void compareTwoGeneratedProjects() {
-
-		Project project1 = ModelFactory.eINSTANCE.createProject();
-		Project project2 = ModelFactory.eINSTANCE.createProject();
-		ModelMutator.generateModel(getConfig(project1));
-		ModelMutator.generateModel(getConfig(project2));
-
-		ModelMutator.changeModel(getConfig(project1));
-		ModelMutator.changeModel(getConfig(project2));
-
-		Iterator<EObject> project1Iterator = project1.getAllModelElements().iterator();
-		Iterator<EObject> project2Iterator = project2.getAllModelElements().iterator();
-
-		while (project1Iterator.hasNext()) {
-			EObject modelElement = project1Iterator.next();
-			ModelElementId modelElementId = project1.getModelElementId(modelElement);
-			if (!project2.contains(modelElementId)) {
-				failed(project1, project2);
-			}
-		}
-
-		TreeIterator<EObject> allContentsProject1 = project1.eAllContents();
-		TreeIterator<EObject> allContentsProject2 = project2.eAllContents();
-
-		while (allContentsProject1.hasNext()) {
-			if (!allContentsProject2.hasNext()) {
-				failed(project1, project2);
-			}
-			EObject modelElement = allContentsProject1.next();
-			ModelElementId modelElementId = project1.getModelElementId(modelElement);
-			EObject modelElement2 = allContentsProject2.next();
-			ModelElementId modelElementId2 = project2.getModelElementId(modelElement2);
-			if (!modelElementId.equals(modelElementId2)) {
-				failed(project1, project2);
-			}
-		}
-
-		project1Iterator = project1.getAllModelElements().iterator();
-		project2Iterator = project2.getAllModelElements().iterator();
-
-		while (project1Iterator.hasNext()) {
-			EObject modelElement = project1Iterator.next();
-			ModelElementId modelElementId = project1.getModelElementId(modelElement);
-			ModelElementId modelElementId2 = project2.getModelElementId(project2Iterator.next());
-			if (!modelElementId.equals(modelElementId2)) {
-				failed(project1, project2);
-			}
-		}
-	}
-
-	private void failed(Project project1, Project project2) {
-		util.saveEObject(project1, "original_project", true);
-		util.saveEObject(project2, "own_project", true);
-		Assert.assertTrue(false);
-	}
-
-	private ModelMutatorConfiguration getConfig(Project root) {
-		ModelMutatorConfiguration mmc = new ModelMutatorConfiguration(util.getEPackages(), root, util.getSeed());
-		Collection<EStructuralFeature> eStructuralFeaturesToIgnore = new HashSet<EStructuralFeature>();
-		eStructuralFeaturesToIgnore.add(ModelPackage.Literals.PROJECT__CUT_ELEMENTS);
-		mmc.seteStructuralFeaturesToIgnore(eStructuralFeaturesToIgnore);
-		mmc.setMinObjectsCount(util.getMinObjectsCount());
-		return mmc;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationApplyTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationApplyTest.java
deleted file mode 100644
index 91d2fb6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationApplyTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
-import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
-import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Test which mutates a project and then applies its changes to another (copied) project.
- * Then compares the two mutated projects.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class OperationApplyTest extends FuzzyProjectTest {
-
-	/***/
-	@Test
-	public void applyTest() {
-
-		final ProjectSpace projectSpace = getProjectSpace();
-		final ModelMutatorConfiguration mmc = getModelMutatorConfiguration(projectSpace.getProject());
-
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				getUtil().mutate(mmc);
-			}
-		}.run(false);
-
-		final ProjectSpace copyProjectSpace = getCopyProjectSpace();
-
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				((ProjectSpaceBase) copyProjectSpace).applyOperations(projectSpace.getOperations(), false);
-			}
-		}.run(false);
-
-		compareIgnoreOrder(projectSpace.getProject(), copyProjectSpace.getProject());
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationReverseTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationReverseTest.java
deleted file mode 100644
index cdaa3b2..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/OperationReverseTest.java
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.internal.client.model.impl.ProjectSpaceBase;
-import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Fuzzy Test for the reverse functionality of operations.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class OperationReverseTest extends FuzzyProjectTest {
-
-	/***/
-	@Test
-	public void reverseTest() {
-		final ProjectSpaceBase projectSpace = (ProjectSpaceBase) getProjectSpace();
-		final ModelMutatorConfiguration mmc = getModelMutatorConfiguration(projectSpace.getProject());
-
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				getUtil().mutate(mmc);
-			}
-		}.run(false);
-
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				projectSpace.getLocalChangePackage().reverse().apply(projectSpace.getProject());
-			}
-		}.run(false);
-
-		compareIgnoreOrder(getCopyProjectSpace().getProject(), projectSpace.getProject());
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ProjectLoggingAdapter.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ProjectLoggingAdapter.java
deleted file mode 100644
index 5c04f1e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ProjectLoggingAdapter.java
+++ /dev/null
@@ -1,85 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import java.util.List;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EReference;
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.impl.ProjectImpl;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.LoggingAdapter;
-
-/**
- * Extends the {@link LoggingAdapter} to print out {@link ModelElementId}s.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class ProjectLoggingAdapter extends LoggingAdapter {
-
-	private ProjectImpl projectImpl;
-
-	/**
-	 * @param project The project containing the elements notifying.
-	 * @param toLogClasses The {@link EClass}es to log. If <code>null</code> every {@link EClass} is logged.
-	 * @param toLogReferences The {@link EReference}es of the toLogClasses to log. If <code>null</code> every
-	 *            {@link EReference} is logged.
-	 * @param references Log reference changes?
-	 * @param attributes Log attribute changes?
-	 */
-	public ProjectLoggingAdapter(ProjectImpl project, List<EClass> toLogClasses, List<EReference> toLogReferences,
-		boolean references, boolean attributes) {
-		super(toLogClasses, toLogReferences, references, attributes);
-		this.projectImpl = project;
-	}
-
-	@Override
-	protected String format(Notification notification) {
-		StringBuffer result = new StringBuffer();
-		result.append("Notifier:  " + getModelElementId(projectImpl, notification.getNotifier()) + " "
-			+ notification.getNotifier());
-		result.append("\n");
-		result.append("Feature:   " + notification.getFeature());
-		result.append("\n");
-		result.append("Position:  " + notification.getPosition());
-		result.append("\n");
-		result.append("EventType: " + getEventType(notification.getEventType()));
-		result.append("\n");
-		result.append("OldValue:  " + getModelElementId(projectImpl, notification.getOldValue()) + " "
-			+ notification.getOldValue());
-		result.append("\n");
-		result.append("NewValue:  " + getModelElementId(projectImpl, notification.getNewValue()) + " "
-			+ notification.getNewValue());
-		result.append("\n");
-		return result.toString();
-	}
-
-	private String getModelElementId(ProjectImpl project, Object o) {
-		if (o == null) {
-			return null;
-		}
-
-		if (!(o instanceof EObject)) {
-			return null;
-		}
-
-		EObject eObject = (EObject) o;
-		ModelElementId modelElementId = project.getModelElementId(eObject);
-		if (modelElementId != null) {
-			return modelElementId.getId();
-		}
-		ModelElementId deletedModelElementId = project.getDeletedModelElementId(eObject);
-		return deletedModelElementId != null ? deletedModelElementId.getId() : null;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/SerializationTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/SerializationTest.java
deleted file mode 100644
index 42de334..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/SerializationTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
-import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
-import org.eclipse.emf.emfstore.internal.client.model.impl.WorkspaceImpl;
-import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
-import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Class to test serialization functionality of the {@link WorkspaceManager}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class SerializationTest extends FuzzyProjectTest {
-
-	/**
-	 * Load and save a {@link ProjectSpace} via {@link WorkspaceManager} and compare them.
-	 */
-	@Test
-	public void loadAndSaveToResource() {
-
-		// mutate already saved (through importing) projectSpace and save it again
-		ProjectSpace projectSpace = getProjectSpace();
-		final ModelMutatorConfiguration mmc = getModelMutatorConfiguration(projectSpace.getProject());
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				getUtil().mutate(mmc);
-			}
-		}.run(false);
-
-		projectSpace.save();
-
-		// dispose and reinit WorkspaceManager
-		((ESWorkspaceProviderImpl) ESWorkspaceProvider.INSTANCE).dispose();
-		((ESWorkspaceProviderImpl) ESWorkspaceProvider.INSTANCE).init();
-		
-		// reload projectSpaces and check for valid state
-		EList<ProjectSpace> projectSpaces = ((WorkspaceImpl) ESWorkspaceProvider.INSTANCE.getWorkspace()).getProjectSpaces();
-		if (projectSpaces.size() != 1) {
-			throw new IllegalStateException("There must be exactly one projectSpace in the workspace! Current value: "
-				+ projectSpaces.size());
-		}
-
-		// compare
-		ProjectSpace reloadedProjectSpace = projectSpaces.get(0);
-		try {
-			if (!ModelUtil.areEqual(reloadedProjectSpace.getProject(), projectSpace.getProject())) {
-				fail(reloadedProjectSpace.getProject(), projectSpace.getProject());
-			}
-		} finally {
-			// set projectSpace to the reloaded one to ensure correct cleanup
-			setProjectSpace(reloadedProjectSpace);
-		}
-	}
-
-	@Override
-	public boolean projectSpaceCopyNeeded() {
-		return false;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ServerTest.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ServerTest.java
deleted file mode 100644
index 57de6f4..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf.test/src/org/eclipse/emf/emfstore/fuzzy/emf/test/ServerTest.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.test;
-
-import org.eclipse.core.runtime.NullProgressMonitor;
-import org.eclipse.emf.emfstore.client.ESWorkspaceProvider;
-import org.eclipse.emf.emfstore.client.test.server.api.CoreServerTest;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Util;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.EMFDataProvider;
-import org.eclipse.emf.emfstore.fuzzy.emf.MutateUtil;
-import org.eclipse.emf.emfstore.internal.client.model.Configuration;
-import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
-import org.eclipse.emf.emfstore.internal.client.model.impl.WorkspaceImpl;
-import org.eclipse.emf.emfstore.internal.client.model.impl.api.ESLocalProjectImpl;
-import org.eclipse.emf.emfstore.internal.client.model.util.EMFStoreCommand;
-import org.eclipse.emf.emfstore.internal.common.CommonUtil;
-import org.eclipse.emf.emfstore.internal.common.model.Project;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.eclipse.emf.emfstore.internal.server.model.versioning.PrimaryVersionSpec;
-import org.eclipse.emf.emfstore.server.exceptions.ESException;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-
-/**
- * Fuzzy Server test to test share, checkout, commit and update.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-@RunWith(FuzzyRunner.class)
-@DataProvider(EMFDataProvider.class)
-public class ServerTest extends CoreServerTest {
-
-	@Data
-	private Project project;
-
-	@Util
-	private MutateUtil util;
-
-	/**
-	 * Setup the needed projectspace.
-	 */
-	@Before
-	public void setupProjectSpace() {
-		CommonUtil.setTesting(true);
-		Configuration.getClientBehavior().setAutoSave(false);
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {				
-				setProjectSpace(((WorkspaceImpl) ESWorkspaceProvider.INSTANCE.getWorkspace()).importProject(project, "", ""));
-			}
-		}.run(false);
-		setProject(project);
-	}
-
-	/**
-	 * @throws EmfStoreException Problems with share, checkout, commit or update.
-	 */
-	@Test
-	public void shareCheckoutCommitUpdate() throws ESException {
-		
-		ProjectSpace projectSpace = getProjectSpace();
-
-		// share original project
-		PrimaryVersionSpec versionSpec = share(projectSpace);
-
-		// checkout project
-		final ProjectSpace psCheckedout = checkout(projectSpace.toAPI().getRemoteProject(), versionSpec);
-
-		// compare original and checkedout project
-		FuzzyProjectTest.compareIgnoreOrder(projectSpace.getProject(), psCheckedout.getProject(), util);
-
-		// change & commit original project
-		final ModelMutatorConfiguration mmc = FuzzyProjectTest.getModelMutatorConfiguration(projectSpace.getProject(),
-			util);
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				util.mutate(mmc);
-			}
-		}.run(false);
-
-		commit(projectSpace);
-
-		// update checkedout project
-		new EMFStoreCommand() {
-			@Override
-			protected void doRun() {
-				try {
-					psCheckedout.update(new NullProgressMonitor());
-				} catch (ESException e) {
-					throw new RuntimeException(e);
-				}
-			}
-		}.run(false);
-
-		// compare original and updated project
-		FuzzyProjectTest.compareIgnoreOrder(projectSpace.getProject(), psCheckedout.getProject(), util);
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.checkstyle b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.checkstyle
deleted file mode 100644
index 2f2667a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.checkstyle
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-
-<fileset-config file-format-version="1.2.0" simple-config="true" sync-formatter="false">
-  <fileset name="all" enabled="true" check-config-name="emfstoreStyle" local="false">
-    <file-match-pattern match-pattern="." include-pattern="true"/>
-  </fileset>
-</fileset-config>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.classpath
deleted file mode 100644
index 57c9877..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.classpath
+++ /dev/null
@@ -1,8 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry exported="true" kind="lib" path="lib/dom4j-1.6.1.jar"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.project
deleted file mode 100644
index 4a1c331..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy.emf</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/CreateAllDiffs.launch b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/CreateAllDiffs.launch
deleted file mode 100644
index 40c63a0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/CreateAllDiffs.launch
+++ /dev/null
@@ -1,41 +0,0 @@
-<?xml version="1.0" encoding="UTF-8" standalone="no"?>
-<launchConfiguration type="org.eclipse.pde.ui.JunitLaunchConfig">
-<booleanAttribute key="append.args" value="true"/>
-<stringAttribute key="application" value="org.eclipse.pde.junit.runtime.coretestapplication"/>
-<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.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/CreateAllDiffs.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.emf.emfstore.fuzzy.emf.diff.CreateAllDiffs"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROGRAM_ARGUMENTS" value="-os ${target.os} -ws ${target.ws} -arch ${target.arch} -nl ${target.nl} -consoleLog"/>
-<stringAttribute key="org.eclipse.jdt.launching.PROJECT_ATTR" value="org.eclipse.emf.emfstore.fuzzy.emf"/>
-<stringAttribute key="org.eclipse.jdt.launching.SOURCE_PATH_PROVIDER" value="org.eclipse.pde.ui.workbenchClasspathProvider"/>
-<stringAttribute key="org.eclipse.jdt.launching.VM_ARGUMENTS" value="-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m"/>
-<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"/>
-<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/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/META-INF/MANIFEST.MF
deleted file mode 100644
index 5d1f0b1..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,20 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: EMFDataProvider for FuzzyTestRunner (Incubation)
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy.emf;singleton:=true
-Bundle-Version: 0.9.3.qualifier
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
-Bundle-ClassPath: .,
- lib/dom4j-1.6.1.jar
-Bundle-Localization: plugin
-Export-Package: org.eclipse.emf.emfstore.fuzzy.emf,
- org.eclipse.emf.emfstore.fuzzy.emf.config,
- org.eclipse.emf.emfstore.fuzzy.emf.config.util,
- org.eclipse.emf.emfstore.fuzzy.emf.diff
-Require-Bundle: org.eclipse.emf.emfstore.modelmutator;visibility:=reexport,
- org.eclipse.emf.emfstore.fuzzy;visibility:=reexport,
- org.eclipse.emf.ecore;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
- org.eclipse.emf.ecore.xmi;bundle-version="[2.5.0,3.0.0)";visibility:=reexport,
- org.eclipse.core.runtime;bundle-version="[3.7.0,4.0.0)";visibility:=reexport,
- org.eclipse.emf.edit;bundle-version="[2.5.0,3.0.0)";visibility:=reexport
-Bundle-Vendor: Eclipse Modeling Project
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/build.properties
deleted file mode 100644
index 4a470b0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/build.properties
+++ /dev/null
@@ -1,15 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-bin.includes = .,\
-               model/,\
-               META-INF/,\
-               plugin.xml,\
-               plugin.properties,\
-               lib/dom4j-1.6.1.jar
-jars.compile.order = .
-source.. = src/
-output.. = bin/
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/fuzzy/fuzzy.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/fuzzy/fuzzy.properties
deleted file mode 100644
index c8e74a8..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/fuzzy/fuzzy.properties
+++ /dev/null
@@ -1,6 +0,0 @@
-#fuzzy.emfdataprovider.configsFile=fuzzy/fuzzyConfig.xml
-fuzzy.hudson.url=https://hudson.eclipse.org/hudson
-#fuzzy.hudson.port=8080
-fuzzy.hudson.job=emf-emfstore-fuzzytests-explorer
-fuzzy.hudson.diffjob=emf-emfstore-fuzzytests-differ
-fuzzy.hudson.artifact.folder=/artifact/git/org.eclipse.emf.emfstore.other/
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/lib/dom4j-1.6.1.jar b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/lib/dom4j-1.6.1.jar
deleted file mode 100644
index c8c4dbb..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/lib/dom4j-1.6.1.jar
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.ecore b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.ecore
deleted file mode 100644
index 2385900..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.ecore
+++ /dev/null
@@ -1,66 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<ecore:EPackage xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
-    xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore" name="config"
-    nsURI="http://org/eclipse/emf/emfstore/fuzzy/emf/config" nsPrefix="org.eclipse.emf.emfstore.fuzzy.emf.config">
-  <eClassifiers xsi:type="ecore:EClass" name="TestConfig">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="seed" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="count" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="testClass">
-      <eGenericType eClassifier="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EJavaClass">
-        <eTypeArguments/>
-      </eGenericType>
-    </eStructuralFeatures>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="id" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="mutatorConfig" eType="#//MutatorConfig"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TestRun">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="config" eType="#//TestConfig"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="time" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="results" upperBound="-1"
-        eType="#//TestResult" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TestResult">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="seedCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="testName" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="error" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="failure" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EString"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="executionTime" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//ELong"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="TestDiff">
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="lastUpdate" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EDate"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="config" eType="#//TestConfig"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="oldResult" eType="#//TestResult"
-        containment="true"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="newResult" eType="#//TestResult"
-        containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="DiffReport">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="diffs" upperBound="-1"
-        eType="#//TestDiff" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="Root">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="elements" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EObject" containment="true"/>
-  </eClassifiers>
-  <eClassifiers xsi:type="ecore:EClass" name="MutatorConfig">
-    <eStructuralFeatures xsi:type="ecore:EReference" name="rootEClass" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EClass"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="minObjectsCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EInt"
-        defaultValueLiteral="100"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="ignoreAndLog" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="doNotGenerateRoot" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="useEcoreUtilDelete" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EBoolean"
-        defaultValueLiteral="false"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="eClassesToIgnore" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EClass"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="eStructuralFeaturesToIgnore"
-        upperBound="-1" eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EStructuralFeature"/>
-    <eStructuralFeatures xsi:type="ecore:EReference" name="ePackages" upperBound="-1"
-        eType="ecore:EClass http://www.eclipse.org/emf/2002/Ecore#//EPackage"/>
-    <eStructuralFeatures xsi:type="ecore:EAttribute" name="maxDeleteCount" eType="ecore:EDataType http://www.eclipse.org/emf/2002/Ecore#//EIntegerObject"/>
-  </eClassifiers>
-</ecore:EPackage>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.genmodel b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.genmodel
deleted file mode 100644
index 8ba59ad..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/model/config.genmodel
+++ /dev/null
@@ -1,54 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<genmodel:GenModel xmi:version="2.0"
-    xmlns:xmi="http://www.omg.org/XMI" xmlns:ecore="http://www.eclipse.org/emf/2002/Ecore"
-    xmlns:genmodel="http://www.eclipse.org/emf/2002/GenModel" copyrightText="Copyright (c) 2008-2012 EclipseSource Muenchen GmbH.&#xD;&#xA;&#xD;&#xA;All rights reserved. This program and the accompanying materials&#xD;&#xA;are made available under the terms of the Eclipse Public License v1.0&#xD;&#xA;which accompanies this distribution, and is available at&#xD;&#xA;http://www.eclipse.org/legal/epl-v10.html&#xD;&#xA;&#xD;&#xA;Contributors:"
-    modelDirectory="/org.eclipse.emf.emfstore.fuzzy.emf/src" modelPluginID="org.eclipse.emf.emfstore.fuzzy.emf"
-    modelName="Config" importerID="org.eclipse.emf.importer.ecore" complianceLevel="5.0"
-    copyrightFields="false" runtimeVersion="2.5">
-  <foreignModel>config.ecore</foreignModel>
-  <genPackages prefix="Config" basePackage="org.eclipse.emf.emfstore.fuzzy.emf" disposableProviderFactory="true"
-      fileExtensions="fuzzy" ecorePackage="config.ecore#/">
-    <genClasses ecoreClass="config.ecore#//TestConfig">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestConfig/seed"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestConfig/count"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestConfig/testClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestConfig/id"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//TestConfig/mutatorConfig"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//TestRun">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//TestRun/config"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestRun/time"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//TestRun/results"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//TestResult">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestResult/seedCount"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestResult/testName"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestResult/error"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestResult/failure"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestResult/executionTime"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//TestDiff">
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//TestDiff/lastUpdate"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference config.ecore#//TestDiff/config"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//TestDiff/oldResult"/>
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//TestDiff/newResult"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//DiffReport">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//DiffReport/diffs"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//Root">
-      <genFeatures property="None" children="true" createChild="true" ecoreFeature="ecore:EReference config.ecore#//Root/elements"/>
-    </genClasses>
-    <genClasses ecoreClass="config.ecore#//MutatorConfig">
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference config.ecore#//MutatorConfig/rootEClass"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//MutatorConfig/minObjectsCount"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//MutatorConfig/ignoreAndLog"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//MutatorConfig/doNotGenerateRoot"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//MutatorConfig/useEcoreUtilDelete"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference config.ecore#//MutatorConfig/eClassesToIgnore"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference config.ecore#//MutatorConfig/eStructuralFeaturesToIgnore"/>
-      <genFeatures notify="false" createChild="false" propertySortChoices="true" ecoreFeature="ecore:EReference config.ecore#//MutatorConfig/ePackage"/>
-      <genFeatures createChild="false" ecoreFeature="ecore:EAttribute config.ecore#//MutatorConfig/maxDeleteCount"/>
-    </genClasses>
-  </genPackages>
-</genmodel:GenModel>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.properties
deleted file mode 100644
index 77ee4a1..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.properties
+++ /dev/null
Binary files differ
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.xml
deleted file mode 100644
index cea7823..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/plugin.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<?eclipse version="3.0"?>
-
-<!--
- <copyright>
- </copyright>
-
- $Id$
--->
-
-
-<plugin>
-
-   <extension point="org.eclipse.emf.ecore.generated_package">
-      <package
-            uri="http://org/eclipse/emf/emfstore/fuzzy/emf/config"
-            class="org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage"
-            genModel="model/config.genmodel"/>
-   </extension>
-
-</plugin>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/pom.xml
deleted file mode 100644
index a0e121f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/pom.xml
+++ /dev/null
@@ -1,120 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy.emf</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-test-plugin</packaging>
-  
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.eclipse.tycho</groupId>
-        <artifactId>tycho-surefire-plugin</artifactId>
-        <version>${tycho-version}</version>
-
-        <configuration>
-                   
-          <testSuite>org.eclipse.emf.emfstore.fuzzy.emf</testSuite>
-          <testClass>org.eclipse.emf.emfstore.fuzzy.emf.diff.CreateAllDiffs</testClass>
-          <useUIHarness>true</useUIHarness>
-          <useUIThread>false</useUIThread>
-          
-          <argLine>-Dosgi.requiredJavaVersion=1.5 -Xms40m -Xmx512m -DcreateDiffs=${createDiffs}</argLine>
-          <failIfNoTests>false</failIfNoTests>
-          
-          <dependencies> 
-          	<dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.fuzzy.emf</artifactId>
-              <version>0.0.0</version>
-            </dependency>   
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.fuzzy</artifactId>
-              <version>0.0.0</version>
-            </dependency>        
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client.model.edit</artifactId>
-              <version>0.0.0</version>
-            </dependency>
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client.test</artifactId>
-              <version>0.0.0</version>
-            </dependency>
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.client</artifactId>
-              <version>0.0.0</version>
-            </dependency>            
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.modelmutator</artifactId>
-              <version>0.0.0</version>
-            </dependency>            
-            <dependency>
-              <type>eclipse-plugin</type>
-              <artifactId>org.eclipse.emf.emfstore.examplemodel.edit</artifactId>
-              <version>0.0.0</version>
-            </dependency>           
-          </dependencies>
-
-          <bundleStartLevel>  
-          	<bundle>
-              <id>org.eclipse.emf.emfstore.fuzzy.emf</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.fuzzy</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>          
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client.model.edit</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client.test</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.client</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>        
-            <bundle>
-              <id>org.eclipse.emf.emfstore.modelmutator</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>           
-            <bundle>
-              <id>org.eclipse.emf.emfstore.examplemodel.edit</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>
-            <bundle>
-              <id>org.eclipse.emf.emfstore.examplemodel</id>
-              <level>4</level>
-              <autoStart>false</autoStart>
-            </bundle>            
-          </bundleStartLevel> 
-        </configuration>
-       
-      </plugin>
-	</plugins>
-   </build>
-  
-  
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFDataProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFDataProvider.java
deleted file mode 100644
index 6c26f7e..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFDataProvider.java
+++ /dev/null
@@ -1,358 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Date;
-import java.util.List;
-import java.util.Map;
-import java.util.Random;
-import java.util.Set;
-
-import org.dom4j.DocumentException;
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.EditingDomain;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.emfstore.fuzzy.FuzzyDataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Test;
-import org.eclipse.emf.emfstore.fuzzy.Util;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-import org.eclipse.emf.emfstore.fuzzy.emf.diff.HudsonTestRunProvider;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutator;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-import org.junit.runner.notification.RunListener;
-import org.junit.runners.model.TestClass;
-
-/**
- * This implementation of a {@link FuzzyDataProvider} provides generated models using the functionality of
- * {@link ModelMutator}. <br>
- * <br>
- * The run of a test is based on a {@link TestConfig}, defining model etc. <br>
- * <br>
- * During the run it records {@link TestResult}s to create a {@link TestRun} for reporting purpose.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class EMFDataProvider implements FuzzyDataProvider<EObject> {
-
-	private Random random;
-
-	private int count;
-
-	private int seedCount;
-
-	private TestClass testClass;
-
-	private TestRun testRun;
-
-	private TestConfig config;
-
-	private boolean filterTests;
-
-	private String configFile;
-
-	private long nextSeed;
-
-	private EClass rootEClass;
-
-	private ModelMutatorConfiguration modelMutatorConfig;
-
-	private Resource diffResource;
-
-	/**
-	 * Prefix of the properties concerning the {@link EMFDataProvider}.
-	 */
-	public static final String PROP_EMFDATAPROVIDER = ".emfdataprovider";
-
-	/**
-	 * Property specifying the path to the config file for the {@link EMFDataProvider}.
-	 */
-	public static final String PROP_CONFIGS_FILE = ".configsFile";
-
-	/**
-	 * Options constant for the exception log set for the mutator.
-	 * Has to be filled with a <code>Set</code> of <code>RuntimeException</code>.
-	 */
-	public static final String MUTATOR_EXC_LOG = "mutatorExcLog";
-
-	/**
-	 * Options constant for the {@link EditingDomain} for the {@link ModelMutator}.
-	 */
-	public static final String MUTATOR_EDITINGDOMAIN = "mutatorEditingDomain";
-
-	/**
-	 * Init the {@link EMFDataProvider}.
-	 */
-	public void init() {
-		// fill properties like the config file
-		fillProperties();
-
-		// load testconfig from file
-		Resource loadResource = FuzzyUtil.createResource(configFile);
-		try {
-			loadResource.load(null);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not load " + configFile, e);
-		}
-
-		// get the testconfig fitting to the current testclass
-		config = FuzzyUtil.getTestConfig(loadResource, testClass);
-
-		// add the config to the configs file
-		addToConfigFile();
-
-		// init variables
-		random = new Random(config.getSeed());
-		count = config.getCount();
-		seedCount = 0;
-
-		// read variables out of mutatorConfig and write into modelmutatorConfig
-		MutatorConfig mutatorConfig = config.getMutatorConfig();
-		rootEClass = mutatorConfig.getRootEClass();
-		if (rootEClass == null) {
-			rootEClass = ConfigPackage.Literals.ROOT;
-		}
-		modelMutatorConfig = new ModelMutatorConfiguration();
-		modelMutatorConfig.setMinObjectsCount(mutatorConfig.getMinObjectsCount());
-		modelMutatorConfig.setDoNotGenerateRoot(mutatorConfig.isDoNotGenerateRoot());
-		modelMutatorConfig.seteClassesToIgnore(mutatorConfig.getEClassesToIgnore());
-		modelMutatorConfig.seteStructuralFeaturesToIgnore(mutatorConfig.getEStructuralFeaturesToIgnore());
-		modelMutatorConfig.setIgnoreAndLog(mutatorConfig.isIgnoreAndLog());
-		modelMutatorConfig.setUseEcoreUtilDelete(mutatorConfig.isUseEcoreUtilDelete());
-		modelMutatorConfig.setMaxDeleteCount(mutatorConfig.getMaxDeleteCount());
-		modelMutatorConfig.setModelPackages(mutatorConfig.getEPackages());
-
-		// create new TestRun with config
-		testRun = ConfigFactory.eINSTANCE.createTestRun();
-		testRun.setConfig(config);
-		testRun.setTime(new Date());
-	}
-
-	/**
-	 * Add the config to the file containing all configs.
-	 */
-	private void addToConfigFile() {
-		Resource resource = FuzzyUtil.createResource(FuzzyUtil.ROOT_FOLDER + FuzzyUtil.TEST_CONFIG_FILE);
-		try {
-			if (FuzzyUtil.resourceExists(resource)) {
-				resource.load(null);
-			}
-			if (!FuzzyUtil.containsConfig(resource, config)) {
-				resource.getContents().add(config);
-				resource.save(null);
-			}
-		} catch (IOException e) {
-			throw new RuntimeException("Could not save config!", e);
-		}
-	}
-
-	/**
-	 * See {@link FuzzyDataProvider}.
-	 * 
-	 * @param count Which run is it?
-	 * @return The new {@link EObject}.
-	 */
-	public EObject get(int count) {
-		seedCount++;
-
-		// adjust the seed
-		fitSeed(count);
-
-		// generate the model
-		nextSeed = random.nextLong();
-
-		// get the root eclass for the generation
-		EObject root = EcoreUtil.create(rootEClass);
-
-		// generate the model
-		modelMutatorConfig.reset();
-		modelMutatorConfig.setRootEObject(root);
-		modelMutatorConfig.setSeed(nextSeed);
-		ModelMutator.generateModel(modelMutatorConfig);
-
-		return root;
-	}
-
-	private void fitSeed(int count) {
-		if (count == seedCount) {
-			return;
-		} else if (count < seedCount) {
-			random = new Random(config.getSeed());
-			seedCount = 0;
-		}
-
-		while (seedCount < count) {
-			random.nextLong();
-			seedCount++;
-		}
-	}
-
-	/**
-	 * Call finish as last action of the {@link EMFDataProvider}. Used for saving the results.
-	 */
-	public void finish() {
-		// create run resource
-		Resource runResource = FuzzyUtil.createResource(FuzzyUtil.ROOT_FOLDER + FuzzyUtil.RUN_FOLDER + config.getId()
-			+ FuzzyUtil.FILE_SUFFIX);
-		runResource.getContents().add(testRun);
-
-		try {
-			runResource.save(null);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not save the run result after running!", e);
-		}
-	}
-
-	/**
-	 * @return How much objects will be created?
-	 */
-	public int size() {
-		return count;
-	}
-
-	/**
-	 * @param testClass The {@link TestClass} of this run.
-	 */
-	public void setTestClass(TestClass testClass) {
-		this.testClass = testClass;
-	}
-
-	/**
-	 * @return The {@link RunListener} of this {@link EMFDataProvider}.
-	 */
-	public List<RunListener> getListener() {
-		return Arrays.asList(new RunListener[] { new EMFRunListener(this, testRun) });
-	}
-
-	/**
-	 * @return all {@link Test}s to run or null if all tests should run.
-	 */
-	public List<Test> getTestsToRun() {
-		if (!filterTests) {
-			return null;
-		}
-
-		// first time load diffResource
-		if (diffResource == null) {
-			try {
-				diffResource = HudsonTestRunProvider.getDiffResource();
-				diffResource.load(null);
-			} catch (IOException e) {
-				throw new RuntimeException("Could not load diff file!", e);
-			} catch (DocumentException e) {
-				throw new RuntimeException("Could not load diff file!", e);
-			}
-		}
-
-		// filter for correct config
-		EList<EObject> contents = diffResource.getContents();
-		List<Test> tests = new ArrayList<Test>();
-		for (EObject obj : contents) {
-			if (obj instanceof DiffReport) {
-				for (TestDiff diff : ((DiffReport) obj).getDiffs()) {
-					if (diff.getConfig().getId().equals(config.getId())) {
-						TestResult result = FuzzyUtil.getValidTestResult(diff);
-						tests.add(new Test(result.getTestName(), result.getSeedCount()));
-					}
-				}
-			}
-		}
-
-		return tests;
-	}
-
-	/**
-	 * @return The current seed used to create the model
-	 */
-	public int getCurrentSeedCount() {
-		return seedCount;
-	}
-
-	/**
-	 * @return The current seed for the {@link ModelMutator}.
-	 */
-	public long getSeed() {
-		return nextSeed;
-	}
-
-	/**
-	 * @return The {@link EPackage} of the model to generate/mutate.
-	 */
-	public Collection<EPackage> getEPackages() {
-		return modelMutatorConfig.getModelPackages();
-	}
-
-	private void fillProperties() {
-		String filterTests = System.getProperty("filterTests");
-		if (filterTests == null) {
-			this.filterTests = false;
-		} else {
-			this.filterTests = Boolean.parseBoolean(filterTests);
-		}
-		configFile = FuzzyUtil.getProperty(PROP_EMFDATAPROVIDER + PROP_CONFIGS_FILE, FuzzyUtil.TEST_CONFIG_PATH);
-	}
-
-	/**
-	 * @return The {@link MutateUtil} for this {@link EMFDataProvider}.
-	 */
-	public Util getUtil() {
-		return new MutateUtil(this);
-	}
-
-	/**
-	 * @return The config specifying this run of the {@link EMFDataProvider}.
-	 */
-	public TestConfig getConfig() {
-		return config;
-	}
-
-	/**
-	 * Set the options for the {@link EMFDataProvider}.
-	 * 
-	 * @param options the options.
-	 */
-	@SuppressWarnings("unchecked")
-	public void setOptions(Map<String, Object> options) {
-		// exc log
-		Object o = options.get(MUTATOR_EXC_LOG);
-		if (o != null && o instanceof Set<?>) {
-			this.modelMutatorConfig.setExceptionLog((Set<RuntimeException>) o);
-		}
-
-		// model mutator editing domain
-		o = options.get(MUTATOR_EDITINGDOMAIN);
-		if (o != null && o instanceof EditingDomain) {
-			this.modelMutatorConfig.setEditingDomain((EditingDomain) o);
-		}
-	}
-
-	/**
-	 * @return The currently active {@link ModelMutatorConfiguration}.
-	 */
-	public ModelMutatorConfiguration getModelMutatorConfiguration() {
-		return modelMutatorConfig;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFRunListener.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFRunListener.java
deleted file mode 100644
index a9c2c79..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/EMFRunListener.java
+++ /dev/null
@@ -1,111 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf;
-
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-import junit.framework.AssertionFailedError;
-
-import org.eclipse.emf.emfstore.fuzzy.FuzzyRunner;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-import org.junit.runner.Description;
-import org.junit.runner.Result;
-import org.junit.runner.notification.Failure;
-import org.junit.runner.notification.RunListener;
-
-/**
- * {@link RunListener} used to create the report of a run of the {@link EMFDataProvider}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class EMFRunListener extends RunListener {
-
-	private TestRun testRun;
-
-	private EMFDataProvider dataProvider;
-
-	private TestResult testResult;
-
-	private long testStartTime;
-
-	private String className;
-
-	/**
-	 * @param dataProvider The {@link EMFDataProvider} containing the infos.
-	 * @param testRun The {@link TestRun} where to save the results.
-	 */
-	public EMFRunListener(EMFDataProvider dataProvider, TestRun testRun) {
-		this.dataProvider = dataProvider;
-		this.testRun = testRun;
-		className = dataProvider.getConfig().getTestClass().getName();
-	}
-
-	@Override
-	public void testRunFinished(Result result) {
-		dataProvider.finish();
-	}
-
-	@Override
-	public void testStarted(Description description) {
-		if (filter(description)) {
-			return;
-		}
-		testResult = ConfigFactory.eINSTANCE.createTestResult();
-		testResult.setTestName(description.getMethodName().split(FuzzyRunner.NAME_SEPARATOR)[0]);
-		testStartTime = System.currentTimeMillis();
-	}
-
-	@Override
-	public void testFinished(Description description) {
-		if (filter(description)) {
-			return;
-		}
-		testResult.setExecutionTime(System.currentTimeMillis() - testStartTime);
-		testResult.setSeedCount(dataProvider.getCurrentSeedCount());
-		testRun.getResults().add(testResult);
-	}
-
-	@Override
-	public void testFailure(Failure failure) {
-		if (filter(failure.getDescription())) {
-			return;
-		}
-		
-		Throwable throwable = failure.getException();
-		StringWriter sw = new StringWriter();
-		PrintWriter pw = new PrintWriter(sw);
-		try{
-			throwable.printStackTrace(new PrintWriter(sw));
-	
-			if (throwable instanceof AssertionFailedError) {
-				testResult.setFailure(sw.toString());
-			} else {
-				testResult.setError(sw.toString());
-			}
-		} finally {
-			try {
-				sw.close();
-			} catch (IOException e) {
-				throw new RuntimeException(e);
-			}
-			pw.close();
-		}
-	}
-
-	private boolean filter(Description description) {
-		return !description.getClassName().equals(className);
-	}
-}
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FilteredSuite.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FilteredSuite.java
deleted file mode 100644
index dc8e820..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FilteredSuite.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf;
-
-import java.util.ArrayList;
-import java.util.List;
-
-import org.junit.runner.Runner;
-import org.junit.runners.Suite;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.RunnerBuilder;
-
-/**
- * {@link Suite} to filter tests and run only when runFuzzyTests system property is true. 
- * 
- * @author Julian Sommerfeldt
- *
- */
-public class FilteredSuite extends Suite {
-
-	private static final String RUN_FUZZY_TESTS = "runFuzzyTests";
-	
-	/**
-	 * Called reflectively on classes annotated with <code>@RunWith(Suite.class)</code>.
-	 * 
-	 * @param klass the root class
-	 * @param builder builds runners for classes in the suite
-	 * @throws InitializationError if a class could not be initialized.
-	 */
-	public FilteredSuite(Class<?> klass, RunnerBuilder builder) throws InitializationError {
-		super(klass, builder);
-	}
-	
-	@Override
-	protected List<Runner> getChildren() {
-		if(Boolean.parseBoolean(System.getProperty(RUN_FUZZY_TESTS))){
-			return super.getChildren();
-		}
-		return new ArrayList<Runner>();
-	}
-}
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FuzzyUtil.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FuzzyUtil.java
deleted file mode 100644
index 4874a49..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/FuzzyUtil.java
+++ /dev/null
@@ -1,200 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.util.Properties;
-
-import org.eclipse.emf.common.command.BasicCommandStack;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.edit.domain.AdapterFactoryEditingDomain;
-import org.eclipse.emf.edit.provider.ComposedAdapterFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.junit.runners.model.TestClass;
-
-/**
- * Utility class for different methods used in {@link EMFDataProvider} context.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public final class FuzzyUtil {
-
-	// TODO make folders etc configurable
-	/**
-	 * The main folder containing all files.
-	 */
-	public static final String FUZZY_FOLDER = "fuzzy/";
-
-	/**
-	 * The folder where to put the artifacts.
-	 */
-	public static final String ROOT_FOLDER = "../" + FUZZY_FOLDER;
-
-	/**
-	 * The folder where to store the {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun}s.
-	 */
-	public static final String RUN_FOLDER = "testruns/";
-
-	/**
-	 * The file suffix for the files.
-	 */
-	public static final String FILE_SUFFIX = ".xml";
-
-	/**
-	 * The file containing the {@link TestConfig}s.
-	 */
-	public static final String TEST_CONFIG_FILE = "fuzzyConfig.fuzzy";
-
-	/**
-	 * The path to the TEST_CONFIG_FILE.
-	 */
-	public static final String TEST_CONFIG_PATH = FUZZY_FOLDER + TEST_CONFIG_FILE;
-
-	/**
-	 * The path to the file containing the {@link TestDiff}.
-	 */
-	public static final String DIFF_FILE = ROOT_FOLDER + "diff" + FILE_SUFFIX;
-
-	/**
-	 * The path to the properties file.
-	 */
-	public static final String PROPERTIES_FILE = FUZZY_FOLDER + "fuzzy.properties";
-
-	/**
-	 * The prefix for all fuzzy properties in the properties file.
-	 */
-	public static final String PROP_PRE = "fuzzy";
-
-	private static final AdapterFactoryEditingDomain EDITING_DOMAIN = new AdapterFactoryEditingDomain(
-		new ComposedAdapterFactory(ComposedAdapterFactory.Descriptor.Registry.INSTANCE), new BasicCommandStack());
-
-	private static Properties properties;
-
-	private FuzzyUtil() {
-	}
-
-	/**
-	 * Searches in the resource for a {@link TestConfig} fitting to the given {@link TestClass}.
-	 * 
-	 * @param resource The resource where to search in.
-	 * @param testClass The TestClass to which the {@link TestConfig} should fit.
-	 * @return The {@link TestConfig} fitting to the {@link TestClass}.
-	 */
-	public static TestConfig getTestConfig(Resource resource, TestClass testClass) {
-		// TODO add a standard TestConfig? e.g. where clazz = null / or testconfig for complete packages
-		for (EObject object : resource.getContents()) {
-			if (object instanceof TestConfig) {
-				TestConfig config = (TestConfig) object;
-				Class<?> clazz = config.getTestClass();
-				if (clazz.getName().equals(testClass.getJavaClass().getName())) {
-					return config;
-				}
-			}
-		}
-
-		throw new IllegalArgumentException("No fitting testconfig for " + testClass.getName() + " in "
-			+ resource.getURI() + " found.");
-	}
-
-	/**
-	 * Checks if a resource contains a {@link TestConfig}.
-	 * 
-	 * @param resource The resource where to search in.
-	 * @param config The {@link TestConfig} to check.
-	 * @return <code>true</code> if the resource contains the {@link TestConfig}, else <code>false</code>.
-	 */
-	public static boolean containsConfig(Resource resource, TestConfig config) {
-		for (EObject obj : resource.getContents()) {
-			if (obj instanceof TestConfig) {
-				TestConfig c = (TestConfig) obj;
-				if (c.getId().equals(config.getId())) {
-					return true;
-				}
-			}
-		}
-		return false;
-	}
-
-	/**
-	 * Checks if the resource exists.
-	 * 
-	 * @param resource The {@link Resource} to check.
-	 * @return <code>true</code> if the resource exists, <code>false</code> otherwise.
-	 */
-	public static boolean resourceExists(Resource resource) {
-		return resource.getResourceSet().getURIConverter().exists(resource.getURI(), null);
-	}
-
-	/**
-	 * Create a new {@link Resource}.
-	 * 
-	 * @param fileNameURI The uri of the resource.
-	 * @return The newly created {@link Resource}.
-	 */
-	public static Resource createResource(String fileNameURI) {
-		return EDITING_DOMAIN.createResource(fileNameURI);
-	}
-
-	/**
-	 * Get a valid {@link TestResult} out of a {@link TestDiff}. Valid means non null.
-	 * 
-	 * @param diff The {@link TestDiff} containing the {@link TestResult}.
-	 * @return The valid {@link TestResult} of the {@link TestDiff}.
-	 */
-	public static TestResult getValidTestResult(TestDiff diff) {
-		TestResult result = diff.getOldResult();
-		if (result != null) {
-			return result;
-		}
-		result = diff.getNewResult();
-		if (result != null) {
-			return result;
-		}
-		throw new RuntimeException("Configuration of TestDiff is wrong! (Does not contain any TestResult)");
-	}
-
-	/**
-	 * Get a property out of the properties file.
-	 * 
-	 * @param key The key of the property.
-	 * @param defaultValue The value if the properties do not contain the key.
-	 * @return The value if the properties contain the key or the defaultValue if not.
-	 */
-	public static String getProperty(String key, String defaultValue) {
-		initProperties();
-		return properties.getProperty(PROP_PRE + key, defaultValue);
-	}
-
-	private static void initProperties() {
-		if (properties != null) {
-			return;
-		}
-
-		File file = new File(PROPERTIES_FILE);
-		properties = new Properties();
-
-		if (file.exists()) {
-			try {
-				FileInputStream fs = new FileInputStream(file);
-				properties.load(fs);
-				fs.close();
-			} catch (IOException e) {
-				throw new RuntimeException("Could not load properties from " + file.getAbsolutePath(), e);
-			}
-		}
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/MutateUtil.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/MutateUtil.java
deleted file mode 100644
index 004fa47..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/MutateUtil.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf;
-
-import java.io.IOException;
-import java.util.Collection;
-import java.util.HashMap;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.URI;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.ecore.xmi.XMLResource;
-import org.eclipse.emf.emfstore.fuzzy.Util;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutator;
-import org.eclipse.emf.emfstore.internal.modelmutator.api.ModelMutatorConfiguration;
-
-/**
- * A {@link Util} class for tests using the {@link EMFDataProvider}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class MutateUtil implements Util {
-
-	private EMFDataProvider dataProvider;
-
-	/**
-	 * For internal use.
-	 * 
-	 * @param dataProvider The {@link EMFDataProvider} of the test.
-	 */
-	public MutateUtil(EMFDataProvider dataProvider) {
-		this.dataProvider = dataProvider;
-	}
-
-	/**
-	 * @return The {@link EPackage} of the {@link EMFDataProvider}.
-	 */
-	public Collection<EPackage> getEPackages() {
-		return dataProvider.getEPackages();
-	}
-
-	/**
-	 * @return The minimum objects count of the current {@link ModelMutatorConfiguration} of the {@link EMFDataProvider}
-	 *         .
-	 */
-	public int getMinObjectsCount() {
-		return dataProvider.getModelMutatorConfiguration().getMinObjectsCount();
-	}
-
-	/**
-	 * @return The seed of the {@link EMFDataProvider}.
-	 */
-	public long getSeed() {
-		return dataProvider.getSeed();
-	}
-
-	/**
-	 * @return The current seed (run) of the {@link EMFDataProvider}.
-	 */
-	public int getSeedCount() {
-		return dataProvider.getCurrentSeedCount();
-	}
-
-	/**
-	 * @return The EClasses to ignore in the current {@link ModelMutatorConfiguration}.
-	 */
-	public Collection<EClass> getEClassesToIgnore() {
-		return dataProvider.getModelMutatorConfiguration().geteClassesToIgnore();
-	}
-
-	/**
-	 * @return The {@link EStructuralFeature}s to ignore in the current {@link ModelMutatorConfiguration}.
-	 */
-	public Collection<EStructuralFeature> getEStructuralFeaturesToIgnore() {
-		return dataProvider.getModelMutatorConfiguration().geteStructuralFeaturesToIgnore();
-	}
-
-	/**
-	 * Mutate with a {@link ModelMutatorConfiguration}.
-	 * 
-	 * @param mmc The {@link ModelMutatorConfiguration} to use for mutation.
-	 */
-	public void mutate(final ModelMutatorConfiguration mmc) {
-		ModelMutator.changeModel(mmc);
-	}
-
-	/**
-	 * @see #saveEObject(EObject, String)
-	 * 
-	 * @param obj The {@link EObject} to save.
-	 */
-	public void saveEObject(EObject obj) {
-		saveEObject(obj, null, true);
-	}
-
-	/**
-	 * Save an {@link EObject} in the folder: artifacts/runs/configID.
-	 * 
-	 * Use it for instance to save objects, when an error occurs.
-	 * 
-	 * The file name is always: COUNT_SUFFIX.xml so e.g. 3_testFile.xml
-	 * 
-	 * @param obj The EObject to save.
-	 * @param suffix The suffix of the file: e.g. testFile. <code>null</code> permitted.
-	 * @param discardDanglingHREF Should the save ignore dangling hrefs?
-	 */
-	public void saveEObject(EObject obj, String suffix, boolean discardDanglingHREF) {
-		Resource resource = FuzzyUtil.createResource(getRunResourcePath(suffix));
-		resource.getContents().add(obj);
-
-		try {
-			Map<Object, Object> options = new HashMap<Object, Object>();
-			if (discardDanglingHREF) {
-				options.put(XMLResource.OPTION_PROCESS_DANGLING_HREF, XMLResource.OPTION_PROCESS_DANGLING_HREF_DISCARD);
-			}
-			resource.save(options);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not save the eobject: " + obj, e);
-		}
-	}
-
-	/**
-	 * @param suffix The suffix for the file: e.g. testFile. <code>null</code> permitted.
-	 * @return A file path to the current run folder.
-	 */
-	public String getRunResourcePath(String suffix) {
-		String toAdd = (suffix == null || "".equals(suffix)) ? "" : "_" + suffix;
-		return FuzzyUtil.ROOT_FOLDER + FuzzyUtil.RUN_FOLDER + dataProvider.getConfig().getId() + "/"
-			+ dataProvider.getCurrentSeedCount() + toAdd + FuzzyUtil.FILE_SUFFIX;
-	}
-
-	/**
-	 * 
-	 * @param suffix The suffix for the file: e.g. testFile. <code>null</code> permitted.
-	 * @return A file {@link URI} to the current run folder.
-	 */
-	public URI getRunResourceURI(String suffix) {
-		return URI.createFileURI(getRunResourcePath(suffix));
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigFactory.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigFactory.java
deleted file mode 100644
index 563c495..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigFactory.java
+++ /dev/null
@@ -1,114 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.ecore.EFactory;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Factory</b> for the model.
- * It provides a create method for each non-abstract class of the model.
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage
- * @generated
- */
-public interface ConfigFactory extends EFactory {
-	/**
-	 * The singleton instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	ConfigFactory eINSTANCE = org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigFactoryImpl.init();
-
-	/**
-	 * Returns a new object of class '<em>Test Config</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Test Config</em>'.
-	 * @generated
-	 */
-	TestConfig createTestConfig();
-
-	/**
-	 * Returns a new object of class '<em>Test Run</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Test Run</em>'.
-	 * @generated
-	 */
-	TestRun createTestRun();
-
-	/**
-	 * Returns a new object of class '<em>Test Result</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Test Result</em>'.
-	 * @generated
-	 */
-	TestResult createTestResult();
-
-	/**
-	 * Returns a new object of class '<em>Test Diff</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Test Diff</em>'.
-	 * @generated
-	 */
-	TestDiff createTestDiff();
-
-	/**
-	 * Returns a new object of class '<em>Diff Report</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Diff Report</em>'.
-	 * @generated
-	 */
-	DiffReport createDiffReport();
-
-	/**
-	 * Returns a new object of class '<em>Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Root</em>'.
-	 * @generated
-	 */
-	Root createRoot();
-
-	/**
-	 * Returns a new object of class '<em>Mutator Config</em>'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return a new object of class '<em>Mutator Config</em>'.
-	 * @generated
-	 */
-	MutatorConfig createMutatorConfig();
-
-	/**
-	 * Returns the package supported by this factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the package supported by this factory.
-	 * @generated
-	 */
-	ConfigPackage getConfigPackage();
-
-} // ConfigFactory
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigPackage.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigPackage.java
deleted file mode 100644
index 06fa0ce..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/ConfigPackage.java
+++ /dev/null
@@ -1,1316 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Package</b> for the model.
- * It contains accessors for the meta objects to represent
- * <ul>
- * <li>each class,</li>
- * <li>each feature of each class,</li>
- * <li>each enum,</li>
- * <li>and each data type</li>
- * </ul>
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory
- * @model kind="package"
- * @generated
- */
-public interface ConfigPackage extends EPackage {
-	/**
-	 * The package name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNAME = "config";
-
-	/**
-	 * The package namespace URI.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_URI = "http://org/eclipse/emf/emfstore/fuzzy/emf/config";
-
-	/**
-	 * The package namespace name.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	String eNS_PREFIX = "org.eclipse.emf.emfstore.fuzzy.emf.config";
-
-	/**
-	 * The singleton instance of the package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	ConfigPackage eINSTANCE = org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl.init();
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl
-	 * <em>Test Config</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestConfig()
-	 * @generated
-	 */
-	int TEST_CONFIG = 0;
-
-	/**
-	 * The feature id for the '<em><b>Seed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG__SEED = 0;
-
-	/**
-	 * The feature id for the '<em><b>Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG__COUNT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Test Class</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG__TEST_CLASS = 2;
-
-	/**
-	 * The feature id for the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG__ID = 3;
-
-	/**
-	 * The feature id for the '<em><b>Mutator Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG__MUTATOR_CONFIG = 4;
-
-	/**
-	 * The number of structural features of the '<em>Test Config</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_CONFIG_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl <em>Test Run</em>}'
-	 * class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestRun()
-	 * @generated
-	 */
-	int TEST_RUN = 1;
-
-	/**
-	 * The feature id for the '<em><b>Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RUN__CONFIG = 0;
-
-	/**
-	 * The feature id for the '<em><b>Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RUN__TIME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Results</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RUN__RESULTS = 2;
-
-	/**
-	 * The number of structural features of the '<em>Test Run</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RUN_FEATURE_COUNT = 3;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl
-	 * <em>Test Result</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestResult()
-	 * @generated
-	 */
-	int TEST_RESULT = 2;
-
-	/**
-	 * The feature id for the '<em><b>Seed Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT__SEED_COUNT = 0;
-
-	/**
-	 * The feature id for the '<em><b>Test Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT__TEST_NAME = 1;
-
-	/**
-	 * The feature id for the '<em><b>Error</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT__ERROR = 2;
-
-	/**
-	 * The feature id for the '<em><b>Failure</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT__FAILURE = 3;
-
-	/**
-	 * The feature id for the '<em><b>Execution Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT__EXECUTION_TIME = 4;
-
-	/**
-	 * The number of structural features of the '<em>Test Result</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_RESULT_FEATURE_COUNT = 5;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl
-	 * <em>Test Diff</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestDiff()
-	 * @generated
-	 */
-	int TEST_DIFF = 3;
-
-	/**
-	 * The feature id for the '<em><b>Last Update</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_DIFF__LAST_UPDATE = 0;
-
-	/**
-	 * The feature id for the '<em><b>Config</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_DIFF__CONFIG = 1;
-
-	/**
-	 * The feature id for the '<em><b>Old Result</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_DIFF__OLD_RESULT = 2;
-
-	/**
-	 * The feature id for the '<em><b>New Result</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_DIFF__NEW_RESULT = 3;
-
-	/**
-	 * The number of structural features of the '<em>Test Diff</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int TEST_DIFF_FEATURE_COUNT = 4;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.DiffReportImpl
-	 * <em>Diff Report</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.DiffReportImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getDiffReport()
-	 * @generated
-	 */
-	int DIFF_REPORT = 4;
-
-	/**
-	 * The feature id for the '<em><b>Diffs</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int DIFF_REPORT__DIFFS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Diff Report</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int DIFF_REPORT_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.RootImpl <em>Root</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.RootImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getRoot()
-	 * @generated
-	 */
-	int ROOT = 5;
-
-	/**
-	 * The feature id for the '<em><b>Elements</b></em>' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ROOT__ELEMENTS = 0;
-
-	/**
-	 * The number of structural features of the '<em>Root</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int ROOT_FEATURE_COUNT = 1;
-
-	/**
-	 * The meta object id for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl
-	 * <em>Mutator Config</em>}' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getMutatorConfig()
-	 * @generated
-	 */
-	int MUTATOR_CONFIG = 6;
-
-	/**
-	 * The feature id for the '<em><b>Root EClass</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__ROOT_ECLASS = 0;
-
-	/**
-	 * The feature id for the '<em><b>Min Objects Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__MIN_OBJECTS_COUNT = 1;
-
-	/**
-	 * The feature id for the '<em><b>Ignore And Log</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__IGNORE_AND_LOG = 2;
-
-	/**
-	 * The feature id for the '<em><b>Do Not Generate Root</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT = 3;
-
-	/**
-	 * The feature id for the '<em><b>Use Ecore Util Delete</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE = 4;
-
-	/**
-	 * The feature id for the '<em><b>EClasses To Ignore</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__ECLASSES_TO_IGNORE = 5;
-
-	/**
-	 * The feature id for the '<em><b>EStructural Features To Ignore</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE = 6;
-
-	/**
-	 * The feature id for the '<em><b>EPackages</b></em>' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__EPACKAGES = 7;
-
-	/**
-	 * The feature id for the '<em><b>Max Delete Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG__MAX_DELETE_COUNT = 8;
-
-	/**
-	 * The number of structural features of the '<em>Mutator Config</em>' class.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 * @ordered
-	 */
-	int MUTATOR_CONFIG_FEATURE_COUNT = 9;
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig
-	 * <em>Test Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Test Config</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig
-	 * @generated
-	 */
-	EClass getTestConfig();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getSeed
-	 * <em>Seed</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Seed</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getSeed()
-	 * @see #getTestConfig()
-	 * @generated
-	 */
-	EAttribute getTestConfig_Seed();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getCount
-	 * <em>Count</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Count</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getCount()
-	 * @see #getTestConfig()
-	 * @generated
-	 */
-	EAttribute getTestConfig_Count();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getTestClass <em>Test Class</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Test Class</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getTestClass()
-	 * @see #getTestConfig()
-	 * @generated
-	 */
-	EAttribute getTestConfig_TestClass();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getId
-	 * <em>Id</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Id</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getId()
-	 * @see #getTestConfig()
-	 * @generated
-	 */
-	EAttribute getTestConfig_Id();
-
-	/**
-	 * Returns the meta object for the containment reference '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getMutatorConfig <em>Mutator Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference '<em>Mutator Config</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getMutatorConfig()
-	 * @see #getTestConfig()
-	 * @generated
-	 */
-	EReference getTestConfig_MutatorConfig();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun <em>Test Run</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Test Run</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun
-	 * @generated
-	 */
-	EClass getTestRun();
-
-	/**
-	 * Returns the meta object for the containment reference '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getConfig <em>Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference '<em>Config</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getConfig()
-	 * @see #getTestRun()
-	 * @generated
-	 */
-	EReference getTestRun_Config();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getTime
-	 * <em>Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Time</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getTime()
-	 * @see #getTestRun()
-	 * @generated
-	 */
-	EAttribute getTestRun_Time();
-
-	/**
-	 * Returns the meta object for the containment reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getResults <em>Results</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Results</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getResults()
-	 * @see #getTestRun()
-	 * @generated
-	 */
-	EReference getTestRun_Results();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult
-	 * <em>Test Result</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Test Result</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult
-	 * @generated
-	 */
-	EClass getTestResult();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getSeedCount <em>Seed Count</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Seed Count</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getSeedCount()
-	 * @see #getTestResult()
-	 * @generated
-	 */
-	EAttribute getTestResult_SeedCount();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getTestName <em>Test Name</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Test Name</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getTestName()
-	 * @see #getTestResult()
-	 * @generated
-	 */
-	EAttribute getTestResult_TestName();
-
-	/**
-	 * Returns the meta object for the attribute '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getError
-	 * <em>Error</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Error</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getError()
-	 * @see #getTestResult()
-	 * @generated
-	 */
-	EAttribute getTestResult_Error();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getFailure <em>Failure</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Failure</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getFailure()
-	 * @see #getTestResult()
-	 * @generated
-	 */
-	EAttribute getTestResult_Failure();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getExecutionTime <em>Execution Time</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Execution Time</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getExecutionTime()
-	 * @see #getTestResult()
-	 * @generated
-	 */
-	EAttribute getTestResult_ExecutionTime();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff <em>Test Diff</em>}
-	 * '.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Test Diff</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff
-	 * @generated
-	 */
-	EClass getTestDiff();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getLastUpdate <em>Last Update</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Last Update</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getLastUpdate()
-	 * @see #getTestDiff()
-	 * @generated
-	 */
-	EAttribute getTestDiff_LastUpdate();
-
-	/**
-	 * Returns the meta object for the reference '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getConfig
-	 * <em>Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Config</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getConfig()
-	 * @see #getTestDiff()
-	 * @generated
-	 */
-	EReference getTestDiff_Config();
-
-	/**
-	 * Returns the meta object for the containment reference '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getOldResult <em>Old Result</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference '<em>Old Result</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getOldResult()
-	 * @see #getTestDiff()
-	 * @generated
-	 */
-	EReference getTestDiff_OldResult();
-
-	/**
-	 * Returns the meta object for the containment reference '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getNewResult <em>New Result</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference '<em>New Result</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getNewResult()
-	 * @see #getTestDiff()
-	 * @generated
-	 */
-	EReference getTestDiff_NewResult();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport
-	 * <em>Diff Report</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Diff Report</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport
-	 * @generated
-	 */
-	EClass getDiffReport();
-
-	/**
-	 * Returns the meta object for the containment reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport#getDiffs <em>Diffs</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Diffs</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport#getDiffs()
-	 * @see #getDiffReport()
-	 * @generated
-	 */
-	EReference getDiffReport_Diffs();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root <em>Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Root</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.Root
-	 * @generated
-	 */
-	EClass getRoot();
-
-	/**
-	 * Returns the meta object for the containment reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root#getElements <em>Elements</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the containment reference list '<em>Elements</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.Root#getElements()
-	 * @see #getRoot()
-	 * @generated
-	 */
-	EReference getRoot_Elements();
-
-	/**
-	 * Returns the meta object for class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig
-	 * <em>Mutator Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for class '<em>Mutator Config</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig
-	 * @generated
-	 */
-	EClass getMutatorConfig();
-
-	/**
-	 * Returns the meta object for the reference '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getRootEClass <em>Root EClass</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference '<em>Root EClass</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getRootEClass()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EReference getMutatorConfig_RootEClass();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMinObjectsCount <em>Min Objects Count</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Min Objects Count</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMinObjectsCount()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EAttribute getMutatorConfig_MinObjectsCount();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isIgnoreAndLog <em>Ignore And Log</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Ignore And Log</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isIgnoreAndLog()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EAttribute getMutatorConfig_IgnoreAndLog();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isDoNotGenerateRoot <em>Do Not Generate Root</em>}
-	 * '.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Do Not Generate Root</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isDoNotGenerateRoot()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EAttribute getMutatorConfig_DoNotGenerateRoot();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isUseEcoreUtilDelete
-	 * <em>Use Ecore Util Delete</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Use Ecore Util Delete</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isUseEcoreUtilDelete()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EAttribute getMutatorConfig_UseEcoreUtilDelete();
-
-	/**
-	 * Returns the meta object for the reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEClassesToIgnore <em>EClasses To Ignore</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>EClasses To Ignore</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEClassesToIgnore()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EReference getMutatorConfig_EClassesToIgnore();
-
-	/**
-	 * Returns the meta object for the reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEStructuralFeaturesToIgnore
-	 * <em>EStructural Features To Ignore</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>EStructural Features To Ignore</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEStructuralFeaturesToIgnore()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EReference getMutatorConfig_EStructuralFeaturesToIgnore();
-
-	/**
-	 * Returns the meta object for the reference list '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEPackages <em>EPackages</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the reference list '<em>EPackages</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEPackages()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EReference getMutatorConfig_EPackages();
-
-	/**
-	 * Returns the meta object for the attribute '
-	 * {@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMaxDeleteCount <em>Max Delete Count</em>}'.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the meta object for the attribute '<em>Max Delete Count</em>'.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMaxDeleteCount()
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	EAttribute getMutatorConfig_MaxDeleteCount();
-
-	/**
-	 * Returns the factory that creates the instances of the model.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the factory that creates the instances of the model.
-	 * @generated
-	 */
-	ConfigFactory getConfigFactory();
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * Defines literals for the meta objects that represent
-	 * <ul>
-	 * <li>each class,</li>
-	 * <li>each feature of each class,</li>
-	 * <li>each enum,</li>
-	 * <li>and each data type</li>
-	 * </ul>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	interface Literals {
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl
-		 * <em>Test Config</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestConfig()
-		 * @generated
-		 */
-		EClass TEST_CONFIG = eINSTANCE.getTestConfig();
-
-		/**
-		 * The meta object literal for the '<em><b>Seed</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_CONFIG__SEED = eINSTANCE.getTestConfig_Seed();
-
-		/**
-		 * The meta object literal for the '<em><b>Count</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_CONFIG__COUNT = eINSTANCE.getTestConfig_Count();
-
-		/**
-		 * The meta object literal for the '<em><b>Test Class</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_CONFIG__TEST_CLASS = eINSTANCE.getTestConfig_TestClass();
-
-		/**
-		 * The meta object literal for the '<em><b>Id</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_CONFIG__ID = eINSTANCE.getTestConfig_Id();
-
-		/**
-		 * The meta object literal for the '<em><b>Mutator Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_CONFIG__MUTATOR_CONFIG = eINSTANCE.getTestConfig_MutatorConfig();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl
-		 * <em>Test Run</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestRun()
-		 * @generated
-		 */
-		EClass TEST_RUN = eINSTANCE.getTestRun();
-
-		/**
-		 * The meta object literal for the '<em><b>Config</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_RUN__CONFIG = eINSTANCE.getTestRun_Config();
-
-		/**
-		 * The meta object literal for the '<em><b>Time</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RUN__TIME = eINSTANCE.getTestRun_Time();
-
-		/**
-		 * The meta object literal for the '<em><b>Results</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_RUN__RESULTS = eINSTANCE.getTestRun_Results();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl
-		 * <em>Test Result</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestResult()
-		 * @generated
-		 */
-		EClass TEST_RESULT = eINSTANCE.getTestResult();
-
-		/**
-		 * The meta object literal for the '<em><b>Seed Count</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RESULT__SEED_COUNT = eINSTANCE.getTestResult_SeedCount();
-
-		/**
-		 * The meta object literal for the '<em><b>Test Name</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RESULT__TEST_NAME = eINSTANCE.getTestResult_TestName();
-
-		/**
-		 * The meta object literal for the '<em><b>Error</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RESULT__ERROR = eINSTANCE.getTestResult_Error();
-
-		/**
-		 * The meta object literal for the '<em><b>Failure</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RESULT__FAILURE = eINSTANCE.getTestResult_Failure();
-
-		/**
-		 * The meta object literal for the '<em><b>Execution Time</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_RESULT__EXECUTION_TIME = eINSTANCE.getTestResult_ExecutionTime();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl
-		 * <em>Test Diff</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getTestDiff()
-		 * @generated
-		 */
-		EClass TEST_DIFF = eINSTANCE.getTestDiff();
-
-		/**
-		 * The meta object literal for the '<em><b>Last Update</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute TEST_DIFF__LAST_UPDATE = eINSTANCE.getTestDiff_LastUpdate();
-
-		/**
-		 * The meta object literal for the '<em><b>Config</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_DIFF__CONFIG = eINSTANCE.getTestDiff_Config();
-
-		/**
-		 * The meta object literal for the '<em><b>Old Result</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_DIFF__OLD_RESULT = eINSTANCE.getTestDiff_OldResult();
-
-		/**
-		 * The meta object literal for the '<em><b>New Result</b></em>' containment reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference TEST_DIFF__NEW_RESULT = eINSTANCE.getTestDiff_NewResult();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.DiffReportImpl
-		 * <em>Diff Report</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.DiffReportImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getDiffReport()
-		 * @generated
-		 */
-		EClass DIFF_REPORT = eINSTANCE.getDiffReport();
-
-		/**
-		 * The meta object literal for the '<em><b>Diffs</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference DIFF_REPORT__DIFFS = eINSTANCE.getDiffReport_Diffs();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.RootImpl
-		 * <em>Root</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.RootImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getRoot()
-		 * @generated
-		 */
-		EClass ROOT = eINSTANCE.getRoot();
-
-		/**
-		 * The meta object literal for the '<em><b>Elements</b></em>' containment reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference ROOT__ELEMENTS = eINSTANCE.getRoot_Elements();
-
-		/**
-		 * The meta object literal for the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl
-		 * <em>Mutator Config</em>}' class.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl
-		 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.impl.ConfigPackageImpl#getMutatorConfig()
-		 * @generated
-		 */
-		EClass MUTATOR_CONFIG = eINSTANCE.getMutatorConfig();
-
-		/**
-		 * The meta object literal for the '<em><b>Root EClass</b></em>' reference feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference MUTATOR_CONFIG__ROOT_ECLASS = eINSTANCE.getMutatorConfig_RootEClass();
-
-		/**
-		 * The meta object literal for the '<em><b>Min Objects Count</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute MUTATOR_CONFIG__MIN_OBJECTS_COUNT = eINSTANCE.getMutatorConfig_MinObjectsCount();
-
-		/**
-		 * The meta object literal for the '<em><b>Ignore And Log</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute MUTATOR_CONFIG__IGNORE_AND_LOG = eINSTANCE.getMutatorConfig_IgnoreAndLog();
-
-		/**
-		 * The meta object literal for the '<em><b>Do Not Generate Root</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT = eINSTANCE.getMutatorConfig_DoNotGenerateRoot();
-
-		/**
-		 * The meta object literal for the '<em><b>Use Ecore Util Delete</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE = eINSTANCE.getMutatorConfig_UseEcoreUtilDelete();
-
-		/**
-		 * The meta object literal for the '<em><b>EClasses To Ignore</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference MUTATOR_CONFIG__ECLASSES_TO_IGNORE = eINSTANCE.getMutatorConfig_EClassesToIgnore();
-
-		/**
-		 * The meta object literal for the '<em><b>EStructural Features To Ignore</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE = eINSTANCE
-			.getMutatorConfig_EStructuralFeaturesToIgnore();
-
-		/**
-		 * The meta object literal for the '<em><b>EPackages</b></em>' reference list feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EReference MUTATOR_CONFIG__EPACKAGES = eINSTANCE.getMutatorConfig_EPackages();
-
-		/**
-		 * The meta object literal for the '<em><b>Max Delete Count</b></em>' attribute feature.
-		 * <!-- begin-user-doc -->
-		 * <!-- end-user-doc -->
-		 * 
-		 * @generated
-		 */
-		EAttribute MUTATOR_CONFIG__MAX_DELETE_COUNT = eINSTANCE.getMutatorConfig_MaxDeleteCount();
-
-	}
-
-} // ConfigPackage
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/DiffReport.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/DiffReport.java
deleted file mode 100644
index 0a61d81..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/DiffReport.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Diff Report</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport#getDiffs <em>Diffs</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getDiffReport()
- * @model
- * @generated
- */
-public interface DiffReport extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Diffs</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Diffs</em>' containment reference list isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Diffs</em>' containment reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getDiffReport_Diffs()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EList<TestDiff> getDiffs();
-
-} // DiffReport
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/MutatorConfig.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/MutatorConfig.java
deleted file mode 100644
index 914be59..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/MutatorConfig.java
+++ /dev/null
@@ -1,277 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Mutator Config</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getRootEClass <em>Root EClass</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMinObjectsCount <em>Min Objects Count</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isIgnoreAndLog <em>Ignore And Log</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isDoNotGenerateRoot <em>Do Not Generate Root</em>}
- * </li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isUseEcoreUtilDelete <em>Use Ecore Util Delete
- * </em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEClassesToIgnore <em>EClasses To Ignore</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEStructuralFeaturesToIgnore <em>EStructural
- * Features To Ignore</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getEPackages <em>EPackages</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMaxDeleteCount <em>Max Delete Count</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig()
- * @model
- * @generated
- */
-public interface MutatorConfig extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Root EClass</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Root EClass</em>' reference isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Root EClass</em>' reference.
-	 * @see #setRootEClass(EClass)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_RootEClass()
-	 * @model
-	 * @generated
-	 */
-	EClass getRootEClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getRootEClass
-	 * <em>Root EClass</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Root EClass</em>' reference.
-	 * @see #getRootEClass()
-	 * @generated
-	 */
-	void setRootEClass(EClass value);
-
-	/**
-	 * Returns the value of the '<em><b>Min Objects Count</b></em>' attribute.
-	 * The default value is <code>"100"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Min Objects Count</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Min Objects Count</em>' attribute.
-	 * @see #setMinObjectsCount(int)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_MinObjectsCount()
-	 * @model default="100"
-	 * @generated
-	 */
-	int getMinObjectsCount();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMinObjectsCount
-	 * <em>Min Objects Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Min Objects Count</em>' attribute.
-	 * @see #getMinObjectsCount()
-	 * @generated
-	 */
-	void setMinObjectsCount(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Ignore And Log</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Ignore And Log</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Ignore And Log</em>' attribute.
-	 * @see #setIgnoreAndLog(boolean)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_IgnoreAndLog()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isIgnoreAndLog();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isIgnoreAndLog
-	 * <em>Ignore And Log</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Ignore And Log</em>' attribute.
-	 * @see #isIgnoreAndLog()
-	 * @generated
-	 */
-	void setIgnoreAndLog(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Do Not Generate Root</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Do Not Generate Root</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Do Not Generate Root</em>' attribute.
-	 * @see #setDoNotGenerateRoot(boolean)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_DoNotGenerateRoot()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isDoNotGenerateRoot();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isDoNotGenerateRoot
-	 * <em>Do Not Generate Root</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Do Not Generate Root</em>' attribute.
-	 * @see #isDoNotGenerateRoot()
-	 * @generated
-	 */
-	void setDoNotGenerateRoot(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>Use Ecore Util Delete</b></em>' attribute.
-	 * The default value is <code>"false"</code>.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Use Ecore Util Delete</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Use Ecore Util Delete</em>' attribute.
-	 * @see #setUseEcoreUtilDelete(boolean)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_UseEcoreUtilDelete()
-	 * @model default="false"
-	 * @generated
-	 */
-	boolean isUseEcoreUtilDelete();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#isUseEcoreUtilDelete
-	 * <em>Use Ecore Util Delete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Use Ecore Util Delete</em>' attribute.
-	 * @see #isUseEcoreUtilDelete()
-	 * @generated
-	 */
-	void setUseEcoreUtilDelete(boolean value);
-
-	/**
-	 * Returns the value of the '<em><b>EClasses To Ignore</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.EClass}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>EClasses To Ignore</em>' reference list isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>EClasses To Ignore</em>' reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_EClassesToIgnore()
-	 * @model
-	 * @generated
-	 */
-	EList<EClass> getEClassesToIgnore();
-
-	/**
-	 * Returns the value of the '<em><b>EStructural Features To Ignore</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.EStructuralFeature}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>EStructural Features To Ignore</em>' reference list isn't clear, there really should
-	 * be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>EStructural Features To Ignore</em>' reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_EStructuralFeaturesToIgnore()
-	 * @model
-	 * @generated
-	 */
-	EList<EStructuralFeature> getEStructuralFeaturesToIgnore();
-
-	/**
-	 * Returns the value of the '<em><b>EPackages</b></em>' reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.EPackage}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>EPackages</em>' reference list isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>EPackages</em>' reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_EPackages()
-	 * @model
-	 * @generated
-	 */
-	EList<EPackage> getEPackages();
-
-	/**
-	 * Returns the value of the '<em><b>Max Delete Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Max Delete Count</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Max Delete Count</em>' attribute.
-	 * @see #setMaxDeleteCount(Integer)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getMutatorConfig_MaxDeleteCount()
-	 * @model
-	 * @generated
-	 */
-	Integer getMaxDeleteCount();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig#getMaxDeleteCount
-	 * <em>Max Delete Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Max Delete Count</em>' attribute.
-	 * @see #getMaxDeleteCount()
-	 * @generated
-	 */
-	void setMaxDeleteCount(Integer value);
-
-} // MutatorConfig
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/Root.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/Root.java
deleted file mode 100644
index b01afbc..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/Root.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Root</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root#getElements <em>Elements</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getRoot()
- * @model
- * @generated
- */
-public interface Root extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Elements</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.emf.ecore.EObject}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Elements</em>' containment reference list isn't clear, there really should be more of
-	 * a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Elements</em>' containment reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getRoot_Elements()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EList<EObject> getElements();
-
-} // Root
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestConfig.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestConfig.java
deleted file mode 100644
index 6abc4bd..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestConfig.java
+++ /dev/null
@@ -1,178 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Test Config</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getSeed <em>Seed</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getCount <em>Count</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getTestClass <em>Test Class</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getId <em>Id</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getMutatorConfig <em>Mutator Config</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig()
- * @model
- * @generated
- */
-public interface TestConfig extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Seed</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Seed</em>' attribute isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Seed</em>' attribute.
-	 * @see #setSeed(long)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig_Seed()
-	 * @model
-	 * @generated
-	 */
-	long getSeed();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getSeed <em>Seed</em>}'
-	 * attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Seed</em>' attribute.
-	 * @see #getSeed()
-	 * @generated
-	 */
-	void setSeed(long value);
-
-	/**
-	 * Returns the value of the '<em><b>Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Count</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Count</em>' attribute.
-	 * @see #setCount(int)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig_Count()
-	 * @model
-	 * @generated
-	 */
-	int getCount();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getCount <em>Count</em>}'
-	 * attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Count</em>' attribute.
-	 * @see #getCount()
-	 * @generated
-	 */
-	void setCount(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Test Class</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Test Class</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Test Class</em>' attribute.
-	 * @see #setTestClass(Class)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig_TestClass()
-	 * @model
-	 * @generated
-	 */
-	Class<?> getTestClass();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getTestClass
-	 * <em>Test Class</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Test Class</em>' attribute.
-	 * @see #getTestClass()
-	 * @generated
-	 */
-	void setTestClass(Class<?> value);
-
-	/**
-	 * Returns the value of the '<em><b>Id</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Id</em>' attribute isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Id</em>' attribute.
-	 * @see #setId(String)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig_Id()
-	 * @model
-	 * @generated
-	 */
-	String getId();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getId <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Id</em>' attribute.
-	 * @see #getId()
-	 * @generated
-	 */
-	void setId(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Mutator Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Mutator Config</em>' containment reference isn't clear, there really should be more of
-	 * a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Mutator Config</em>' containment reference.
-	 * @see #setMutatorConfig(MutatorConfig)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestConfig_MutatorConfig()
-	 * @model containment="true"
-	 * @generated
-	 */
-	MutatorConfig getMutatorConfig();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig#getMutatorConfig
-	 * <em>Mutator Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Mutator Config</em>' containment reference.
-	 * @see #getMutatorConfig()
-	 * @generated
-	 */
-	void setMutatorConfig(MutatorConfig value);
-
-} // TestConfig
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestDiff.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestDiff.java
deleted file mode 100644
index 04546de..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestDiff.java
+++ /dev/null
@@ -1,153 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import java.util.Date;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Test Diff</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getLastUpdate <em>Last Update</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getConfig <em>Config</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getOldResult <em>Old Result</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getNewResult <em>New Result</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestDiff()
- * @model
- * @generated
- */
-public interface TestDiff extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Last Update</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Last Update</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Last Update</em>' attribute.
-	 * @see #setLastUpdate(Date)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestDiff_LastUpdate()
-	 * @model
-	 * @generated
-	 */
-	Date getLastUpdate();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getLastUpdate
-	 * <em>Last Update</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Last Update</em>' attribute.
-	 * @see #getLastUpdate()
-	 * @generated
-	 */
-	void setLastUpdate(Date value);
-
-	/**
-	 * Returns the value of the '<em><b>Config</b></em>' reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Config</em>' reference isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Config</em>' reference.
-	 * @see #setConfig(TestConfig)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestDiff_Config()
-	 * @model
-	 * @generated
-	 */
-	TestConfig getConfig();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getConfig <em>Config</em>}'
-	 * reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Config</em>' reference.
-	 * @see #getConfig()
-	 * @generated
-	 */
-	void setConfig(TestConfig value);
-
-	/**
-	 * Returns the value of the '<em><b>Old Result</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Old Result</em>' containment reference isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Old Result</em>' containment reference.
-	 * @see #setOldResult(TestResult)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestDiff_OldResult()
-	 * @model containment="true"
-	 * @generated
-	 */
-	TestResult getOldResult();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getOldResult
-	 * <em>Old Result</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Old Result</em>' containment reference.
-	 * @see #getOldResult()
-	 * @generated
-	 */
-	void setOldResult(TestResult value);
-
-	/**
-	 * Returns the value of the '<em><b>New Result</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>New Result</em>' containment reference isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>New Result</em>' containment reference.
-	 * @see #setNewResult(TestResult)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestDiff_NewResult()
-	 * @model containment="true"
-	 * @generated
-	 */
-	TestResult getNewResult();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff#getNewResult
-	 * <em>New Result</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>New Result</em>' containment reference.
-	 * @see #getNewResult()
-	 * @generated
-	 */
-	void setNewResult(TestResult value);
-
-} // TestDiff
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestResult.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestResult.java
deleted file mode 100644
index b6e02c9..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestResult.java
+++ /dev/null
@@ -1,181 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Test Result</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getSeedCount <em>Seed Count</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getTestName <em>Test Name</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getError <em>Error</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getFailure <em>Failure</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getExecutionTime <em>Execution Time</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult()
- * @model
- * @generated
- */
-public interface TestResult extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Seed Count</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Seed Count</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Seed Count</em>' attribute.
-	 * @see #setSeedCount(int)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult_SeedCount()
-	 * @model
-	 * @generated
-	 */
-	int getSeedCount();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getSeedCount
-	 * <em>Seed Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Seed Count</em>' attribute.
-	 * @see #getSeedCount()
-	 * @generated
-	 */
-	void setSeedCount(int value);
-
-	/**
-	 * Returns the value of the '<em><b>Test Name</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Test Name</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Test Name</em>' attribute.
-	 * @see #setTestName(String)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult_TestName()
-	 * @model
-	 * @generated
-	 */
-	String getTestName();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getTestName
-	 * <em>Test Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Test Name</em>' attribute.
-	 * @see #getTestName()
-	 * @generated
-	 */
-	void setTestName(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Error</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Error</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Error</em>' attribute.
-	 * @see #setError(String)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult_Error()
-	 * @model
-	 * @generated
-	 */
-	String getError();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getError <em>Error</em>}'
-	 * attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Error</em>' attribute.
-	 * @see #getError()
-	 * @generated
-	 */
-	void setError(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Failure</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Failure</em>' attribute isn't clear, there really should be more of a description
-	 * here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Failure</em>' attribute.
-	 * @see #setFailure(String)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult_Failure()
-	 * @model
-	 * @generated
-	 */
-	String getFailure();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getFailure <em>Failure</em>}'
-	 * attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Failure</em>' attribute.
-	 * @see #getFailure()
-	 * @generated
-	 */
-	void setFailure(String value);
-
-	/**
-	 * Returns the value of the '<em><b>Execution Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Execution Time</em>' attribute isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Execution Time</em>' attribute.
-	 * @see #setExecutionTime(long)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestResult_ExecutionTime()
-	 * @model
-	 * @generated
-	 */
-	long getExecutionTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult#getExecutionTime
-	 * <em>Execution Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Execution Time</em>' attribute.
-	 * @see #getExecutionTime()
-	 * @generated
-	 */
-	void setExecutionTime(long value);
-
-} // TestResult
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestRun.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestRun.java
deleted file mode 100644
index 6aa388a..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/TestRun.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config;
-
-import java.util.Date;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EObject;
-
-/**
- * <!-- begin-user-doc -->
- * A representation of the model object '<em><b>Test Run</b></em>'.
- * <!-- end-user-doc -->
- * 
- * <p>
- * The following features are supported:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getConfig <em>Config</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getTime <em>Time</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getResults <em>Results</em>}</li>
- * </ul>
- * </p>
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestRun()
- * @model
- * @generated
- */
-public interface TestRun extends EObject {
-	/**
-	 * Returns the value of the '<em><b>Config</b></em>' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Config</em>' containment reference isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Config</em>' containment reference.
-	 * @see #setConfig(TestConfig)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestRun_Config()
-	 * @model containment="true"
-	 * @generated
-	 */
-	TestConfig getConfig();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getConfig <em>Config</em>}'
-	 * containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Config</em>' containment reference.
-	 * @see #getConfig()
-	 * @generated
-	 */
-	void setConfig(TestConfig value);
-
-	/**
-	 * Returns the value of the '<em><b>Time</b></em>' attribute.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Time</em>' attribute isn't clear, there really should be more of a description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Time</em>' attribute.
-	 * @see #setTime(Date)
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestRun_Time()
-	 * @model
-	 * @generated
-	 */
-	Date getTime();
-
-	/**
-	 * Sets the value of the '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun#getTime <em>Time</em>}'
-	 * attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param value the new value of the '<em>Time</em>' attribute.
-	 * @see #getTime()
-	 * @generated
-	 */
-	void setTime(Date value);
-
-	/**
-	 * Returns the value of the '<em><b>Results</b></em>' containment reference list.
-	 * The list contents are of type {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult}.
-	 * <!-- begin-user-doc -->
-	 * <p>
-	 * If the meaning of the '<em>Results</em>' containment reference list isn't clear, there really should be more of a
-	 * description here...
-	 * </p>
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the value of the '<em>Results</em>' containment reference list.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#getTestRun_Results()
-	 * @model containment="true"
-	 * @generated
-	 */
-	EList<TestResult> getResults();
-
-} // TestRun
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigFactoryImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigFactoryImpl.java
deleted file mode 100644
index ffa0f67..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigFactoryImpl.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.impl.EFactoryImpl;
-import org.eclipse.emf.ecore.plugin.EcorePlugin;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Factory</b>.
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigFactoryImpl extends EFactoryImpl implements ConfigFactory {
-	/**
-	 * Creates the default factory implementation.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public static ConfigFactory init() {
-		try {
-			ConfigFactory theConfigFactory = (ConfigFactory) EPackage.Registry.INSTANCE
-				.getEFactory("http://org/eclipse/emf/emfstore/fuzzy/emf/config");
-			if (theConfigFactory != null) {
-				return theConfigFactory;
-			}
-		} catch (Exception exception) {
-			EcorePlugin.INSTANCE.log(exception);
-		}
-		return new ConfigFactoryImpl();
-	}
-
-	/**
-	 * Creates an instance of the factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigFactoryImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public EObject create(EClass eClass) {
-		switch (eClass.getClassifierID()) {
-		case ConfigPackage.TEST_CONFIG:
-			return createTestConfig();
-		case ConfigPackage.TEST_RUN:
-			return createTestRun();
-		case ConfigPackage.TEST_RESULT:
-			return createTestResult();
-		case ConfigPackage.TEST_DIFF:
-			return createTestDiff();
-		case ConfigPackage.DIFF_REPORT:
-			return createDiffReport();
-		case ConfigPackage.ROOT:
-			return createRoot();
-		case ConfigPackage.MUTATOR_CONFIG:
-			return createMutatorConfig();
-		default:
-			throw new IllegalArgumentException("The class '" + eClass.getName() + "' is not a valid classifier");
-		}
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestConfig createTestConfig() {
-		TestConfigImpl testConfig = new TestConfigImpl();
-		return testConfig;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestRun createTestRun() {
-		TestRunImpl testRun = new TestRunImpl();
-		return testRun;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestResult createTestResult() {
-		TestResultImpl testResult = new TestResultImpl();
-		return testResult;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestDiff createTestDiff() {
-		TestDiffImpl testDiff = new TestDiffImpl();
-		return testDiff;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public DiffReport createDiffReport() {
-		DiffReportImpl diffReport = new DiffReportImpl();
-		return diffReport;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Root createRoot() {
-		RootImpl root = new RootImpl();
-		return root;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public MutatorConfig createMutatorConfig() {
-		MutatorConfigImpl mutatorConfig = new MutatorConfigImpl();
-		return mutatorConfig;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigPackage getConfigPackage() {
-		return (ConfigPackage) getEPackage();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @deprecated
-	 * @generated
-	 */
-	@Deprecated
-	public static ConfigPackage getPackage() {
-		return ConfigPackage.eINSTANCE;
-	}
-
-} // ConfigFactoryImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigPackageImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigPackageImpl.java
deleted file mode 100644
index 0e07b74..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/ConfigPackageImpl.java
+++ /dev/null
@@ -1,715 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import org.eclipse.emf.ecore.EAttribute;
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EGenericType;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EReference;
-
-import org.eclipse.emf.ecore.impl.EPackageImpl;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model <b>Package</b>.
- * <!-- end-user-doc -->
- * 
- * @generated
- */
-public class ConfigPackageImpl extends EPackageImpl implements ConfigPackage {
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass testConfigEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass testRunEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass testResultEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass testDiffEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass diffReportEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass rootEClass = null;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private EClass mutatorConfigEClass = null;
-
-	/**
-	 * Creates an instance of the model <b>Package</b>, registered with {@link org.eclipse.emf.ecore.EPackage.Registry
-	 * EPackage.Registry} by the package
-	 * package URI value.
-	 * <p>
-	 * Note: the correct way to create the package is via the static factory method {@link #init init()}, which also
-	 * performs initialization of the package, or returns the registered package, if one already exists. <!--
-	 * begin-user-doc --> <!-- end-user-doc -->
-	 * 
-	 * @see org.eclipse.emf.ecore.EPackage.Registry
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage#eNS_URI
-	 * @see #init()
-	 * @generated
-	 */
-	private ConfigPackageImpl() {
-		super(eNS_URI, ConfigFactory.eINSTANCE);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private static boolean isInited = false;
-
-	/**
-	 * Creates, registers, and initializes the <b>Package</b> for this model, and for any others upon which it depends.
-	 * 
-	 * <p>
-	 * This method is used to initialize {@link ConfigPackage#eINSTANCE} when that field is accessed. Clients should not
-	 * invoke it directly. Instead, they should simply access that field to obtain the package. <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #eNS_URI
-	 * @see #createPackageContents()
-	 * @see #initializePackageContents()
-	 * @generated
-	 */
-	public static ConfigPackage init() {
-		if (isInited)
-			return (ConfigPackage) EPackage.Registry.INSTANCE.getEPackage(ConfigPackage.eNS_URI);
-
-		// Obtain or create and register package
-		ConfigPackageImpl theConfigPackage = (ConfigPackageImpl) (EPackage.Registry.INSTANCE.get(eNS_URI) instanceof ConfigPackageImpl ? EPackage.Registry.INSTANCE
-			.get(eNS_URI) : new ConfigPackageImpl());
-
-		isInited = true;
-
-		// Create package meta-data objects
-		theConfigPackage.createPackageContents();
-
-		// Initialize created meta-data
-		theConfigPackage.initializePackageContents();
-
-		// Mark meta-data to indicate it can't be changed
-		theConfigPackage.freeze();
-
-		// Update the registry and return the package
-		EPackage.Registry.INSTANCE.put(ConfigPackage.eNS_URI, theConfigPackage);
-		return theConfigPackage;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getTestConfig() {
-		return testConfigEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestConfig_Seed() {
-		return (EAttribute) testConfigEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestConfig_Count() {
-		return (EAttribute) testConfigEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestConfig_TestClass() {
-		return (EAttribute) testConfigEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestConfig_Id() {
-		return (EAttribute) testConfigEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestConfig_MutatorConfig() {
-		return (EReference) testConfigEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getTestRun() {
-		return testRunEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestRun_Config() {
-		return (EReference) testRunEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestRun_Time() {
-		return (EAttribute) testRunEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestRun_Results() {
-		return (EReference) testRunEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getTestResult() {
-		return testResultEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestResult_SeedCount() {
-		return (EAttribute) testResultEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestResult_TestName() {
-		return (EAttribute) testResultEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestResult_Error() {
-		return (EAttribute) testResultEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestResult_Failure() {
-		return (EAttribute) testResultEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestResult_ExecutionTime() {
-		return (EAttribute) testResultEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getTestDiff() {
-		return testDiffEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getTestDiff_LastUpdate() {
-		return (EAttribute) testDiffEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestDiff_Config() {
-		return (EReference) testDiffEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestDiff_OldResult() {
-		return (EReference) testDiffEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getTestDiff_NewResult() {
-		return (EReference) testDiffEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getDiffReport() {
-		return diffReportEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getDiffReport_Diffs() {
-		return (EReference) diffReportEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getRoot() {
-		return rootEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getRoot_Elements() {
-		return (EReference) rootEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getMutatorConfig() {
-		return mutatorConfigEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getMutatorConfig_RootEClass() {
-		return (EReference) mutatorConfigEClass.getEStructuralFeatures().get(0);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getMutatorConfig_MinObjectsCount() {
-		return (EAttribute) mutatorConfigEClass.getEStructuralFeatures().get(1);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getMutatorConfig_IgnoreAndLog() {
-		return (EAttribute) mutatorConfigEClass.getEStructuralFeatures().get(2);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getMutatorConfig_DoNotGenerateRoot() {
-		return (EAttribute) mutatorConfigEClass.getEStructuralFeatures().get(3);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getMutatorConfig_UseEcoreUtilDelete() {
-		return (EAttribute) mutatorConfigEClass.getEStructuralFeatures().get(4);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getMutatorConfig_EClassesToIgnore() {
-		return (EReference) mutatorConfigEClass.getEStructuralFeatures().get(5);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getMutatorConfig_EStructuralFeaturesToIgnore() {
-		return (EReference) mutatorConfigEClass.getEStructuralFeatures().get(6);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EReference getMutatorConfig_EPackages() {
-		return (EReference) mutatorConfigEClass.getEStructuralFeatures().get(7);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EAttribute getMutatorConfig_MaxDeleteCount() {
-		return (EAttribute) mutatorConfigEClass.getEStructuralFeatures().get(8);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigFactory getConfigFactory() {
-		return (ConfigFactory) getEFactoryInstance();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isCreated = false;
-
-	/**
-	 * Creates the meta-model objects for the package. This method is
-	 * guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void createPackageContents() {
-		if (isCreated)
-			return;
-		isCreated = true;
-
-		// Create classes and their features
-		testConfigEClass = createEClass(TEST_CONFIG);
-		createEAttribute(testConfigEClass, TEST_CONFIG__SEED);
-		createEAttribute(testConfigEClass, TEST_CONFIG__COUNT);
-		createEAttribute(testConfigEClass, TEST_CONFIG__TEST_CLASS);
-		createEAttribute(testConfigEClass, TEST_CONFIG__ID);
-		createEReference(testConfigEClass, TEST_CONFIG__MUTATOR_CONFIG);
-
-		testRunEClass = createEClass(TEST_RUN);
-		createEReference(testRunEClass, TEST_RUN__CONFIG);
-		createEAttribute(testRunEClass, TEST_RUN__TIME);
-		createEReference(testRunEClass, TEST_RUN__RESULTS);
-
-		testResultEClass = createEClass(TEST_RESULT);
-		createEAttribute(testResultEClass, TEST_RESULT__SEED_COUNT);
-		createEAttribute(testResultEClass, TEST_RESULT__TEST_NAME);
-		createEAttribute(testResultEClass, TEST_RESULT__ERROR);
-		createEAttribute(testResultEClass, TEST_RESULT__FAILURE);
-		createEAttribute(testResultEClass, TEST_RESULT__EXECUTION_TIME);
-
-		testDiffEClass = createEClass(TEST_DIFF);
-		createEAttribute(testDiffEClass, TEST_DIFF__LAST_UPDATE);
-		createEReference(testDiffEClass, TEST_DIFF__CONFIG);
-		createEReference(testDiffEClass, TEST_DIFF__OLD_RESULT);
-		createEReference(testDiffEClass, TEST_DIFF__NEW_RESULT);
-
-		diffReportEClass = createEClass(DIFF_REPORT);
-		createEReference(diffReportEClass, DIFF_REPORT__DIFFS);
-
-		rootEClass = createEClass(ROOT);
-		createEReference(rootEClass, ROOT__ELEMENTS);
-
-		mutatorConfigEClass = createEClass(MUTATOR_CONFIG);
-		createEReference(mutatorConfigEClass, MUTATOR_CONFIG__ROOT_ECLASS);
-		createEAttribute(mutatorConfigEClass, MUTATOR_CONFIG__MIN_OBJECTS_COUNT);
-		createEAttribute(mutatorConfigEClass, MUTATOR_CONFIG__IGNORE_AND_LOG);
-		createEAttribute(mutatorConfigEClass, MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT);
-		createEAttribute(mutatorConfigEClass, MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE);
-		createEReference(mutatorConfigEClass, MUTATOR_CONFIG__ECLASSES_TO_IGNORE);
-		createEReference(mutatorConfigEClass, MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE);
-		createEReference(mutatorConfigEClass, MUTATOR_CONFIG__EPACKAGES);
-		createEAttribute(mutatorConfigEClass, MUTATOR_CONFIG__MAX_DELETE_COUNT);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	private boolean isInitialized = false;
-
-	/**
-	 * Complete the initialization of the package and its meta-model. This
-	 * method is guarded to have no affect on any invocation but its first.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void initializePackageContents() {
-		if (isInitialized)
-			return;
-		isInitialized = true;
-
-		// Initialize package
-		setName(eNAME);
-		setNsPrefix(eNS_PREFIX);
-		setNsURI(eNS_URI);
-
-		// Create type parameters
-
-		// Set bounds for type parameters
-
-		// Add supertypes to classes
-
-		// Initialize classes and features; add operations and parameters
-		initEClass(testConfigEClass, TestConfig.class, "TestConfig", !IS_ABSTRACT, !IS_INTERFACE,
-			IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTestConfig_Seed(), ecorePackage.getELong(), "seed", null, 0, 1, TestConfig.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestConfig_Count(), ecorePackage.getEInt(), "count", null, 0, 1, TestConfig.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		EGenericType g1 = createEGenericType(ecorePackage.getEJavaClass());
-		EGenericType g2 = createEGenericType();
-		g1.getETypeArguments().add(g2);
-		initEAttribute(getTestConfig_TestClass(), g1, "testClass", null, 0, 1, TestConfig.class, !IS_TRANSIENT,
-			!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestConfig_Id(), ecorePackage.getEString(), "id", null, 0, 1, TestConfig.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTestConfig_MutatorConfig(), this.getMutatorConfig(), null, "mutatorConfig", null, 0, 1,
-			TestConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES,
-			!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-
-		initEClass(testRunEClass, TestRun.class, "TestRun", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getTestRun_Config(), this.getTestConfig(), null, "config", null, 0, 1, TestRun.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestRun_Time(), ecorePackage.getEDate(), "time", null, 0, 1, TestRun.class, !IS_TRANSIENT,
-			!IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTestRun_Results(), this.getTestResult(), null, "results", null, 0, -1, TestRun.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		initEClass(testResultEClass, TestResult.class, "TestResult", !IS_ABSTRACT, !IS_INTERFACE,
-			IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTestResult_SeedCount(), ecorePackage.getEInt(), "seedCount", null, 0, 1, TestResult.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestResult_TestName(), ecorePackage.getEString(), "testName", null, 0, 1, TestResult.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestResult_Error(), ecorePackage.getEString(), "error", null, 0, 1, TestResult.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestResult_Failure(), ecorePackage.getEString(), "failure", null, 0, 1, TestResult.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getTestResult_ExecutionTime(), ecorePackage.getELong(), "executionTime", null, 0, 1,
-			TestResult.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		initEClass(testDiffEClass, TestDiff.class, "TestDiff", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEAttribute(getTestDiff_LastUpdate(), ecorePackage.getEDate(), "lastUpdate", null, 0, 1, TestDiff.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getTestDiff_Config(), this.getTestConfig(), null, "config", null, 0, 1, TestDiff.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEReference(getTestDiff_OldResult(), this.getTestResult(), null, "oldResult", null, 0, 1, TestDiff.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEReference(getTestDiff_NewResult(), this.getTestResult(), null, "newResult", null, 0, 1, TestDiff.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		initEClass(diffReportEClass, DiffReport.class, "DiffReport", !IS_ABSTRACT, !IS_INTERFACE,
-			IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getDiffReport_Diffs(), this.getTestDiff(), null, "diffs", null, 0, -1, DiffReport.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		initEClass(rootEClass, Root.class, "Root", !IS_ABSTRACT, !IS_INTERFACE, IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getRoot_Elements(), ecorePackage.getEObject(), null, "elements", null, 0, -1, Root.class,
-			!IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, IS_COMPOSITE, !IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		initEClass(mutatorConfigEClass, MutatorConfig.class, "MutatorConfig", !IS_ABSTRACT, !IS_INTERFACE,
-			IS_GENERATED_INSTANCE_CLASS);
-		initEReference(getMutatorConfig_RootEClass(), ecorePackage.getEClass(), null, "rootEClass", null, 0, 1,
-			MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES,
-			!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMutatorConfig_MinObjectsCount(), ecorePackage.getEInt(), "minObjectsCount", "100", 0, 1,
-			MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMutatorConfig_IgnoreAndLog(), ecorePackage.getEBoolean(), "ignoreAndLog", "false", 0, 1,
-			MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMutatorConfig_DoNotGenerateRoot(), ecorePackage.getEBoolean(), "doNotGenerateRoot", "false",
-			0, 1, MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMutatorConfig_UseEcoreUtilDelete(), ecorePackage.getEBoolean(), "useEcoreUtilDelete",
-			"false", 0, 1, MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID,
-			IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMutatorConfig_EClassesToIgnore(), ecorePackage.getEClass(), null, "eClassesToIgnore", null,
-			0, -1, MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES,
-			!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMutatorConfig_EStructuralFeaturesToIgnore(), ecorePackage.getEStructuralFeature(), null,
-			"eStructuralFeaturesToIgnore", null, 0, -1, MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE,
-			IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES, !IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEReference(getMutatorConfig_EPackages(), ecorePackage.getEPackage(), null, "ePackages", null, 0, -1,
-			MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_COMPOSITE, IS_RESOLVE_PROXIES,
-			!IS_UNSETTABLE, IS_UNIQUE, !IS_DERIVED, IS_ORDERED);
-		initEAttribute(getMutatorConfig_MaxDeleteCount(), ecorePackage.getEIntegerObject(), "maxDeleteCount", null, 0,
-			1, MutatorConfig.class, !IS_TRANSIENT, !IS_VOLATILE, IS_CHANGEABLE, !IS_UNSETTABLE, !IS_ID, IS_UNIQUE,
-			!IS_DERIVED, IS_ORDERED);
-
-		// Create resource
-		createResource(eNS_URI);
-	}
-
-} // ConfigPackageImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/DiffReportImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/DiffReportImpl.java
deleted file mode 100644
index bda9548..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/DiffReportImpl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Diff Report</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.DiffReportImpl#getDiffs <em>Diffs</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class DiffReportImpl extends EObjectImpl implements DiffReport {
-	/**
-	 * The cached value of the '{@link #getDiffs() <em>Diffs</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getDiffs()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<TestDiff> diffs;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected DiffReportImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.DIFF_REPORT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<TestDiff> getDiffs() {
-		if (diffs == null) {
-			diffs = new EObjectContainmentEList<TestDiff>(TestDiff.class, this, ConfigPackage.DIFF_REPORT__DIFFS);
-		}
-		return diffs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			return ((InternalEList<?>) getDiffs()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			return getDiffs();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			getDiffs().clear();
-			getDiffs().addAll((Collection<? extends TestDiff>) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			getDiffs().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.DIFF_REPORT__DIFFS:
-			return diffs != null && !diffs.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} // DiffReportImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/MutatorConfigImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/MutatorConfigImpl.java
deleted file mode 100644
index 01324c9..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/MutatorConfigImpl.java
+++ /dev/null
@@ -1,616 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EPackage;
-import org.eclipse.emf.ecore.EStructuralFeature;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectResolvingEList;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Mutator Config</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getRootEClass <em>Root EClass</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getMinObjectsCount <em>Min Objects Count
- * </em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#isIgnoreAndLog <em>Ignore And Log</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#isDoNotGenerateRoot <em>Do Not Generate
- * Root</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#isUseEcoreUtilDelete <em>Use Ecore Util
- * Delete</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getEClassesToIgnore <em>EClasses To
- * Ignore</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getEStructuralFeaturesToIgnore <em>
- * EStructural Features To Ignore</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getEPackages <em>EPackages</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.MutatorConfigImpl#getMaxDeleteCount <em>Max Delete Count
- * </em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class MutatorConfigImpl extends EObjectImpl implements MutatorConfig {
-	/**
-	 * The cached value of the '{@link #getRootEClass() <em>Root EClass</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getRootEClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected EClass rootEClass;
-
-	/**
-	 * The default value of the '{@link #getMinObjectsCount() <em>Min Objects Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getMinObjectsCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int MIN_OBJECTS_COUNT_EDEFAULT = 100;
-
-	/**
-	 * The cached value of the '{@link #getMinObjectsCount() <em>Min Objects Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getMinObjectsCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected int minObjectsCount = MIN_OBJECTS_COUNT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isIgnoreAndLog() <em>Ignore And Log</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isIgnoreAndLog()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean IGNORE_AND_LOG_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isIgnoreAndLog() <em>Ignore And Log</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isIgnoreAndLog()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean ignoreAndLog = IGNORE_AND_LOG_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isDoNotGenerateRoot() <em>Do Not Generate Root</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isDoNotGenerateRoot()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean DO_NOT_GENERATE_ROOT_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isDoNotGenerateRoot() <em>Do Not Generate Root</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isDoNotGenerateRoot()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean doNotGenerateRoot = DO_NOT_GENERATE_ROOT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #isUseEcoreUtilDelete() <em>Use Ecore Util Delete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isUseEcoreUtilDelete()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final boolean USE_ECORE_UTIL_DELETE_EDEFAULT = false;
-
-	/**
-	 * The cached value of the '{@link #isUseEcoreUtilDelete() <em>Use Ecore Util Delete</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #isUseEcoreUtilDelete()
-	 * @generated
-	 * @ordered
-	 */
-	protected boolean useEcoreUtilDelete = USE_ECORE_UTIL_DELETE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getEClassesToIgnore() <em>EClasses To Ignore</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getEClassesToIgnore()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<EClass> eClassesToIgnore;
-
-	/**
-	 * The cached value of the '{@link #getEStructuralFeaturesToIgnore() <em>EStructural Features To Ignore</em>}'
-	 * reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getEStructuralFeaturesToIgnore()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<EStructuralFeature> eStructuralFeaturesToIgnore;
-
-	/**
-	 * The cached value of the '{@link #getEPackages() <em>EPackages</em>}' reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getEPackages()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<EPackage> ePackages;
-
-	/**
-	 * The default value of the '{@link #getMaxDeleteCount() <em>Max Delete Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getMaxDeleteCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Integer MAX_DELETE_COUNT_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getMaxDeleteCount() <em>Max Delete Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getMaxDeleteCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected Integer maxDeleteCount = MAX_DELETE_COUNT_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected MutatorConfigImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.MUTATOR_CONFIG;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass getRootEClass() {
-		if (rootEClass != null && rootEClass.eIsProxy()) {
-			InternalEObject oldRootEClass = (InternalEObject) rootEClass;
-			rootEClass = (EClass) eResolveProxy(oldRootEClass);
-			if (rootEClass != oldRootEClass) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE,
-						ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS, oldRootEClass, rootEClass));
-			}
-		}
-		return rootEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EClass basicGetRootEClass() {
-		return rootEClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setRootEClass(EClass newRootEClass) {
-		EClass oldRootEClass = rootEClass;
-		rootEClass = newRootEClass;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS,
-				oldRootEClass, rootEClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getMinObjectsCount() {
-		return minObjectsCount;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setMinObjectsCount(int newMinObjectsCount) {
-		int oldMinObjectsCount = minObjectsCount;
-		minObjectsCount = newMinObjectsCount;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT,
-				oldMinObjectsCount, minObjectsCount));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean isIgnoreAndLog() {
-		return ignoreAndLog;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setIgnoreAndLog(boolean newIgnoreAndLog) {
-		boolean oldIgnoreAndLog = ignoreAndLog;
-		ignoreAndLog = newIgnoreAndLog;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG,
-				oldIgnoreAndLog, ignoreAndLog));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean isDoNotGenerateRoot() {
-		return doNotGenerateRoot;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setDoNotGenerateRoot(boolean newDoNotGenerateRoot) {
-		boolean oldDoNotGenerateRoot = doNotGenerateRoot;
-		doNotGenerateRoot = newDoNotGenerateRoot;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT,
-				oldDoNotGenerateRoot, doNotGenerateRoot));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public boolean isUseEcoreUtilDelete() {
-		return useEcoreUtilDelete;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setUseEcoreUtilDelete(boolean newUseEcoreUtilDelete) {
-		boolean oldUseEcoreUtilDelete = useEcoreUtilDelete;
-		useEcoreUtilDelete = newUseEcoreUtilDelete;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE,
-				oldUseEcoreUtilDelete, useEcoreUtilDelete));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<EClass> getEClassesToIgnore() {
-		if (eClassesToIgnore == null) {
-			eClassesToIgnore = new EObjectResolvingEList<EClass>(EClass.class, this,
-				ConfigPackage.MUTATOR_CONFIG__ECLASSES_TO_IGNORE);
-		}
-		return eClassesToIgnore;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<EStructuralFeature> getEStructuralFeaturesToIgnore() {
-		if (eStructuralFeaturesToIgnore == null) {
-			eStructuralFeaturesToIgnore = new EObjectResolvingEList<EStructuralFeature>(EStructuralFeature.class, this,
-				ConfigPackage.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE);
-		}
-		return eStructuralFeaturesToIgnore;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<EPackage> getEPackages() {
-		if (ePackages == null) {
-			ePackages = new EObjectResolvingEList<EPackage>(EPackage.class, this,
-				ConfigPackage.MUTATOR_CONFIG__EPACKAGES);
-		}
-		return ePackages;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Integer getMaxDeleteCount() {
-		return maxDeleteCount;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setMaxDeleteCount(Integer newMaxDeleteCount) {
-		Integer oldMaxDeleteCount = maxDeleteCount;
-		maxDeleteCount = newMaxDeleteCount;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT,
-				oldMaxDeleteCount, maxDeleteCount));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS:
-			if (resolve)
-				return getRootEClass();
-			return basicGetRootEClass();
-		case ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT:
-			return getMinObjectsCount();
-		case ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG:
-			return isIgnoreAndLog();
-		case ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT:
-			return isDoNotGenerateRoot();
-		case ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE:
-			return isUseEcoreUtilDelete();
-		case ConfigPackage.MUTATOR_CONFIG__ECLASSES_TO_IGNORE:
-			return getEClassesToIgnore();
-		case ConfigPackage.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE:
-			return getEStructuralFeaturesToIgnore();
-		case ConfigPackage.MUTATOR_CONFIG__EPACKAGES:
-			return getEPackages();
-		case ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT:
-			return getMaxDeleteCount();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS:
-			setRootEClass((EClass) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT:
-			setMinObjectsCount((Integer) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG:
-			setIgnoreAndLog((Boolean) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT:
-			setDoNotGenerateRoot((Boolean) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE:
-			setUseEcoreUtilDelete((Boolean) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__ECLASSES_TO_IGNORE:
-			getEClassesToIgnore().clear();
-			getEClassesToIgnore().addAll((Collection<? extends EClass>) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE:
-			getEStructuralFeaturesToIgnore().clear();
-			getEStructuralFeaturesToIgnore().addAll((Collection<? extends EStructuralFeature>) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__EPACKAGES:
-			getEPackages().clear();
-			getEPackages().addAll((Collection<? extends EPackage>) newValue);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT:
-			setMaxDeleteCount((Integer) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS:
-			setRootEClass((EClass) null);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT:
-			setMinObjectsCount(MIN_OBJECTS_COUNT_EDEFAULT);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG:
-			setIgnoreAndLog(IGNORE_AND_LOG_EDEFAULT);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT:
-			setDoNotGenerateRoot(DO_NOT_GENERATE_ROOT_EDEFAULT);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE:
-			setUseEcoreUtilDelete(USE_ECORE_UTIL_DELETE_EDEFAULT);
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__ECLASSES_TO_IGNORE:
-			getEClassesToIgnore().clear();
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE:
-			getEStructuralFeaturesToIgnore().clear();
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__EPACKAGES:
-			getEPackages().clear();
-			return;
-		case ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT:
-			setMaxDeleteCount(MAX_DELETE_COUNT_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.MUTATOR_CONFIG__ROOT_ECLASS:
-			return rootEClass != null;
-		case ConfigPackage.MUTATOR_CONFIG__MIN_OBJECTS_COUNT:
-			return minObjectsCount != MIN_OBJECTS_COUNT_EDEFAULT;
-		case ConfigPackage.MUTATOR_CONFIG__IGNORE_AND_LOG:
-			return ignoreAndLog != IGNORE_AND_LOG_EDEFAULT;
-		case ConfigPackage.MUTATOR_CONFIG__DO_NOT_GENERATE_ROOT:
-			return doNotGenerateRoot != DO_NOT_GENERATE_ROOT_EDEFAULT;
-		case ConfigPackage.MUTATOR_CONFIG__USE_ECORE_UTIL_DELETE:
-			return useEcoreUtilDelete != USE_ECORE_UTIL_DELETE_EDEFAULT;
-		case ConfigPackage.MUTATOR_CONFIG__ECLASSES_TO_IGNORE:
-			return eClassesToIgnore != null && !eClassesToIgnore.isEmpty();
-		case ConfigPackage.MUTATOR_CONFIG__ESTRUCTURAL_FEATURES_TO_IGNORE:
-			return eStructuralFeaturesToIgnore != null && !eStructuralFeaturesToIgnore.isEmpty();
-		case ConfigPackage.MUTATOR_CONFIG__EPACKAGES:
-			return ePackages != null && !ePackages.isEmpty();
-		case ConfigPackage.MUTATOR_CONFIG__MAX_DELETE_COUNT:
-			return MAX_DELETE_COUNT_EDEFAULT == null ? maxDeleteCount != null : !MAX_DELETE_COUNT_EDEFAULT
-				.equals(maxDeleteCount);
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (minObjectsCount: ");
-		result.append(minObjectsCount);
-		result.append(", ignoreAndLog: ");
-		result.append(ignoreAndLog);
-		result.append(", doNotGenerateRoot: ");
-		result.append(doNotGenerateRoot);
-		result.append(", useEcoreUtilDelete: ");
-		result.append(useEcoreUtilDelete);
-		result.append(", maxDeleteCount: ");
-		result.append(maxDeleteCount);
-		result.append(')');
-		return result.toString();
-	}
-
-} // MutatorConfigImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/RootImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/RootImpl.java
deleted file mode 100644
index 194d4ac..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/RootImpl.java
+++ /dev/null
@@ -1,169 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import java.util.Collection;
-
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Root</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.RootImpl#getElements <em>Elements</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class RootImpl extends EObjectImpl implements Root {
-	/**
-	 * The cached value of the '{@link #getElements() <em>Elements</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getElements()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<EObject> elements;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected RootImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.ROOT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<EObject> getElements() {
-		if (elements == null) {
-			elements = new EObjectContainmentEList<EObject>(EObject.class, this, ConfigPackage.ROOT__ELEMENTS);
-		}
-		return elements;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			return ((InternalEList<?>) getElements()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			return getElements();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			getElements().clear();
-			getElements().addAll((Collection<? extends EObject>) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			getElements().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.ROOT__ELEMENTS:
-			return elements != null && !elements.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-} // RootImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestConfigImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestConfigImpl.java
deleted file mode 100644
index 128e732..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestConfigImpl.java
+++ /dev/null
@@ -1,440 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Test Config</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl#getSeed <em>Seed</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl#getCount <em>Count</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl#getTestClass <em>Test Class</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl#getId <em>Id</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestConfigImpl#getMutatorConfig <em>Mutator Config</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class TestConfigImpl extends EObjectImpl implements TestConfig {
-	/**
-	 * The default value of the '{@link #getSeed() <em>Seed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getSeed()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final long SEED_EDEFAULT = 0L;
-
-	/**
-	 * The cached value of the '{@link #getSeed() <em>Seed</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getSeed()
-	 * @generated
-	 * @ordered
-	 */
-	protected long seed = SEED_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getCount() <em>Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int COUNT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getCount() <em>Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected int count = COUNT_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getTestClass() <em>Test Class</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getTestClass()
-	 * @generated
-	 * @ordered
-	 */
-	protected Class<?> testClass;
-
-	/**
-	 * The default value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ID_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getId() <em>Id</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getId()
-	 * @generated
-	 * @ordered
-	 */
-	protected String id = ID_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getMutatorConfig() <em>Mutator Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getMutatorConfig()
-	 * @generated
-	 * @ordered
-	 */
-	protected MutatorConfig mutatorConfig;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestConfigImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.TEST_CONFIG;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public long getSeed() {
-		return seed;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSeed(long newSeed) {
-		long oldSeed = seed;
-		seed = newSeed;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_CONFIG__SEED, oldSeed, seed));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getCount() {
-		return count;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setCount(int newCount) {
-		int oldCount = count;
-		count = newCount;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_CONFIG__COUNT, oldCount, count));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Class<?> getTestClass() {
-		return testClass;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTestClass(Class<?> newTestClass) {
-		Class<?> oldTestClass = testClass;
-		testClass = newTestClass;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_CONFIG__TEST_CLASS, oldTestClass,
-				testClass));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getId() {
-		return id;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setId(String newId) {
-		String oldId = id;
-		id = newId;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_CONFIG__ID, oldId, id));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public MutatorConfig getMutatorConfig() {
-		return mutatorConfig;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetMutatorConfig(MutatorConfig newMutatorConfig, NotificationChain msgs) {
-		MutatorConfig oldMutatorConfig = mutatorConfig;
-		mutatorConfig = newMutatorConfig;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-				ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG, oldMutatorConfig, newMutatorConfig);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setMutatorConfig(MutatorConfig newMutatorConfig) {
-		if (newMutatorConfig != mutatorConfig) {
-			NotificationChain msgs = null;
-			if (mutatorConfig != null)
-				msgs = ((InternalEObject) mutatorConfig).eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG, null, msgs);
-			if (newMutatorConfig != null)
-				msgs = ((InternalEObject) newMutatorConfig).eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG, null, msgs);
-			msgs = basicSetMutatorConfig(newMutatorConfig, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG,
-				newMutatorConfig, newMutatorConfig));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			return basicSetMutatorConfig(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.TEST_CONFIG__SEED:
-			return getSeed();
-		case ConfigPackage.TEST_CONFIG__COUNT:
-			return getCount();
-		case ConfigPackage.TEST_CONFIG__TEST_CLASS:
-			return getTestClass();
-		case ConfigPackage.TEST_CONFIG__ID:
-			return getId();
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			return getMutatorConfig();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.TEST_CONFIG__SEED:
-			setSeed((Long) newValue);
-			return;
-		case ConfigPackage.TEST_CONFIG__COUNT:
-			setCount((Integer) newValue);
-			return;
-		case ConfigPackage.TEST_CONFIG__TEST_CLASS:
-			setTestClass((Class<?>) newValue);
-			return;
-		case ConfigPackage.TEST_CONFIG__ID:
-			setId((String) newValue);
-			return;
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			setMutatorConfig((MutatorConfig) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_CONFIG__SEED:
-			setSeed(SEED_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_CONFIG__COUNT:
-			setCount(COUNT_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_CONFIG__TEST_CLASS:
-			setTestClass((Class<?>) null);
-			return;
-		case ConfigPackage.TEST_CONFIG__ID:
-			setId(ID_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			setMutatorConfig((MutatorConfig) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_CONFIG__SEED:
-			return seed != SEED_EDEFAULT;
-		case ConfigPackage.TEST_CONFIG__COUNT:
-			return count != COUNT_EDEFAULT;
-		case ConfigPackage.TEST_CONFIG__TEST_CLASS:
-			return testClass != null;
-		case ConfigPackage.TEST_CONFIG__ID:
-			return ID_EDEFAULT == null ? id != null : !ID_EDEFAULT.equals(id);
-		case ConfigPackage.TEST_CONFIG__MUTATOR_CONFIG:
-			return mutatorConfig != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (seed: ");
-		result.append(seed);
-		result.append(", count: ");
-		result.append(count);
-		result.append(", testClass: ");
-		result.append(testClass);
-		result.append(", id: ");
-		result.append(id);
-		result.append(')');
-		return result.toString();
-	}
-
-} // TestConfigImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestDiffImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestDiffImpl.java
deleted file mode 100644
index 1151ab1..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestDiffImpl.java
+++ /dev/null
@@ -1,423 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import java.util.Date;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Test Diff</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl#getLastUpdate <em>Last Update</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl#getConfig <em>Config</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl#getOldResult <em>Old Result</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestDiffImpl#getNewResult <em>New Result</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class TestDiffImpl extends EObjectImpl implements TestDiff {
-	/**
-	 * The default value of the '{@link #getLastUpdate() <em>Last Update</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getLastUpdate()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date LAST_UPDATE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getLastUpdate() <em>Last Update</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getLastUpdate()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date lastUpdate = LAST_UPDATE_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getConfig() <em>Config</em>}' reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getConfig()
-	 * @generated
-	 * @ordered
-	 */
-	protected TestConfig config;
-
-	/**
-	 * The cached value of the '{@link #getOldResult() <em>Old Result</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getOldResult()
-	 * @generated
-	 * @ordered
-	 */
-	protected TestResult oldResult;
-
-	/**
-	 * The cached value of the '{@link #getNewResult() <em>New Result</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getNewResult()
-	 * @generated
-	 * @ordered
-	 */
-	protected TestResult newResult;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestDiffImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.TEST_DIFF;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Date getLastUpdate() {
-		return lastUpdate;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setLastUpdate(Date newLastUpdate) {
-		Date oldLastUpdate = lastUpdate;
-		lastUpdate = newLastUpdate;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_DIFF__LAST_UPDATE, oldLastUpdate,
-				lastUpdate));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestConfig getConfig() {
-		if (config != null && config.eIsProxy()) {
-			InternalEObject oldConfig = (InternalEObject) config;
-			config = (TestConfig) eResolveProxy(oldConfig);
-			if (config != oldConfig) {
-				if (eNotificationRequired())
-					eNotify(new ENotificationImpl(this, Notification.RESOLVE, ConfigPackage.TEST_DIFF__CONFIG,
-						oldConfig, config));
-			}
-		}
-		return config;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestConfig basicGetConfig() {
-		return config;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setConfig(TestConfig newConfig) {
-		TestConfig oldConfig = config;
-		config = newConfig;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_DIFF__CONFIG, oldConfig, config));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestResult getOldResult() {
-		return oldResult;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetOldResult(TestResult newOldResult, NotificationChain msgs) {
-		TestResult oldOldResult = oldResult;
-		oldResult = newOldResult;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-				ConfigPackage.TEST_DIFF__OLD_RESULT, oldOldResult, newOldResult);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setOldResult(TestResult newOldResult) {
-		if (newOldResult != oldResult) {
-			NotificationChain msgs = null;
-			if (oldResult != null)
-				msgs = ((InternalEObject) oldResult).eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_DIFF__OLD_RESULT, null, msgs);
-			if (newOldResult != null)
-				msgs = ((InternalEObject) newOldResult).eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_DIFF__OLD_RESULT, null, msgs);
-			msgs = basicSetOldResult(newOldResult, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_DIFF__OLD_RESULT, newOldResult,
-				newOldResult));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestResult getNewResult() {
-		return newResult;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetNewResult(TestResult newNewResult, NotificationChain msgs) {
-		TestResult oldNewResult = newResult;
-		newResult = newNewResult;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-				ConfigPackage.TEST_DIFF__NEW_RESULT, oldNewResult, newNewResult);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setNewResult(TestResult newNewResult) {
-		if (newNewResult != newResult) {
-			NotificationChain msgs = null;
-			if (newResult != null)
-				msgs = ((InternalEObject) newResult).eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_DIFF__NEW_RESULT, null, msgs);
-			if (newNewResult != null)
-				msgs = ((InternalEObject) newNewResult).eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_DIFF__NEW_RESULT, null, msgs);
-			msgs = basicSetNewResult(newNewResult, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_DIFF__NEW_RESULT, newNewResult,
-				newNewResult));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-			return basicSetOldResult(null, msgs);
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			return basicSetNewResult(null, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.TEST_DIFF__LAST_UPDATE:
-			return getLastUpdate();
-		case ConfigPackage.TEST_DIFF__CONFIG:
-			if (resolve)
-				return getConfig();
-			return basicGetConfig();
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-			return getOldResult();
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			return getNewResult();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.TEST_DIFF__LAST_UPDATE:
-			setLastUpdate((Date) newValue);
-			return;
-		case ConfigPackage.TEST_DIFF__CONFIG:
-			setConfig((TestConfig) newValue);
-			return;
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-			setOldResult((TestResult) newValue);
-			return;
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			setNewResult((TestResult) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_DIFF__LAST_UPDATE:
-			setLastUpdate(LAST_UPDATE_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_DIFF__CONFIG:
-			setConfig((TestConfig) null);
-			return;
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-			setOldResult((TestResult) null);
-			return;
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			setNewResult((TestResult) null);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_DIFF__LAST_UPDATE:
-			return LAST_UPDATE_EDEFAULT == null ? lastUpdate != null : !LAST_UPDATE_EDEFAULT.equals(lastUpdate);
-		case ConfigPackage.TEST_DIFF__CONFIG:
-			return config != null;
-		case ConfigPackage.TEST_DIFF__OLD_RESULT:
-			return oldResult != null;
-		case ConfigPackage.TEST_DIFF__NEW_RESULT:
-			return newResult != null;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (lastUpdate: ");
-		result.append(lastUpdate);
-		result.append(')');
-		return result.toString();
-	}
-
-} // TestDiffImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestResultImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestResultImpl.java
deleted file mode 100644
index 2552221..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestResultImpl.java
+++ /dev/null
@@ -1,419 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import org.eclipse.emf.common.notify.Notification;
-
-import org.eclipse.emf.ecore.EClass;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Test Result</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl#getSeedCount <em>Seed Count</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl#getTestName <em>Test Name</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl#getError <em>Error</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl#getFailure <em>Failure</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestResultImpl#getExecutionTime <em>Execution Time</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class TestResultImpl extends EObjectImpl implements TestResult {
-	/**
-	 * The default value of the '{@link #getSeedCount() <em>Seed Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getSeedCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final int SEED_COUNT_EDEFAULT = 0;
-
-	/**
-	 * The cached value of the '{@link #getSeedCount() <em>Seed Count</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getSeedCount()
-	 * @generated
-	 * @ordered
-	 */
-	protected int seedCount = SEED_COUNT_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getTestName() <em>Test Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getTestName()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String TEST_NAME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTestName() <em>Test Name</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getTestName()
-	 * @generated
-	 * @ordered
-	 */
-	protected String testName = TEST_NAME_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getError() <em>Error</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getError()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String ERROR_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getError() <em>Error</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getError()
-	 * @generated
-	 * @ordered
-	 */
-	protected String error = ERROR_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getFailure() <em>Failure</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getFailure()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final String FAILURE_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getFailure() <em>Failure</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getFailure()
-	 * @generated
-	 * @ordered
-	 */
-	protected String failure = FAILURE_EDEFAULT;
-
-	/**
-	 * The default value of the '{@link #getExecutionTime() <em>Execution Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getExecutionTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final long EXECUTION_TIME_EDEFAULT = 0L;
-
-	/**
-	 * The cached value of the '{@link #getExecutionTime() <em>Execution Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getExecutionTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected long executionTime = EXECUTION_TIME_EDEFAULT;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestResultImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.TEST_RESULT;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public int getSeedCount() {
-		return seedCount;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setSeedCount(int newSeedCount) {
-		int oldSeedCount = seedCount;
-		seedCount = newSeedCount;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RESULT__SEED_COUNT, oldSeedCount,
-				seedCount));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getTestName() {
-		return testName;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTestName(String newTestName) {
-		String oldTestName = testName;
-		testName = newTestName;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RESULT__TEST_NAME, oldTestName,
-				testName));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getError() {
-		return error;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setError(String newError) {
-		String oldError = error;
-		error = newError;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RESULT__ERROR, oldError, error));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public String getFailure() {
-		return failure;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setFailure(String newFailure) {
-		String oldFailure = failure;
-		failure = newFailure;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RESULT__FAILURE, oldFailure,
-				failure));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public long getExecutionTime() {
-		return executionTime;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setExecutionTime(long newExecutionTime) {
-		long oldExecutionTime = executionTime;
-		executionTime = newExecutionTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RESULT__EXECUTION_TIME,
-				oldExecutionTime, executionTime));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RESULT__SEED_COUNT:
-			return getSeedCount();
-		case ConfigPackage.TEST_RESULT__TEST_NAME:
-			return getTestName();
-		case ConfigPackage.TEST_RESULT__ERROR:
-			return getError();
-		case ConfigPackage.TEST_RESULT__FAILURE:
-			return getFailure();
-		case ConfigPackage.TEST_RESULT__EXECUTION_TIME:
-			return getExecutionTime();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RESULT__SEED_COUNT:
-			setSeedCount((Integer) newValue);
-			return;
-		case ConfigPackage.TEST_RESULT__TEST_NAME:
-			setTestName((String) newValue);
-			return;
-		case ConfigPackage.TEST_RESULT__ERROR:
-			setError((String) newValue);
-			return;
-		case ConfigPackage.TEST_RESULT__FAILURE:
-			setFailure((String) newValue);
-			return;
-		case ConfigPackage.TEST_RESULT__EXECUTION_TIME:
-			setExecutionTime((Long) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RESULT__SEED_COUNT:
-			setSeedCount(SEED_COUNT_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_RESULT__TEST_NAME:
-			setTestName(TEST_NAME_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_RESULT__ERROR:
-			setError(ERROR_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_RESULT__FAILURE:
-			setFailure(FAILURE_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_RESULT__EXECUTION_TIME:
-			setExecutionTime(EXECUTION_TIME_EDEFAULT);
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RESULT__SEED_COUNT:
-			return seedCount != SEED_COUNT_EDEFAULT;
-		case ConfigPackage.TEST_RESULT__TEST_NAME:
-			return TEST_NAME_EDEFAULT == null ? testName != null : !TEST_NAME_EDEFAULT.equals(testName);
-		case ConfigPackage.TEST_RESULT__ERROR:
-			return ERROR_EDEFAULT == null ? error != null : !ERROR_EDEFAULT.equals(error);
-		case ConfigPackage.TEST_RESULT__FAILURE:
-			return FAILURE_EDEFAULT == null ? failure != null : !FAILURE_EDEFAULT.equals(failure);
-		case ConfigPackage.TEST_RESULT__EXECUTION_TIME:
-			return executionTime != EXECUTION_TIME_EDEFAULT;
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (seedCount: ");
-		result.append(seedCount);
-		result.append(", testName: ");
-		result.append(testName);
-		result.append(", error: ");
-		result.append(error);
-		result.append(", failure: ");
-		result.append(failure);
-		result.append(", executionTime: ");
-		result.append(executionTime);
-		result.append(')');
-		return result.toString();
-	}
-
-} // TestResultImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestRunImpl.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestRunImpl.java
deleted file mode 100644
index 9414427..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/impl/TestRunImpl.java
+++ /dev/null
@@ -1,323 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.impl;
-
-import java.util.Collection;
-import java.util.Date;
-
-import org.eclipse.emf.common.notify.Notification;
-import org.eclipse.emf.common.notify.NotificationChain;
-
-import org.eclipse.emf.common.util.EList;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.InternalEObject;
-
-import org.eclipse.emf.ecore.impl.ENotificationImpl;
-import org.eclipse.emf.ecore.impl.EObjectImpl;
-
-import org.eclipse.emf.ecore.util.EObjectContainmentEList;
-import org.eclipse.emf.ecore.util.InternalEList;
-
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * <!-- begin-user-doc -->
- * An implementation of the model object '<em><b>Test Run</b></em>'.
- * <!-- end-user-doc -->
- * <p>
- * The following features are implemented:
- * <ul>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl#getConfig <em>Config</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl#getTime <em>Time</em>}</li>
- * <li>{@link org.eclipse.emf.emfstore.fuzzy.emf.config.impl.TestRunImpl#getResults <em>Results</em>}</li>
- * </ul>
- * </p>
- * 
- * @generated
- */
-public class TestRunImpl extends EObjectImpl implements TestRun {
-	/**
-	 * The cached value of the '{@link #getConfig() <em>Config</em>}' containment reference.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getConfig()
-	 * @generated
-	 * @ordered
-	 */
-	protected TestConfig config;
-
-	/**
-	 * The default value of the '{@link #getTime() <em>Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected static final Date TIME_EDEFAULT = null;
-
-	/**
-	 * The cached value of the '{@link #getTime() <em>Time</em>}' attribute.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getTime()
-	 * @generated
-	 * @ordered
-	 */
-	protected Date time = TIME_EDEFAULT;
-
-	/**
-	 * The cached value of the '{@link #getResults() <em>Results</em>}' containment reference list.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @see #getResults()
-	 * @generated
-	 * @ordered
-	 */
-	protected EList<TestResult> results;
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected TestRunImpl() {
-		super();
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	protected EClass eStaticClass() {
-		return ConfigPackage.Literals.TEST_RUN;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public TestConfig getConfig() {
-		return config;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public NotificationChain basicSetConfig(TestConfig newConfig, NotificationChain msgs) {
-		TestConfig oldConfig = config;
-		config = newConfig;
-		if (eNotificationRequired()) {
-			ENotificationImpl notification = new ENotificationImpl(this, Notification.SET,
-				ConfigPackage.TEST_RUN__CONFIG, oldConfig, newConfig);
-			if (msgs == null)
-				msgs = notification;
-			else
-				msgs.add(notification);
-		}
-		return msgs;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setConfig(TestConfig newConfig) {
-		if (newConfig != config) {
-			NotificationChain msgs = null;
-			if (config != null)
-				msgs = ((InternalEObject) config).eInverseRemove(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_RUN__CONFIG, null, msgs);
-			if (newConfig != null)
-				msgs = ((InternalEObject) newConfig).eInverseAdd(this, EOPPOSITE_FEATURE_BASE
-					- ConfigPackage.TEST_RUN__CONFIG, null, msgs);
-			msgs = basicSetConfig(newConfig, msgs);
-			if (msgs != null)
-				msgs.dispatch();
-		} else if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RUN__CONFIG, newConfig, newConfig));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public Date getTime() {
-		return time;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public void setTime(Date newTime) {
-		Date oldTime = time;
-		time = newTime;
-		if (eNotificationRequired())
-			eNotify(new ENotificationImpl(this, Notification.SET, ConfigPackage.TEST_RUN__TIME, oldTime, time));
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public EList<TestResult> getResults() {
-		if (results == null) {
-			results = new EObjectContainmentEList<TestResult>(TestResult.class, this, ConfigPackage.TEST_RUN__RESULTS);
-		}
-		return results;
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public NotificationChain eInverseRemove(InternalEObject otherEnd, int featureID, NotificationChain msgs) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RUN__CONFIG:
-			return basicSetConfig(null, msgs);
-		case ConfigPackage.TEST_RUN__RESULTS:
-			return ((InternalEList<?>) getResults()).basicRemove(otherEnd, msgs);
-		}
-		return super.eInverseRemove(otherEnd, featureID, msgs);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public Object eGet(int featureID, boolean resolve, boolean coreType) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RUN__CONFIG:
-			return getConfig();
-		case ConfigPackage.TEST_RUN__TIME:
-			return getTime();
-		case ConfigPackage.TEST_RUN__RESULTS:
-			return getResults();
-		}
-		return super.eGet(featureID, resolve, coreType);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@SuppressWarnings("unchecked")
-	@Override
-	public void eSet(int featureID, Object newValue) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RUN__CONFIG:
-			setConfig((TestConfig) newValue);
-			return;
-		case ConfigPackage.TEST_RUN__TIME:
-			setTime((Date) newValue);
-			return;
-		case ConfigPackage.TEST_RUN__RESULTS:
-			getResults().clear();
-			getResults().addAll((Collection<? extends TestResult>) newValue);
-			return;
-		}
-		super.eSet(featureID, newValue);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public void eUnset(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RUN__CONFIG:
-			setConfig((TestConfig) null);
-			return;
-		case ConfigPackage.TEST_RUN__TIME:
-			setTime(TIME_EDEFAULT);
-			return;
-		case ConfigPackage.TEST_RUN__RESULTS:
-			getResults().clear();
-			return;
-		}
-		super.eUnset(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public boolean eIsSet(int featureID) {
-		switch (featureID) {
-		case ConfigPackage.TEST_RUN__CONFIG:
-			return config != null;
-		case ConfigPackage.TEST_RUN__TIME:
-			return TIME_EDEFAULT == null ? time != null : !TIME_EDEFAULT.equals(time);
-		case ConfigPackage.TEST_RUN__RESULTS:
-			return results != null && !results.isEmpty();
-		}
-		return super.eIsSet(featureID);
-	}
-
-	/**
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	@Override
-	public String toString() {
-		if (eIsProxy())
-			return super.toString();
-
-		StringBuffer result = new StringBuffer(super.toString());
-		result.append(" (time: ");
-		result.append(time);
-		result.append(')');
-		return result.toString();
-	}
-
-} // TestRunImpl
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigAdapterFactory.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigAdapterFactory.java
deleted file mode 100644
index 67ddb3c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigAdapterFactory.java
+++ /dev/null
@@ -1,267 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.util;
-
-import org.eclipse.emf.common.notify.Adapter;
-import org.eclipse.emf.common.notify.Notifier;
-import org.eclipse.emf.common.notify.impl.AdapterFactoryImpl;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Adapter Factory</b> for the model.
- * It provides an adapter <code>createXXX</code> method for each class of the model.
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage
- * @generated
- */
-public class ConfigAdapterFactory extends AdapterFactoryImpl {
-	/**
-	 * The cached model package.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static ConfigPackage modelPackage;
-
-	/**
-	 * Creates an instance of the adapter factory.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigAdapterFactory() {
-		if (modelPackage == null) {
-			modelPackage = ConfigPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Returns whether this factory is applicable for the type of the object.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns <code>true</code> if the object is either the model's package or is an instance
-	 * object of the model.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return whether this factory is applicable for the type of the object.
-	 * @generated
-	 */
-	@Override
-	public boolean isFactoryForType(Object object) {
-		if (object == modelPackage) {
-			return true;
-		}
-		if (object instanceof EObject) {
-			return ((EObject) object).eClass().getEPackage() == modelPackage;
-		}
-		return false;
-	}
-
-	/**
-	 * The switch that delegates to the <code>createXXX</code> methods.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected ConfigSwitch<Adapter> modelSwitch = new ConfigSwitch<Adapter>() {
-		@Override
-		public Adapter caseTestConfig(TestConfig object) {
-			return createTestConfigAdapter();
-		}
-
-		@Override
-		public Adapter caseTestRun(TestRun object) {
-			return createTestRunAdapter();
-		}
-
-		@Override
-		public Adapter caseTestResult(TestResult object) {
-			return createTestResultAdapter();
-		}
-
-		@Override
-		public Adapter caseTestDiff(TestDiff object) {
-			return createTestDiffAdapter();
-		}
-
-		@Override
-		public Adapter caseDiffReport(DiffReport object) {
-			return createDiffReportAdapter();
-		}
-
-		@Override
-		public Adapter caseRoot(Root object) {
-			return createRootAdapter();
-		}
-
-		@Override
-		public Adapter caseMutatorConfig(MutatorConfig object) {
-			return createMutatorConfigAdapter();
-		}
-
-		@Override
-		public Adapter defaultCase(EObject object) {
-			return createEObjectAdapter();
-		}
-	};
-
-	/**
-	 * Creates an adapter for the <code>target</code>.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param target the object to adapt.
-	 * @return the adapter for the <code>target</code>.
-	 * @generated
-	 */
-	@Override
-	public Adapter createAdapter(Notifier target) {
-		return modelSwitch.doSwitch((EObject) target);
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig
-	 * <em>Test Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig
-	 * @generated
-	 */
-	public Adapter createTestConfigAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun
-	 * <em>Test Run</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun
-	 * @generated
-	 */
-	public Adapter createTestRunAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult
-	 * <em>Test Result</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult
-	 * @generated
-	 */
-	public Adapter createTestResultAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff
-	 * <em>Test Diff</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff
-	 * @generated
-	 */
-	public Adapter createTestDiffAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport
-	 * <em>Diff Report</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport
-	 * @generated
-	 */
-	public Adapter createDiffReportAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.Root
-	 * <em>Root</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.Root
-	 * @generated
-	 */
-	public Adapter createRootAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for an object of class '{@link org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig
-	 * <em>Mutator Config</em>}'.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null so that we can easily ignore cases;
-	 * it's useful to ignore a case when inheritance will catch all the cases anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @see org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig
-	 * @generated
-	 */
-	public Adapter createMutatorConfigAdapter() {
-		return null;
-	}
-
-	/**
-	 * Creates a new adapter for the default case.
-	 * <!-- begin-user-doc -->
-	 * This default implementation returns null.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the new adapter.
-	 * @generated
-	 */
-	public Adapter createEObjectAdapter() {
-		return null;
-	}
-
-} // ConfigAdapterFactory
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigSwitch.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigSwitch.java
deleted file mode 100644
index da2a386..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/config/util/ConfigSwitch.java
+++ /dev/null
@@ -1,287 +0,0 @@
-/**
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- */
-package org.eclipse.emf.emfstore.fuzzy.emf.config.util;
-
-import java.util.List;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.MutatorConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.Root;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * <!-- begin-user-doc -->
- * The <b>Switch</b> for the model's inheritance hierarchy.
- * It supports the call {@link #doSwitch(EObject) doSwitch(object)} to invoke the <code>caseXXX</code> method for each
- * class of the model,
- * starting with the actual class of the object
- * and proceeding up the inheritance hierarchy
- * until a non-null result is returned,
- * which is the result of the switch.
- * <!-- end-user-doc -->
- * 
- * @see org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigPackage
- * @generated
- */
-public class ConfigSwitch<T> {
-	/**
-	 * The cached model package
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	protected static ConfigPackage modelPackage;
-
-	/**
-	 * Creates an instance of the switch.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @generated
-	 */
-	public ConfigSwitch() {
-		if (modelPackage == null) {
-			modelPackage = ConfigPackage.eINSTANCE;
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that
-	 * result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	public T doSwitch(EObject theEObject) {
-		return doSwitch(theEObject.eClass(), theEObject);
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that
-	 * result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(EClass theEClass, EObject theEObject) {
-		if (theEClass.eContainer() == modelPackage) {
-			return doSwitch(theEClass.getClassifierID(), theEObject);
-		} else {
-			List<EClass> eSuperTypes = theEClass.getESuperTypes();
-			return eSuperTypes.isEmpty() ? defaultCase(theEObject) : doSwitch(eSuperTypes.get(0), theEObject);
-		}
-	}
-
-	/**
-	 * Calls <code>caseXXX</code> for each class of the model until one returns a non null result; it yields that
-	 * result.
-	 * <!-- begin-user-doc -->
-	 * <!-- end-user-doc -->
-	 * 
-	 * @return the first non-null result returned by a <code>caseXXX</code> call.
-	 * @generated
-	 */
-	protected T doSwitch(int classifierID, EObject theEObject) {
-		switch (classifierID) {
-		case ConfigPackage.TEST_CONFIG: {
-			TestConfig testConfig = (TestConfig) theEObject;
-			T result = caseTestConfig(testConfig);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.TEST_RUN: {
-			TestRun testRun = (TestRun) theEObject;
-			T result = caseTestRun(testRun);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.TEST_RESULT: {
-			TestResult testResult = (TestResult) theEObject;
-			T result = caseTestResult(testResult);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.TEST_DIFF: {
-			TestDiff testDiff = (TestDiff) theEObject;
-			T result = caseTestDiff(testDiff);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.DIFF_REPORT: {
-			DiffReport diffReport = (DiffReport) theEObject;
-			T result = caseDiffReport(diffReport);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.ROOT: {
-			Root root = (Root) theEObject;
-			T result = caseRoot(root);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		case ConfigPackage.MUTATOR_CONFIG: {
-			MutatorConfig mutatorConfig = (MutatorConfig) theEObject;
-			T result = caseMutatorConfig(mutatorConfig);
-			if (result == null)
-				result = defaultCase(theEObject);
-			return result;
-		}
-		default:
-			return defaultCase(theEObject);
-		}
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Test Config</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Test Config</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseTestConfig(TestConfig object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Test Run</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Test Run</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseTestRun(TestRun object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Test Result</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Test Result</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseTestResult(TestResult object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Test Diff</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Test Diff</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseTestDiff(TestDiff object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Diff Report</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Diff Report</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseDiffReport(DiffReport object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Root</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Root</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseRoot(Root object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>Mutator Config</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>Mutator Config</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject) doSwitch(EObject)
-	 * @generated
-	 */
-	public T caseMutatorConfig(MutatorConfig object) {
-		return null;
-	}
-
-	/**
-	 * Returns the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * <!-- begin-user-doc -->
-	 * This implementation returns null;
-	 * returning a non-null result will terminate the switch, but this is the last case anyway.
-	 * <!-- end-user-doc -->
-	 * 
-	 * @param object the target of the switch.
-	 * @return the result of interpreting the object as an instance of '<em>EObject</em>'.
-	 * @see #doSwitch(org.eclipse.emf.ecore.EObject)
-	 * @generated
-	 */
-	public T defaultCase(EObject object) {
-		return null;
-	}
-
-} // ConfigSwitch
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/CreateAllDiffs.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/CreateAllDiffs.java
deleted file mode 100644
index 5d86204..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/CreateAllDiffs.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.diff;
-
-import java.io.IOException;
-
-import org.dom4j.DocumentException;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-import org.junit.Test;
-
-/**
- * Class used as junit plugin test to create {@link org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport}s from an
- * {@link TestRunProvider}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class CreateAllDiffs {
-
-	private static final String CREATE_DIFFS = "createDiffs";
-
-	/**
-	 * Creates all {@link org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff}s from an {@link TestRunProvider}.
-	 */
-	@Test
-	public void createAllDiffs() {
-		
-		if(!Boolean.parseBoolean(System.getProperty(CREATE_DIFFS))){
-			return;
-		}
-		
-		DiffGenerator diffGenerator = new DiffGenerator();
-		
-		try {
-			HudsonTestRunProvider runProvider = new HudsonTestRunProvider();
-			for (TestConfig config : runProvider.getAllConfigs()) {
-				runProvider.setConfig(config);
-				TestRun[] runs = runProvider.getTestRuns();
-				diffGenerator.createDiff(runs[0], runs[1]);
-			}		
-		} catch (DocumentException e) {
-			throw new RuntimeException("Could not create diffs.", e);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not create diffs.", e);
-		}
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/DiffGenerator.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/DiffGenerator.java
deleted file mode 100644
index f49a991..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/DiffGenerator.java
+++ /dev/null
@@ -1,202 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.diff;
-
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.common.util.EList;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.emfstore.fuzzy.emf.FuzzyUtil;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.ConfigFactory;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.DiffReport;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestDiff;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestResult;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * Generates {@link TestDiff}s out of {@link TestRun}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class DiffGenerator {
-
-	private DiffReport diffReport;
-
-	private Resource diffResource;
-
-	/**
-	 * A {@link DiffGenerator} with the standard diff file {@link FuzzyUtil#DIFF_FILE}.
-	 */
-	public DiffGenerator() {
-		this(FuzzyUtil.DIFF_FILE);
-	}
-
-	/**
-	 * A {@link DiffGenerator} with using the diffPath.
-	 * 
-	 * @param diffPath The path to the Diff file.
-	 */
-	public DiffGenerator(String diffPath) {
-		this(FuzzyUtil.createResource(diffPath));
-	}
-
-	/**
-	 * A {@link DiffGenerator} using the diffResource.
-	 * 
-	 * @param diffResource The resource to use for the diff.
-	 */
-	public DiffGenerator(Resource diffResource) {
-		this.diffResource = diffResource;
-
-		if (FuzzyUtil.resourceExists(diffResource)) {
-			try {
-				diffResource.load(null);
-			} catch (IOException e) {
-				throw new RuntimeException("Could not load resource: " + diffResource.getURI(), e);
-			}
-		}
-
-		diffReport = getDiffReport(diffResource);
-	}
-
-	/**
-	 * Create a diff from two {@link TestRun}s.
-	 * 
-	 * @param firstRun The first {@link TestRun}.
-	 * @param secondRun The second {@link TestRun}.
-	 * @throws IOException If there is a saving/loading failure with resources.
-	 */
-	public void createDiff(TestRun firstRun, TestRun secondRun) throws IOException {
-
-		TestConfig config = firstRun.getConfig();
-
-		// check if it already contains the config
-		boolean containsConfig = false;
-		// create map containing existing diffs
-		// identified through testname + seedcount (e.g. test1)
-		Map<String, TestDiff> existingDiffs = new HashMap<String, TestDiff>();
-		List<TestDiff> diffs = diffReport.getDiffs();
-		for (TestDiff diff : diffs) {
-
-			// add existing diffs
-			TestResult result = FuzzyUtil.getValidTestResult(diff);
-			existingDiffs.put(getResultIdentifier(result), diff);
-
-			// check for configs
-			if ((!containsConfig) && (diff.getConfig().getId().equals(config.getId()))) {
-				containsConfig = true;
-				config = diff.getConfig();
-			}
-		}
-
-		// if the resource does not contain the config already add it
-		if (!containsConfig) {
-			diffResource.getContents().add(config);
-		}
-
-		// create diffs for the two testruns
-		checkForDiffs(firstRun.getResults(), secondRun.getResults(), config, existingDiffs);
-		checkForDiffs(secondRun.getResults(), firstRun.getResults(), config, existingDiffs);
-
-		diffResource.getContents().add(diffReport);
-		diffResource.save(null);
-	}
-
-	private void checkForDiffs(List<TestResult> firstResults, List<TestResult> secondResults, TestConfig config,
-		Map<String, TestDiff> existingDiffs) {
-		EList<TestDiff> diffs = diffReport.getDiffs();
-		for (TestResult result : new ArrayList<TestResult>(firstResults)) {
-			TestResult corrResult = getCorrespondingTestResult(result, secondResults);
-
-			TestDiff diff = getChangedTestDiff(result, corrResult);
-			if (diff != null) {
-				diff.setConfig(config);
-
-				// remove diff if it already contains it
-				diffs.remove(existingDiffs.get(getResultIdentifier(result)));
-				diffs.add(diff);
-			}
-		}
-	}
-
-	private static String getResultIdentifier(TestResult result) {
-		return result.getTestName() + result.getSeedCount();
-	}
-
-	private static TestDiff getChangedTestDiff(TestResult fRes, TestResult sRes) {
-		boolean changed = false;
-
-		// check if a state switch occured
-		// TODO test state switches
-		if (fRes == null || sRes == null) {
-			changed = true;
-		} else if (changed(fRes.getFailure(), sRes.getFailure())) {
-			changed = true;
-		} else if (changed(fRes.getError(), sRes.getError())) {
-			changed = true;
-		} else if (fRes.getFailure() != null && sRes.getError() != null) {
-			changed = true;
-		} else if (fRes.getError() != null && sRes.getFailure() != null) {
-			changed = true;
-		}
-
-		// if it changed, create a new TestDiff
-		if (changed) {
-			return createTestDiff(fRes, sRes);
-		}
-
-		return null;
-	}
-
-	private static boolean changed(Object o1, Object o2) {
-		if (o1 == null && o2 != null) {
-			return true;
-		}
-		if (o1 != null && o2 == null) {
-			return true;
-		}
-		return false;
-	}
-
-	private static TestDiff createTestDiff(TestResult fRes, TestResult sRes) {
-		TestDiff diff = ConfigFactory.eINSTANCE.createTestDiff();
-		diff.setLastUpdate(new Date(System.currentTimeMillis()));
-		diff.setOldResult(fRes);
-		diff.setNewResult(sRes);
-		return diff;
-	}
-
-	private static TestResult getCorrespondingTestResult(TestResult result, List<TestResult> results) {
-		for (TestResult res : results) {
-			if (res.getSeedCount() == result.getSeedCount() && res.getTestName().equals(result.getTestName())) {
-				return res;
-			}
-		}
-		return null;
-	}
-
-	private static DiffReport getDiffReport(Resource resource) {
-		for (EObject obj : resource.getContents()) {
-			if (obj instanceof DiffReport) {
-				return (DiffReport) obj;
-			}
-		}
-		return ConfigFactory.eINSTANCE.createDiffReport();
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/FileTestRunProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/FileTestRunProvider.java
deleted file mode 100644
index 26263f4..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/FileTestRunProvider.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.diff;
-
-import java.io.IOException;
-
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.emfstore.fuzzy.emf.FuzzyUtil;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * A {@link TestRunProvider} reading the infos out of files.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class FileTestRunProvider extends TestRunProvider {
-
-	@Override
-	public TestRun[] getTestRuns() throws IOException {
-
-		Resource run1Resource = FuzzyUtil.createResource("file://D:/downloads/1.xml");
-		Resource run2Resource = FuzzyUtil.createResource("file://D:/downloads/2.xml");
-
-		if (FuzzyUtil.resourceExists(run1Resource)) {
-			run1Resource.load(null);
-		}
-		if (FuzzyUtil.resourceExists(run2Resource)) {
-			run2Resource.load(null);
-		}
-
-		return new TestRun[] { getTestRun(run1Resource), getTestRun(run2Resource) };
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/HudsonTestRunProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/HudsonTestRunProvider.java
deleted file mode 100644
index 0fb4fc0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/HudsonTestRunProvider.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.diff;
-
-import java.io.IOException;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.dom4j.Document;
-import org.dom4j.DocumentException;
-import org.dom4j.Element;
-import org.dom4j.io.SAXReader;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.emfstore.fuzzy.emf.FuzzyUtil;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * An implementation of {@link TestRunProvider} to provide {@link TestRun}s created by the CI-Server Hudson.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class HudsonTestRunProvider extends TestRunProvider {
-
-	private static final String JOB = "job/";
-
-	private static SAXReader saxReader = new SAXReader();
-
-	private String hudsonUrl;
-
-	private static String jobUrl;
-
-	private int firstBuildNumber;
-
-	private int secondBuildNumber;
-
-	/**
-	 * The prefix for hudson peroperties.
-	 */
-	public static final String PROP_HUDSON = ".hudson";
-
-	/**
-	 * The hudson url property.
-	 */
-	public static final String PROP_URL = ".url";
-
-	/**
-	 * The hudson artifact folder property.
-	 */
-	public static final String PROP_ARTIFACT_FOLDER = ".artifact.folder";
-
-	/**
-	 * The hudson port property.
-	 */
-	public static final String PROP_PORT = ".port";
-
-	/**
-	 * The name of the hudson job property.
-	 */
-	public static final String PROP_JOB = ".job";
-
-	/**
-	 * The property of the hudson diff job.
-	 */
-	public static final String PROP_DIFF_JOB = ".diffjob";
-
-	private static final String LAST_BUILD = "lastBuild";
-
-	/**
-	 * An array containing all valid states of a hudson build. Valid means it can be used for creating diffs.
-	 */
-	public static final String[] VALID_STATES = new String[] { "SUCCESS", "UNSTABLE" };
-
-	private static final String ARTIFACT = FuzzyUtil.getProperty(PROP_HUDSON + PROP_ARTIFACT_FOLDER, "/artifact/");
-
-	/**
-	 * Standard constructor using the last build and the build before the last build for reading testruns.
-	 * 
-	 * @throws DocumentException If it cannot read the buildnumbers correctly from hudson.
-	 * @throws IOException If it cannot read the buildnumbers correctly from hudson.
-	 */
-	public HudsonTestRunProvider() throws DocumentException, IOException {
-		initProperties();
-
-		firstBuildNumber = getLastValidBuildNumber(
-			Integer.parseInt(getFirstElementValue(jobUrl + LAST_BUILD + "/api/xml?tree=number")), jobUrl);
-		secondBuildNumber = getLastValidBuildNumber(firstBuildNumber - 1, jobUrl);
-	}
-
-	/**
-	 * Constructor using tow special numbers for testruns.
-	 * 
-	 * @param firstBuildNumber The number of the first build (first from the last one backwards, so it is later than the
-	 *            second one).
-	 * @param secondBuildNumber The number of the second build.
-	 */
-	public HudsonTestRunProvider(int firstBuildNumber, int secondBuildNumber) {
-		initProperties();
-
-		this.firstBuildNumber = firstBuildNumber;
-		this.secondBuildNumber = secondBuildNumber;
-	}
-
-	private void initProperties() {
-		hudsonUrl = getHudsonUrl();
-		jobUrl = hudsonUrl + JOB + FuzzyUtil.getProperty(PROP_HUDSON + PROP_JOB, "Explorer") + "/";
-	}
-
-	private static String getHudsonUrl() {
-		String port = FuzzyUtil.getProperty(PROP_HUDSON + PROP_PORT, null);
-		return FuzzyUtil.getProperty(PROP_HUDSON + PROP_URL, "http://localhost") + (port != null ? (":" + port) : "")
-			+ "/";
-	}
-
-	private static int getLastValidBuildNumber(int maxBuildNumber, String jobUrl) throws MalformedURLException,
-		DocumentException {
-		if (maxBuildNumber < 0) {
-			throw new RuntimeException("There are not enough valid builds till now!");
-		}
-		if (isValidBuild(maxBuildNumber, jobUrl)) {
-			return maxBuildNumber;
-		} else {
-			return getLastValidBuildNumber(maxBuildNumber - 1, jobUrl);
-		}
-	}
-
-	private static boolean isValidBuild(int buildNumber, String jobUrl) throws MalformedURLException, DocumentException {
-		String result = getFirstElementValue(jobUrl + buildNumber + "/api/xml?tree=result");
-		for (String valid : VALID_STATES) {
-			if (valid.equals(result)) {
-				return true;
-			}
-		}
-		return false;
-	}
-
-	@SuppressWarnings("unchecked")
-	private static String getFirstElementValue(String url) throws MalformedURLException, DocumentException {
-		Document doc = saxReader.read(new URL(url));
-		List<Element> elements = doc.getRootElement().elements();
-		if (elements.size() == 0) {
-			throw new RuntimeException("There are no elements in the result of the url: " + url);
-		}
-		return elements.get(0).getText();
-	}
-
-	@Override
-	public TestRun[] getTestRuns() throws IOException {
-
-		TestRun[] runs = new TestRun[2];
-
-		Resource resource = getTestRunResource(firstBuildNumber);
-		if (!FuzzyUtil.resourceExists(resource)) {
-			throw new RuntimeException("No TestRun file for first run!");
-		}
-		resource.load(null);
-
-		runs[0] = getTestRun(resource);
-
-		resource = getTestRunResource(secondBuildNumber);
-		if (!FuzzyUtil.resourceExists(resource)) {
-			throw new RuntimeException("No TestRun file for second run!");
-		}
-		resource.load(null);
-
-		runs[1] = getTestRun(resource);
-
-		return runs;
-	}
-
-	private Resource getTestRunResource(int buildNumber) {
-		return FuzzyUtil.createResource(jobUrl + buildNumber + ARTIFACT + FuzzyUtil.FUZZY_FOLDER + FuzzyUtil.RUN_FOLDER
-			+ getTestConfig().getId() + FuzzyUtil.FILE_SUFFIX);
-	}
-
-	/**
-	 * @return All {@link TestConfig} which are loadable via this {@link HudsonTestRunProvider}.
-	 */
-	public List<TestConfig> getAllConfigs() {
-		Resource resource = FuzzyUtil.createResource(jobUrl + firstBuildNumber + ARTIFACT + FuzzyUtil.FUZZY_FOLDER
-			+ FuzzyUtil.TEST_CONFIG_FILE);
-		try {
-			resource.load(null);
-		} catch (IOException e) {
-			throw new RuntimeException("Could not load configs file!", e);
-		}
-		List<TestConfig> configs = new ArrayList<TestConfig>();
-		for (EObject obj : resource.getContents()) {
-			if (obj instanceof TestConfig) {
-				configs.add((TestConfig) obj);
-			}
-		}
-		return configs;
-	}
-
-	/**
-	 * @return The diff resource created by hudson.
-	 * @throws DocumentException 
-	 * 			in case an error occurs during obtainment of the resource.
-	 * @throws MalformedURLException
-	 * 			in case an error occurs during obtainment of the resource.
-	 */
-	public static Resource getDiffResource() throws MalformedURLException, DocumentException {
-		String diffJobUrl = getHudsonUrl() + JOB + FuzzyUtil.getProperty(PROP_HUDSON + PROP_DIFF_JOB, "Diff") + "/";
-		int lastValidNumber = getLastValidBuildNumber(
-			Integer.parseInt(getFirstElementValue(diffJobUrl + LAST_BUILD + "/api/xml?tree=number")), diffJobUrl);
-		return FuzzyUtil.createResource(diffJobUrl + lastValidNumber + ARTIFACT + FuzzyUtil.FUZZY_FOLDER + "diff"
-			+ FuzzyUtil.FILE_SUFFIX);
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/TestRunProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/TestRunProvider.java
deleted file mode 100644
index c745b5c..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy.emf/src/org/eclipse/emf/emfstore/fuzzy/emf/diff/TestRunProvider.java
+++ /dev/null
@@ -1,65 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy.emf.diff;
-
-import java.io.IOException;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.resource.Resource;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestConfig;
-import org.eclipse.emf.emfstore.fuzzy.emf.config.TestRun;
-
-/**
- * Abstract TestRunProvider to provide the {@link TestRun}s needed in the {@link DiffGenerator}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public abstract class TestRunProvider {
-
-	/**
-	 * The config for which to provide testruns.
-	 */
-	private TestConfig config;
-
-	/**
-	 * @return The two {@link TestRun}s specified by the config and this provider.
-	 * @throws IOException If there is an error reading the {@link TestRun}s.
-	 */
-	public abstract TestRun[] getTestRuns() throws IOException;
-
-	/**
-	 * @param config The new {@link TestConfig} to use.
-	 */
-	public void setConfig(TestConfig config) {
-		this.config = config;
-	}
-
-	/**
-	 * @param resource The {@link Resource} where to get a {@link TestRun} out.
-	 * @return The {@link TestRun} out of the {@link Resource}.
-	 */
-	protected TestRun getTestRun(Resource resource) {
-		for (EObject obj : resource.getContents()) {
-			if (obj instanceof TestRun) {
-				return (TestRun) obj;
-			}
-		}
-		throw new RuntimeException("Could not load TestRuns from config!");
-	}
-
-	/**
-	 * @return The current {@link TestConfig}.
-	 */
-	protected TestConfig getTestConfig() {
-		return config;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.classpath b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.classpath
deleted file mode 100644
index 304e861..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.classpath
+++ /dev/null
@@ -1,7 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<classpath>
-	<classpathentry kind="src" path="src"/>
-	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/J2SE-1.5"/>
-	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
-	<classpathentry kind="output" path="bin"/>
-</classpath>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.project b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.project
deleted file mode 100644
index 3724be2..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.project
+++ /dev/null
@@ -1,34 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<projectDescription>
-	<name>org.eclipse.emf.emfstore.fuzzy</name>
-	<comment></comment>
-	<projects>
-	</projects>
-	<buildSpec>
-		<buildCommand>
-			<name>org.eclipse.jdt.core.javabuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.ManifestBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>org.eclipse.pde.SchemaBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-		<buildCommand>
-			<name>net.sf.eclipsecs.core.CheckstyleBuilder</name>
-			<arguments>
-			</arguments>
-		</buildCommand>
-	</buildSpec>
-	<natures>
-		<nature>org.eclipse.pde.PluginNature</nature>
-		<nature>org.eclipse.jdt.core.javanature</nature>
-		<nature>net.sf.eclipsecs.core.CheckstyleNature</nature>
-	</natures>
-</projectDescription>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.settings/org.eclipse.jdt.core.prefs b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.settings/org.eclipse.jdt.core.prefs
deleted file mode 100644
index af0f20f..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/.settings/org.eclipse.jdt.core.prefs
+++ /dev/null
@@ -1,7 +0,0 @@
-eclipse.preferences.version=1
-org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
-org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.5
-org.eclipse.jdt.core.compiler.compliance=1.5
-org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
-org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
-org.eclipse.jdt.core.compiler.source=1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/META-INF/MANIFEST.MF b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/META-INF/MANIFEST.MF
deleted file mode 100644
index 15b8456..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/META-INF/MANIFEST.MF
+++ /dev/null
@@ -1,13 +0,0 @@
-Manifest-Version: 1.0
-Bundle-ManifestVersion: 2
-Bundle-Name: Fuzzy JUnit Testing Framework (Incubation)
-Bundle-SymbolicName: org.eclipse.emf.emfstore.fuzzy;singleton:=true
-Bundle-Version: 0.9.3.qualifier
-Bundle-ClassPath: .
-Bundle-Vendor: Eclipse Modeling Project
-Bundle-Localization: plugin
-Export-Package: org.eclipse.emf.emfstore.fuzzy
-Require-Bundle: org.junit4;bundle-version="[4.8.1,5.0.0)";visibility:=reexport
-Eclipse-LazyStart: true
-Bundle-ActivationPolicy: lazy
-Bundle-RequiredExecutionEnvironment: J2SE-1.5
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/build.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/build.properties
deleted file mode 100644
index 6cf6ee0..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/build.properties
+++ /dev/null
@@ -1,12 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-bin.includes = .,\
-               META-INF/,\
-               plugin.properties
-jars.compile.order = .
-source.. = src/
-output.. = bin/
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/plugin.properties b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/plugin.properties
deleted file mode 100644
index fe01abf..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/plugin.properties
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# <copyright>
-# </copyright>
-#
-# $Id$
-
-pluginName = Config Model
-providerName = www.example.org
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/pom.xml b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/pom.xml
deleted file mode 100644
index c8a2785..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/pom.xml
+++ /dev/null
@@ -1,15 +0,0 @@
-<?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.emf.emfstore</groupId>
-    <artifactId>emfstore-parent</artifactId>
-    <version>1.0.0-SNAPSHOT</version>
-    <relativePath>../../releng/emfstore-parent/</relativePath>
-  </parent>
-  <groupId>org.eclipse.emf.emfstore</groupId>
-  <artifactId>org.eclipse.emf.emfstore.fuzzy</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
-  <packaging>eclipse-plugin</packaging>
-</project>
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Annotations.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Annotations.java
deleted file mode 100644
index c654a51..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Annotations.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotations used in tests using the {@link FuzzyRunner}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public final class Annotations {
-
-	/**
-	 * Annotation to declare the field in the test, where to set the data.
-	 * 
-	 * @author Julian Sommerfeldt
-	 * 
-	 */
-	@Retention(RetentionPolicy.RUNTIME)
-	@Target({ ElementType.FIELD })
-	public @interface Data {
-	}
-
-	/**
-	 * Annotations to declare the field for the {@link Util}.
-	 * 
-	 * @author Julian Sommerfeldt
-	 * 
-	 */
-	@Retention(RetentionPolicy.RUNTIME)
-	@Target({ ElementType.FIELD })
-	public @interface Util {
-	}
-
-	/**
-	 * An annotation to set the {@link FuzzyDataProvider} for the {@link FuzzyRunner}.
-	 * 
-	 * @author Julian Sommerfeldt
-	 * 
-	 */
-	@Retention(RetentionPolicy.RUNTIME)
-	@Target({ ElementType.TYPE })
-	public @interface DataProvider {
-
-		/***/
-		Class<?> value();
-	}
-
-	/**
-	 * An optional annotation to declare options to use in the {@link FuzzyDataProvider}.
-	 * 
-	 * @author Julian Sommerfeldt
-	 * 
-	 */
-	@Retention(RetentionPolicy.RUNTIME)
-	@Target({ ElementType.FIELD })
-	public @interface Options {
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyDataProvider.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyDataProvider.java
deleted file mode 100644
index dad15f6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyDataProvider.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-import java.util.List;
-import java.util.Map;
-
-import org.junit.runner.notification.RunListener;
-import org.junit.runners.model.TestClass;
-
-/**
- * A Data Provider for the JUnit Runner: {@link FuzzyRunner}.<br>
- * <br>
- * An implementation of it must have a zero-parameter constructor.
- * 
- * @author Julian Sommerfeldt
- * 
- * @param <T> Type to specify the values created by this data provider.
- */
-public interface FuzzyDataProvider<T> {
-
-	/**
-	 * Creates and returns the data for the next run.<br>
-	 * <br>
-	 * Note that it is strongly recommended to instantiate the data
-	 * in this method for every call and not in the instantiation of the class, e.g. the init method,
-	 * to avoid overloading the memory.
-	 * 
-	 * @param count The count of the testcase.
-	 * @return The data for the next run of the test class.
-	 */
-	T get(int count);
-
-	/**
-	 * This method is called after the {@link FuzzyDataProvider} was created and everything was set BEFORE the first
-	 * run.<br/>
-	 * Should be used to to create internal stuff depending on e.g. the {@link TestClass}.
-	 */
-	void init();
-
-	/**
-	 * @return The total size(count) of the repetition of the tests.
-	 */
-	int size();
-
-	/**
-	 * @param testClass The {@link TestClass} of the calling {@link FuzzyRunner}.
-	 */
-	void setTestClass(TestClass testClass);
-
-	/**
-	 * @return A list of listeners to add to the runner, e.g. to get information about errors. <code>null</code>
-	 *         permitted.
-	 */
-	List<RunListener> getListener();
-
-	/**
-	 * @return A list of {@link Test}s to specify, which tests the {@link FuzzyRunner} should run. <code>null</code>
-	 *         means run all tests.
-	 */
-	List<Test> getTestsToRun();
-
-	/**
-	 * @return The {@link Util} for this {@link FuzzyDataProvider}. <code>null</code> permitted.
-	 */
-	Util getUtil();
-
-	/**
-	 * @param options The options for the {@link FuzzyDataProvider}. Can be <code>null</code>.
-	 */
-	void setOptions(Map<String, Object> options);
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyRunner.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyRunner.java
deleted file mode 100644
index 4f1ef25..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyRunner.java
+++ /dev/null
@@ -1,199 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-import java.lang.annotation.Annotation;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.DataProvider;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Options;
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Util;
-import org.junit.runner.Runner;
-import org.junit.runner.notification.RunListener;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.Suite;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.InitializationError;
-
-/**
- * A {@link Runner} for JUnit, to realize multiple runs with different values for a data field. <br/>
- * <br/>
- * Activate with the {@link org.junit.runner.RunWith} annotation: <code>@RunWith(FuzzyRunner.class)</code>. <br/>
- * <br/>
- * The test class must have a field, which is not static and annotated with {@link Data}, e.g.<br/>
- * <br/>
- * <code>@Data<br/>private Integer i;</code> <br/>
- * <br/>
- * To provide data an implementation of {@link FuzzyDataProvider} can be set via the {@link DataProvider} annotation,
- * e.g.<br/>
- * <br/>
- * <code>@DataProvider(IntDataProvider.class)</code><br/>
- * <br/>
- * This class must implement the interface {@link FuzzyDataProvider}. The default value is the example implementation:
- * {@link IntDataProvider}.<br/>
- * <br/>
- * The {@link MyTest} class illustrates an example usage of the {@link FuzzyRunner}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class FuzzyRunner extends Suite {
-
-	private ArrayList<Runner> runners = new ArrayList<Runner>();
-
-	private FuzzyDataProvider<?> dataProvider;
-
-	/**
-	 * The string representing a seperation in a name (e.g. test name).
-	 */
-	public static final String NAME_SEPARATOR = " ";
-
-	/**
-	 * Default constructor, called by JUnit.
-	 * 
-	 * @param clazz The root class of the suite.
-	 * @throws InitializationError If there
-	 */
-	public FuzzyRunner(Class<?> clazz) throws InitializationError {
-		super(clazz, Collections.<Runner> emptyList());
-		dataProvider = getDataProvider();
-		dataProvider.setTestClass(getTestClass());
-		dataProvider.init();
-		FrameworkField dataField = getDataField();
-		FrameworkField utilField = getUtilField();
-		FrameworkField optionsField = getOptionsField();
-		org.eclipse.emf.emfstore.fuzzy.Util util = dataProvider.getUtil();
-		for (int i = 0; i < dataProvider.size(); i++) {
-			FuzzyTestClassRunner runner = new FuzzyTestClassRunner(clazz, dataProvider, dataField, utilField,
-				optionsField, util, i + 1);
-			if (runner.getChildren().size() > 0) {
-				runners.add(runner);
-			}
-		}
-	}
-
-	/*
-	 * Override to add RunListeners of the FuzzyDataProvider
-	 * (non-Javadoc)
-	 * @see org.junit.runners.ParentRunner#run(org.junit.runner.notification.RunNotifier)
-	 */
-	@Override
-	public void run(final RunNotifier notifier) {
-		List<RunListener> listener = dataProvider.getListener();
-		if (listener != null) {
-			for (RunListener runListener : listener) {
-				notifier.addListener(runListener);
-			}
-		}
-		super.run(notifier);
-	}
-
-	/**
-	 * @return The field annotated with {@link Util}.
-	 * @throws Exception If there is are more than one fitting fields.
-	 */
-	private FrameworkField getUtilField() {
-		return getSingleStaticFrameworkField(Util.class);
-	}
-
-	private FrameworkField getOptionsField() {
-		return getSingleStaticFrameworkField(Options.class);
-	}
-
-	private FrameworkField getSingleStaticFrameworkField(Class<? extends Annotation> annotation) {
-		List<FrameworkField> fields = getTestClass().getAnnotatedFields(annotation);
-
-		// Check if there are more than one Data field in the class
-		if (fields.size() > 1) {
-			throw new RuntimeException("Only one field annotated with " + annotation.getSimpleName() + " permitted: "
-				+ getTestClass().getName() + " contains " + fields.size());
-		}
-
-		// get the field and check modifiers
-		for (FrameworkField field : fields) {
-			int modifiers = field.getField().getModifiers();
-			if (!Modifier.isStatic(modifiers)) {
-				return field;
-			}
-		}
-
-		return null;
-	}
-
-	/**
-	 * @return The field annotated with {@link Data}.
-	 * @throws InitializationError
-	 * @throws Exception If there is not exact one fitting field.
-	 */
-	private FrameworkField getDataField() throws InitializationError {
-		FrameworkField field = getSingleStaticFrameworkField(Data.class);
-
-		if (field == null) {
-			throw new InitializationError("No non-static model field anntoted with " + Data.class.getSimpleName()
-				+ " in class " + getTestClass().getName());
-		}
-
-		return field;
-	}
-
-	/**
-	 * @return The {@link FuzzyDataProvider} defined by the {@link DataProvider} annotation or the default one.
-	 * @throws InitializationError
-	 * @throws Exception If the data provider does not implement the {@link FuzzyDataProvider} interface.
-	 */
-	private FuzzyDataProvider<?> getDataProvider() throws InitializationError {
-		// Get the DataProvider Annotation
-		Annotation[] annotations = getTestClass().getAnnotations();
-
-		// take default DataProvider, if there is no annotation
-		Class<?> dataProviderClass = null;
-
-		// check for the dataprovider annotation
-		for (Annotation annotation : annotations) {
-			if (annotation instanceof DataProvider) {
-
-				// Check if the given class is an implementation of FuzzyDataProvider
-				dataProviderClass = ((DataProvider) annotation).value();
-				if (!FuzzyDataProvider.class.isAssignableFrom(dataProviderClass)) {
-					throw new InitializationError(dataProviderClass + " is not an implementation of "
-						+ FuzzyDataProvider.class.getSimpleName());
-				}
-			}
-		}
-
-		// create a new instance of the DataProvider		
-		try {
-			return (FuzzyDataProvider<?>) dataProviderClass.getConstructor().newInstance();
-		} catch (InstantiationException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		} catch (IllegalAccessException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		} catch (IllegalArgumentException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		} catch (InvocationTargetException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		} catch (NoSuchMethodException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		} catch (SecurityException e) {
-			throw new InitializationError("The DataProvider must have a zero-parameter constructor!");
-		}		 
-	}
-
-	@Override
-	protected List<Runner> getChildren() {
-		return runners;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyTestClassRunner.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyTestClassRunner.java
deleted file mode 100644
index 10cabe6..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/FuzzyTestClassRunner.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.ArrayList;
-import java.util.List;
-import java.util.Map;
-
-import org.eclipse.emf.emfstore.fuzzy.Annotations.Data;
-import org.junit.runner.notification.RunNotifier;
-import org.junit.runners.BlockJUnit4ClassRunner;
-import org.junit.runners.model.FrameworkField;
-import org.junit.runners.model.FrameworkMethod;
-import org.junit.runners.model.InitializationError;
-import org.junit.runners.model.Statement;
-
-/**
- * A {@link org.junit.runner.Runner} for each {@link org.junit.runners.model.TestClass}.
- * Used in the {@link FuzzyRunner}.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class FuzzyTestClassRunner extends BlockJUnit4ClassRunner {
-
-	/**
-	 * Which run is it?
-	 */
-	private int counter;
-
-	/**
-	 * The {@link FuzzyDataProvider}, which "contains" the data for the test.
-	 */
-	private FuzzyDataProvider<?> dataProvider;
-
-	/**
-	 * The {@link FrameworkField} of the {@link TestClass} where to put in the data.
-	 */
-	private FrameworkField dataField;
-
-	/**
-	 * The {@link FrameworkField} for the {@link Util}.
-	 */
-	private FrameworkField utilField;
-
-	private Util util;
-
-	private FrameworkField optionsField;
-
-	/**
-	 * Constructor.
-	 * 
-	 * @param type The testclass
-	 * @param dataProvider The {@link FuzzyDataProvider} providing the data to put into the dataField
-	 * @param dataField The datafield in the testclass
-	 * @param utilField the utilfield in the testclass
-	 * @param optionsField the options field in the testclass
-	 * @param util The {@link Util} class
-	 * @param counter The counter of the run
-	 * @throws InitializationError If there was a problem during the initialization of the test
-	 */
-	FuzzyTestClassRunner(Class<?> type, FuzzyDataProvider<?> dataProvider, FrameworkField dataField,
-		FrameworkField utilField, FrameworkField optionsField, Util util, int counter) throws InitializationError {
-		super(type);
-		this.counter = counter;
-		this.dataField = dataField;
-		this.utilField = utilField;
-		this.optionsField = optionsField;
-		this.util = util;
-		this.dataProvider = dataProvider;
-	}
-
-	@SuppressWarnings("unchecked")
-	@Override
-	public Object createTest() {
-		try {
-			// create a new instance of the testclass
-			Object testInstance = getTestClass().getOnlyConstructor().newInstance();
-
-			// set the options to dataprovider
-			if (optionsField != null) {
-				Object options = getValueFromField(optionsField.getField(), testInstance);
-				if (options == null) {
-					throw new IllegalStateException(
-						"The options field has to be not null! Fill it or remove annotation.");
-				}
-				try {
-					dataProvider.setOptions((Map<String, Object>) options);
-				} catch (ClassCastException e) {
-					throw new ClassCastException("The options field is not of type: Map<String, Object>!");
-				}
-			}
-
-			// get the new data from dataprovider
-			Object data = dataProvider.get(counter);
-
-			// set the data to the datafield
-			setValueToField(dataField.getField(), testInstance, data,
-				"The field annotated with " + Data.class.getSimpleName()
-					+ " does not fit to the type of the dataprovider (" + dataProvider.getClass() + ").");
-
-			// set the util to the util field
-			if (util != null && utilField != null) {
-				setValueToField(utilField.getField(), testInstance, util,
-					"The field annotated " + Util.class.getSimpleName() + " does not fit to the Util type!");
-			}
-
-			return testInstance;		
-		} catch (InstantiationException e) {
-			throw new RuntimeException(e);
-		} catch (IllegalAccessException e) {
-			throw new RuntimeException(e);
-		} catch (InvocationTargetException e) {
-			throw new RuntimeException(e);
-		}
-	}
-
-	private Object getValueFromField(Field field, Object instance) throws IllegalAccessException {
-		try{
-			field.setAccessible(true);
-			Object o = field.get(instance);
-			return o;
-		} finally {
-			field.setAccessible(false);
-		}
-	}
-
-	private void setValueToField(Field field, Object instance, Object value, String errorMsg) throws IllegalAccessException
-		 {
-		try {
-			field.setAccessible(true);
-			field.set(instance, value);
-		} finally {
-			field.setAccessible(false);
-		}
-	}
-
-	@Override
-	protected List<FrameworkMethod> getChildren() {
-		List<Test> testsToRun = dataProvider.getTestsToRun();
-		List<FrameworkMethod> allChildren = super.getChildren();
-
-		// check if it should filter tests
-		if (testsToRun != null) {
-			List<FrameworkMethod> filteredChildren = new ArrayList<FrameworkMethod>();
-			for (Test test : testsToRun) {
-				String name = test.getName();
-				int seedCount = test.getSeedCount();
-				for (FrameworkMethod child : allChildren) {
-					if (seedCount == counter && name.equals(child.getName())) {
-						filteredChildren.add(child);
-					}
-				}
-			}
-			return filteredChildren;
-		}
-
-		// if not return all children
-		return allChildren;
-	}
-
-	private String testName(String name) {
-		return String.format("%s%s[%s]", name, FuzzyRunner.NAME_SEPARATOR, counter);
-	}
-
-	@Override
-	protected String testName(final FrameworkMethod method) {
-		return testName(method.getName());
-	}
-
-	@Override
-	protected String getName() {
-		return String.format("%s%s[%s]", getTestClass().getName(), FuzzyRunner.NAME_SEPARATOR, counter);
-	}
-
-	@Override
-	protected Statement classBlock(RunNotifier notifier) {
-		return childrenInvoker(notifier);
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Test.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Test.java
deleted file mode 100644
index 2b0a0a3..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Test.java
+++ /dev/null
@@ -1,48 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-/**
- * 
- * Class to get a connection between a test and a specific run of it.
- * 
- * @author Julian Sommerfeldt
- * 
- */
-public class Test {
-
-	private String name;
-
-	private int seedCount;
-
-	/**
-	 * @param name The name of the test.
-	 * @param seedCount The count (run) of the test.
-	 */
-	public Test(String name, int seedCount) {
-		this.name = name;
-		this.seedCount = seedCount;
-	}
-
-	/**
-	 * @return The name of the test.
-	 */
-	public String getName() {
-		return name;
-	}
-
-	/**
-	 * @return The run of this test.
-	 */
-	public int getSeedCount() {
-		return seedCount;
-	}
-}
\ No newline at end of file
diff --git a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Util.java b/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Util.java
deleted file mode 100644
index c474549..0000000
--- a/Fuzzy/org.eclipse.emf.emfstore.fuzzy/src/org/eclipse/emf/emfstore/fuzzy/Util.java
+++ /dev/null
@@ -1,20 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012 EclipseSource Muenchen GmbH.
- * 
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- * 
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.fuzzy;
-
-/**
- * Marker Interface for utility classes in test classes using the {@link FuzzyRunner}.
- * 
- * @author Julian Sommerfeldt
- */
-public interface Util {
-
-}
\ No newline at end of file
