diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.checkstyle b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.checkstyle
new file mode 100644
index 0000000..2f2667a
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.checkstyle
@@ -0,0 +1,7 @@
+<?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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.classpath b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.classpath
new file mode 100644
index 0000000..2d1a430
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.project b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.project
new file mode 100644
index 0000000..38446ab
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.emfstore.standalone.core</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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.settings/org.eclipse.jdt.core.prefs b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..98f7d89
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Wed Jun 29 17:41:52 CEST 2011
+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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/META-INF/MANIFEST.MF b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..f173ab0
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/META-INF/MANIFEST.MF
@@ -0,0 +1,29 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: EMFStore Standalone
+Bundle-SymbolicName: org.eclipse.emf.emfstore.standalone.core;singleton:=true
+Bundle-Version: 0.9.3.M930
+Bundle-Activator: org.eclipse.emf.emfstore.standalone.core.Activator
+Require-Bundle: org.eclipse.core.runtime,
+ org.eclipse.emf.edit;bundle-version="2.6.0",
+ org.eclipse.egit.core;bundle-version="1.0.0",
+ org.eclipse.compare;bundle-version="3.5.101",
+ org.eclipse.team.core;bundle-version="3.5.101";visibility:=reexport,
+ org.eclipse.emf.emfstore.client;bundle-version="0.9.3";visibility:=reexport
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: J2SE-1.5
+Export-Package: org.eclipse.emf.emfstore.standalone.core;uses:="org.eclipse.ui,org.eclipse.ui.plugin,org.osgi.framework",
+ org.eclipse.emf.emfstore.standalone.core.artifacts;
+  uses:="org.eclipse.emf.emfstore.client.model.impl,
+   org.eclipse.emf.ecore.resource,
+   org.eclipse.emf.ecore.xmi,
+   org.eclipse.emf.common.notify.impl,
+   org.eclipse.emf.common.util,
+   org.eclipse.core.resources,
+   org.eclipse.emf.emfstore.common.model,
+   org.eclipse.emf.emfstore.server.model.versioning.operations,
+   org.eclipse.emf.common.notify",
+ org.eclipse.emf.emfstore.standalone.core.exceptions,
+ org.eclipse.emf.emfstore.standalone.core.util,
+ org.eclipse.emf.emfstore.standalone.core.vcs,
+ org.eclipse.emf.emfstore.standalone.core.workspace
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/build.properties b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/build.properties
new file mode 100644
index 0000000..6f20375
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/plugin.xml b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/plugin.xml
new file mode 100644
index 0000000..5d08786
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/plugin.xml
@@ -0,0 +1,8 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension-point id="org.eclipse.emf.emfstore.standalone.core.vcs.provider" name="Model Merge VCS Provider" schema="schema/org.eclipse.emf.emfstore.standalone.core.vcs.provider.exsd"/>
+   <extension-point id="org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened" name="Resource Opened Observer" schema="schema/org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened.exsd"/>
+
+   
+</plugin>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.vcs.provider.exsd b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.vcs.provider.exsd
new file mode 100644
index 0000000..14b1f57
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.vcs.provider.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.emf.emfstore.standalone.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.emf.emfstore.standalone.core" id="org.eclipse.emf.emfstore.standalone.core.vcs.provider" name="Model Merge VCS Provider"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="provider"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="provider">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.emf.emfstore.teamprovider.recording.IVCSProvider"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened.exsd b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened.exsd
new file mode 100644
index 0000000..55884a1
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/schema/org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened.exsd
@@ -0,0 +1,109 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<!-- Schema file written by PDE -->
+<schema targetNamespace="org.eclipse.emf.emfstore.standalone.core" xmlns="http://www.w3.org/2001/XMLSchema">
+<annotation>
+      <appinfo>
+         <meta.schema plugin="org.eclipse.emf.emfstore.standalone.core" id="org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened" name="Resource Opened Observer"/>
+      </appinfo>
+      <documentation>
+         [Enter description of this extension point.]
+      </documentation>
+   </annotation>
+
+   <element name="extension">
+      <annotation>
+         <appinfo>
+            <meta.element />
+         </appinfo>
+      </annotation>
+      <complexType>
+         <sequence>
+            <element ref="observer"/>
+         </sequence>
+         <attribute name="point" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+         <attribute name="name" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute translatable="true"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <element name="observer">
+      <complexType>
+         <attribute name="class" type="string" use="required">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+               <appinfo>
+                  <meta.attribute kind="java" basedOn=":org.eclipse.emf.emfstore.standalone.core.workspace.IResourceOpenedObserver"/>
+               </appinfo>
+            </annotation>
+         </attribute>
+         <attribute name="id" type="string">
+            <annotation>
+               <documentation>
+                  
+               </documentation>
+            </annotation>
+         </attribute>
+      </complexType>
+   </element>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="since"/>
+      </appinfo>
+      <documentation>
+         [Enter the first release in which this extension point appears.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="examples"/>
+      </appinfo>
+      <documentation>
+         [Enter extension point usage example here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="apiinfo"/>
+      </appinfo>
+      <documentation>
+         [Enter API information here.]
+      </documentation>
+   </annotation>
+
+   <annotation>
+      <appinfo>
+         <meta.section type="implementation"/>
+      </appinfo>
+      <documentation>
+         [Enter information about supplied implementation of this extension point.]
+      </documentation>
+   </annotation>
+
+
+</schema>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/Activator.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/Activator.java
new file mode 100644
index 0000000..9460eac
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/Activator.java
@@ -0,0 +1,72 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering, Technische Universitaet Muenchen. 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.standalone.core;
+
+import org.eclipse.core.runtime.Plugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle.
+ * 
+ * @author emueller
+ */
+public class Activator extends Plugin {
+
+	/**
+	 * The plug-in ID.
+	 */
+	public static final String PLUGIN_ID = "org.eclipse.emf.emfstore.teamprovider.recording";
+
+	/**
+	 * The shared instance.
+	 */
+	private static Activator plugin;
+
+	// TODO: enable multiple providesr
+//	public static Map<String ,IVCSProvider> vcsProviders;
+
+	/**
+	 * The constructor.
+	 */
+	public Activator() {
+		
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	// BEGIN SUPRESS CATCH EXCEPTION
+	@Override
+	public void start(BundleContext context) throws Exception {
+		// END SUPRESS CATCH EXCEPTION
+		super.start(context);
+		plugin = this;
+
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	// BEGIN SUPRESS CATCH EXCEPTION
+	@Override
+	public void stop(BundleContext context) throws Exception {
+		// END SUPRESS CATCH EXCEPTION
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance.
+	 * 
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/Artifact.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/Artifact.java
new file mode 100644
index 0000000..70f4e61
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/Artifact.java
@@ -0,0 +1,128 @@
+package org.eclipse.emf.emfstore.standalone.core.artifacts;
+
+import java.io.IOException;
+
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.ResourceSet;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.client.model.impl.OperationRecorder;
+import org.eclipse.emf.emfstore.common.model.Project;
+import org.eclipse.emf.emfstore.common.model.impl.ProjectImpl;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.NoActiveVCSProviderException;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+
+public class Artifact {
+
+	private XMIResource xmiResource;
+	private XMIResource historyResource;
+	private OperationRecorder operationRecorder;
+	private OperationPersister operationPersister;
+	private boolean isInitialized;
+	private Project project;
+	private URI historyURI;
+
+	/**
+	 * Constructor.
+	 * @param modelResource the model resource
+	 */
+	public Artifact(XMIResource modelResource, URI historyURI) {
+		this.xmiResource = modelResource;
+		this.historyURI = historyURI;
+	}
+	
+	public void initialize() throws NoActiveVCSProviderException {
+		if (getModelResource() != null) {
+			initialize(getModelResource());
+		}
+	}
+	
+	public void initialize(XMIResource xmiResource) throws NoActiveVCSProviderException {
+		this.xmiResource = xmiResource;
+		boolean shouldClearHistoryResource = false;
+		
+		IVCSProvider activeProvider = VCSProviderRegistry.getInstance().getActiveProvider();
+		if (activeProvider == IVCSProvider.NONE) {
+			throw new NoActiveVCSProviderException();
+		}
+		
+		try {
+			project = new ProjectImpl(getModelResource());
+			operationRecorder = new OperationRecorder(getProject(), getProject().getChangeNotifier());
+			
+			if (activeProvider.isModified(FileUtil.getFile(historyURI))) {
+				shouldClearHistoryResource   = true;
+			}
+			
+			ResourceSet resourceSet = getModelResource().getResourceSet() == null ? new ResourceSetImpl() : getModelResource().getResourceSet();
+			this.historyResource = ((XMIResource) resourceSet.createResource(historyURI));
+			
+			if (shouldClearHistoryResource) {
+				historyResource.getContents().clear();
+			}
+			
+			historyResource.save(null);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+			return;
+		}
+		
+		operationPersister = new OperationPersister(getModelResource(), getHistoryResource());
+		operationRecorder.addOperationRecorderListener(operationPersister);		
+		operationRecorder.startChangeRecording();
+		isInitialized = true;
+	}
+	
+	public void dispose() {
+		// TODO: in which cases are the recorder and the persister null?
+		if (operationRecorder != null){
+			operationRecorder.stopChangeRecording();
+			operationRecorder.removeOperationRecorderListener(operationPersister);
+		}
+
+		if (operationPersister != null){
+			operationPersister.dispose();
+		}
+		
+		this.project = null;
+		operationRecorder = null;
+		operationPersister = null;		
+		isInitialized = false;
+	}
+
+	public boolean isInitialized() {
+		return isInitialized;
+	}
+	
+	public URI getURI() {
+		return getModelResource().getURI();
+	}
+
+	// TODO: hide
+	public Project getProject() {
+		return project;
+	}
+
+	/**
+	 * Returns the history resource of this artifact.
+	 * @return the history resource
+	 */
+	public XMIResource getHistoryResource() {
+		return historyResource;
+	}
+	
+	/**
+	 * Returns the model resource of this artifact.
+	 * @return the model resource
+	 */
+	public XMIResource getModelResource() {
+		return xmiResource;
+	}
+
+	public void setProject(Project project) {
+		this.project = project;
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/ArtifactRegistry.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/ArtifactRegistry.java
new file mode 100644
index 0000000..ce78a90
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/ArtifactRegistry.java
@@ -0,0 +1,109 @@
+package org.eclipse.emf.emfstore.standalone.core.artifacts;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+
+/**
+ * Keeps track of which artifacts are considered to be under recorder control.
+ * @author emueller
+ *
+ */
+public class ArtifactRegistry {
+	
+	private Map<URI, Artifact> recordedArtifacts;
+	private Set<URI> flags;
+	
+	private static ArtifactRegistry registry;
+	
+	public static ArtifactRegistry getInstance() {
+		if (registry == null) {
+			registry = new ArtifactRegistry();
+		}
+		return registry;
+	}
+
+	private ArtifactRegistry() {
+		recordedArtifacts = new HashMap<URI, Artifact>();
+		flags = new HashSet<URI>();
+	}
+
+	/**
+	 * Adds a {@link Artifact} to the registry.
+	 * @param artifact the artifact to be added 
+	 * @param isLoading whether the artifact is loading or whether it is 
+	 * 		considered to be a new one not yet put under recorder control
+	 */
+	public void register(Artifact artifact) {
+		recordedArtifacts.put(artifact.getURI(), artifact);
+//		artifact.initialize();
+		// TODO: write versioned artifact to preference store
+		//		 e.g. by means of using the filename/URI
+	}
+	
+	public Artifact getArtifact(URI uri) {
+		return recordedArtifacts.get(uri);
+	}
+	
+	
+	/**
+	 * Removes the artifact 
+	 * @param uri 
+	 * @throws CoreException if the history file can not be deleted
+	 */
+	public void unregister(URI uri) throws CoreException {
+		Artifact versionedArtifact = recordedArtifacts.get(uri);
+		versionedArtifact.dispose();
+		recordedArtifacts.remove(uri);
+		IFile historyFile = FileUtil.getHistoryFile(FileUtil.getFile(uri));
+		historyFile.delete(true, new NullProgressMonitor());
+	}
+	
+	// TODO: remove?
+	public boolean isRegistered(URI uri) {
+		return recordedArtifacts.containsKey(uri);
+	}
+	
+	public boolean isRegistered(IFile artifactFile) {
+		return recordedArtifacts.containsKey(FileUtil.getUri(artifactFile));
+	}
+	
+	public void flag(URI uri) {
+		flags.add(uri);
+	}
+	
+	public void flag(IFile artifactFile) {
+		flags.add(FileUtil.getUri(artifactFile));
+	}
+	
+//	public void markClearHistory(URI uri) {
+//		clearHistoryFiles.put(uri, true);
+//	}
+//	
+//	public void removeClearHistory(URI uri) {
+//		clearHistoryFiles.remove(uri);
+//	}
+//	
+//	public boolean isMarkedForClearHistory(URI uri) {
+//		return clearHistoryFiles.containsKey(uri);
+//	}
+	
+	public boolean isFlagged(URI uri) {
+		return flags.contains(uri);
+	}
+	
+	public boolean isFlagged(IFile artifactFile) {
+		return flags.contains(FileUtil.getUri(artifactFile));
+	}
+	
+	public void unflag(URI uri) {
+		flags.remove(uri);
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/OperationPersister.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/OperationPersister.java
new file mode 100644
index 0000000..4c61889
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/artifacts/OperationPersister.java
@@ -0,0 +1,86 @@
+package org.eclipse.emf.emfstore.standalone.core.artifacts;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.emf.common.notify.Notification;
+import org.eclipse.emf.common.notify.impl.AdapterImpl;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.client.model.impl.OperationRecorderListener;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
+
+/**
+ * Persists operations into a history file.
+ * 
+ * @author emueller
+ *
+ */
+public class OperationPersister extends AdapterImpl implements OperationRecorderListener {
+
+	private Resource historyResource;
+	private boolean isResourceModified;
+	private URI historyUri;
+	private Resource resource;
+
+	/**
+	 * Constructor.
+	 * 
+	 * @param resource the resource, whose location will be used to create the history file.
+	 * @param historyFilePath the path at which the history file will be written
+	 */
+	public OperationPersister(Resource resource, XMIResource historyResource) {
+		init(resource, historyResource);
+	}
+	
+	private void init(Resource resource, XMIResource historyResource) {
+		this.resource = resource;
+		this.historyResource = historyResource;
+//		ResourceSet resourceSet = resource.getResourceSet() == null ? new ResourceSetImpl() : resource.getResourceSet();
+//		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot
+		resource.setTrackingModification(true);
+		resource.eAdapters().add(this);
+	}
+	
+	public void dispose() {
+		resource.setTrackingModification(false);
+		resource.eAdapters().remove(this);
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	public void operationsRecorded(List<? extends AbstractOperation> operations) {
+		for (AbstractOperation op : operations) {
+			historyResource.getContents().add(op);
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void notifyChanged(Notification msg) {
+		if (msg.getFeatureID(Resource.class) == Resource.RESOURCE__IS_MODIFIED) {
+			isResourceModified = !isResourceModified;
+		}
+		
+		if (!isResourceModified) {
+			saveResource();
+		}
+	}
+	
+	/**
+	 * Saves the history file.
+	 */
+	private void saveResource() {
+		try {
+			historyResource.save(null);
+		} catch (IOException e) {
+			 ModelUtil.logException(String.format("Could not write operations file %s.",
+					 historyUri), e);
+		}
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/NoActiveVCSProviderException.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/NoActiveVCSProviderException.java
new file mode 100644
index 0000000..3eae8e1
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/NoActiveVCSProviderException.java
@@ -0,0 +1,7 @@
+package org.eclipse.emf.emfstore.standalone.core.exceptions;
+
+public class NoActiveVCSProviderException extends Exception {
+
+	private static final long serialVersionUID = 6551086981520016383L;
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/RepositoryNotFoundException.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/RepositoryNotFoundException.java
new file mode 100644
index 0000000..ae2dfbd
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/RepositoryNotFoundException.java
@@ -0,0 +1,10 @@
+package org.eclipse.emf.emfstore.standalone.core.exceptions;
+
+public class RepositoryNotFoundException extends Exception {
+
+	private static final long serialVersionUID = 1485604779291238587L;
+
+	public RepositoryNotFoundException(Throwable cause) {
+		super(cause);
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/VCSProviderNotFoundException.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/VCSProviderNotFoundException.java
new file mode 100644
index 0000000..237f1ef
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/exceptions/VCSProviderNotFoundException.java
@@ -0,0 +1,7 @@
+package org.eclipse.emf.emfstore.standalone.core.exceptions;
+
+public class VCSProviderNotFoundException extends Exception {
+
+	private static final long serialVersionUID = 4259651016043456563L;
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/util/FileUtil.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/util/FileUtil.java
new file mode 100644
index 0000000..4c24030
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/util/FileUtil.java
@@ -0,0 +1,149 @@
+package org.eclipse.emf.emfstore.standalone.core.util;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
+
+public class FileUtil {
+	
+	private static final String HISTORY_EXTENSION = "hist";
+	private static Set<String> managedFileExtensions;
+
+	private static void addFileExtensions() {
+		managedFileExtensions.add("ecore");
+		managedFileExtensions.add("umldi-history");
+		managedFileExtensions.add("umldi");
+		managedFileExtensions.add("uml");
+		// TODO: provide extensions points to read them here
+	}
+
+	/**
+	 * Determines whether a {@link IFile} has an extension that may be versioned.
+	 * @param file a {@link IFile}
+	 * @return true, if the file may by the {@link RecorderHeap}, false otherwise
+	 */
+	public static boolean hasManagedFileExtension(IFile file) {
+		initFileExtensionsStore();
+		String fileExtension = file.getFileExtension();
+		return managedFileExtensions.contains(fileExtension);
+	}
+
+	private static void initFileExtensionsStore() {
+		if (managedFileExtensions == null) {
+			managedFileExtensions = new HashSet<String>();
+			addFileExtensions();
+		}
+	}
+	
+	/**
+	 * Returns a set of extensions that are currently managed.
+	 * @return a list containing all file extensions that may be versioned
+	 */
+	public static Set<String> getManagedFileExtensions() {
+		initFileExtensionsStore();
+		return managedFileExtensions;
+	}
+
+	/**
+	 * Convert a given {@link IFile} to its {@link URI} representation
+	 * @param file a file
+	 * @return the {@link URI} representation of the file
+	 */
+	public static URI getUri(IFile file) {
+		return URI.createPlatformResourceURI(file.getFullPath().toString(), true);
+	}
+	
+	/**
+	 * Convert a {@link URI} to its {@link IFile} representation
+	 * @param uri a {@link URI}
+	 * @return the {@link URI} representation of the file
+	 */
+	public static IFile getFile(URI uri) {
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		return root.getFile(new Path(uri.toPlatformString(true)));
+	}
+	
+	public static URI getHistoryURI(URI artifactURI) {
+		return artifactURI.appendFileExtension(HISTORY_EXTENSION);
+	}
+		
+	public static IFile getHistoryFile(IFile artifactFile) {
+		String artifactFileName = artifactFile.getName() + "." +  HISTORY_EXTENSION;
+		IResource resource = artifactFile.getProject().findMember(artifactFileName);
+		
+		if (!(resource instanceof IFile) || !resource.exists()) {
+			throw new IllegalStateException("Artifact file either does not exist or is not a file");
+		}
+		
+		return (IFile) resource;
+	}
+	
+	/**
+	 * Returns the artifact based on the history file. 
+	 * 
+	 * @param file the history file
+	 * @return the artifact file
+	 * @throws IllegalStateException if the given history file exists, but the artifact file does not
+	 * 		or if the artifact file is not an instance of {@link IFile}
+	 */
+	public static IFile getArtifactFile(IFile historyFile) {
+		String artifactFileName = historyFile.getName().replace("." + HISTORY_EXTENSION, "");
+		IResource resource = historyFile.getProject().findMember(artifactFileName);
+		return (IFile) resource;
+	}
+	
+	// TODO: copied method
+	public static String slurpAndClose(InputStream inputStream) throws IOException {
+		StringBuilder stringBuilder = new StringBuilder();
+		try {
+			int ch;
+			while ((ch = inputStream.read()) != -1) {
+				stringBuilder.append((char) ch);
+			}
+		} finally {
+			inputStream.close();
+		}
+		return stringBuilder.toString();
+	}
+	
+	// TODO: copied method
+	public static List<AbstractOperation> slurpAndCloseHistoryResource(XMIResource xmiResource) throws IOException {
+		xmiResource.load(null);
+		List<AbstractOperation> result = new ArrayList<AbstractOperation>();
+		EList<EObject> contents = xmiResource.getContents();
+		for (EObject obj : contents) {
+			result.add((AbstractOperation) obj);
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * Checks whether a given file is a history file.
+	 * 
+	 * @param file
+	 * @throws IllegalArgumentException if the given file is null
+	 */
+	public static boolean isHistoryFile(IFile file) {
+		
+		if (file == null) {
+			throw new IllegalArgumentException("file must not be null.");
+		}
+		
+		return file.getFileExtension().equals(HISTORY_EXTENSION);
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/AbstractVCSProvider.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/AbstractVCSProvider.java
new file mode 100644
index 0000000..a579430
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/AbstractVCSProvider.java
@@ -0,0 +1,124 @@
+package org.eclipse.emf.emfstore.standalone.core.vcs;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.List;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.common.model.util.SerializationException;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
+import org.xml.sax.InputSource;
+
+public abstract class AbstractVCSProvider implements IVCSProvider {
+
+	/**
+	 * URI used to serialize EObject with the model util.
+	 */
+	public static final URI VIRTUAL_URI = URI.createURI("virtualUri");
+	
+	public List<AbstractOperation> getTheirOperations(IResource resource, IProgressMonitor monitor) {
+		try {
+			String theirRevision = getTheirRevision(resource, monitor);
+			List<AbstractOperation> theirOperations = getOperations(theirRevision);
+			return theirOperations;
+		} catch (IOException moe) {
+			// TODO Auto-generated moe catch block
+			moe.printStackTrace();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		return null;
+	}
+	
+	public List<AbstractOperation> getMyOperations(IResource resource, IProgressMonitor monitor) {
+		try {
+			String myRevision = getMyRevision(resource, monitor);
+			List<AbstractOperation> myOperations = getOperations(myRevision);
+			return myOperations;
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	
+		return null;
+	}
+	
+	private List<AbstractOperation> getOperations(String s) {
+		// TODO Auto-generated method stub
+		EList<EObject> ops1 = null;
+		try {
+			ops1 = stringToEObject(s);
+		} catch (SerializationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		List<AbstractOperation> result = new ArrayList<AbstractOperation>();
+		for (EObject obj : ops1) {
+			if (obj instanceof AbstractOperation) {
+				AbstractOperation op = (AbstractOperation) obj;
+				result.add(op);
+			}
+		}
+		
+		return result;
+	}
+	
+	/**
+	 * Converts a {@link String} to an {@link EObject}. <b>Note</b>:
+	 * {@link String} must be the result of
+	 * {@link ModelUtil#eObjectToString(EObject)}
+	 * 
+	 * @param object
+	 *            the {@link String} representation of the {@link EObject}
+	 * @return the deserialized {@link EObject}
+	 * @throws SerializationException
+	 *             if deserialization fails
+	 */
+	private EList<EObject> stringToEObject(String object)
+			throws SerializationException {
+		if (object == null) {
+			return null;
+		}
+
+		XMIResource res = (XMIResource) (new ResourceSetImpl())
+				.createResource(VIRTUAL_URI);
+
+		try {
+			res.load(new InputSource(new StringReader(object)),
+					null);
+		} catch (UnsupportedEncodingException e) {
+			// TODO;
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} 
+
+		EList<EObject> result = res.getContents();
+		
+
+		// TODO: added to resolve model element map in a CreateDeleteOp
+		// check whether we can generalize this
+		for (EObject o : result) {
+			EcoreUtil.resolveAll(o);
+		}
+
+		res.getContents().remove(result);
+		return result;
+	}
+}
\ No newline at end of file
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/IVCSProvider.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/IVCSProvider.java
new file mode 100644
index 0000000..57a0d0c
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/IVCSProvider.java
@@ -0,0 +1,137 @@
+package org.eclipse.emf.emfstore.standalone.core.vcs;
+
+import java.io.IOException;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
+
+/**
+ * Common interface for VCS connector implementations.
+ * @author emueller 
+ *
+ */
+public interface IVCSProvider {
+
+	IVCSProvider NONE = null;
+
+	/**
+	 * Adds an {@link IFile} to be versioned by the VCS.
+	 * @param file the file to be added to the VCS
+	 */
+	void addToVCS(IFile file);
+	
+	/**
+	 * Determines whether a file has been modified since the last base revision
+	 * @param file the file that needs to be checked
+	 * @return true, if the history file has been modified, false otherwise
+	 * @throws IOException if it could not be determined whether the history file 
+	 * 		has been modified
+	 */
+	boolean isModified(IFile file) throws IOException;
+	
+	/**
+	 * Returns the local version of the model resource file.
+	 * @param resource the model resource
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the content of the model resource file
+	 * @throws IOException in case the model resource file can not be read
+	 * @throws InterruptedException if the {@link IProgressMonitor} has been canceled
+	 * @throws RepositoryNotFoundException if the repository the given resource is 
+	 * 		considered to be in, can not be found
+	 */
+//	String getMyModelResourceFile(IResource resource, IProgressMonitor monitor) 
+//	throws IOException, InterruptedException, RepositoryNotFoundException;
+	
+	/**
+	 * Resolves a conflict state on the given file.
+	 * @param file the file being in a conflict state
+	 */
+	void resolveConflict(IFile file);
+	
+	/**
+	 * Returns the {@link IRepository} the given resource is managed with.
+	 * @param resource the resource, whose repository should be determined
+	 * @return the repository the given resource is in
+	 * @throws RepositoryNotFoundException if the repository can not be 
+	 * 	determined
+	 */
+//	IRepository<R> getRepository(IResource resource)
+//	throws RepositoryNotFoundException;
+
+	/**
+	 * Returns the local {@link IRevision} of the given resource.
+	 * @param resource the resource 
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the content of the given resource as it is locally available  
+	 * @throws IOException if the revision can not be determined
+	 * @throws InterruptedException if the {@link IProgressMonitor} has been canceled
+	 */
+	String getMyRevision(IResource resource, IProgressMonitor monitor)
+	throws IOException, InterruptedException;
+	
+	/**
+	 * Returns the head {@link IRevision} of the given resource.
+	 * @param resource the resource 
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the content of the given resource as it is locally available  
+	 * @throws IOException if the revision can not be determined
+	 * @throws InterruptedException if the {@link IProgressMonitor} has been canceled
+	 */
+	String getTheirRevision(IResource resource, IProgressMonitor monitor)
+	throws IOException, InterruptedException;
+	
+	/**
+	 * Returns the ancestor {@link IRevision} of the given resource.
+	 * @param myRevision the local revision
+	 * @param theirRevision the incoming revision
+	 * @param the local repository 
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the ancestor revision of <code>myRevision</code> and <code>theirRevision</code> 
+	 * @throws IOException if the revision can not be determined
+	 * @throws InterruptedException if the {@link IProgressMonitor} has been canceled
+	 */
+//	IRevision<T> getAncestorRevision(IRevision<T> myRevision, IRevision<T> theirRevision,
+//			IRepository<R> repository, IProgressMonitor monitor) 
+//	throws IOException, InterruptedException;
+
+	/**
+	 * Returns the ancestor {@link IRevision} of the given resource.
+	 * @param myRevision the local revision
+	 * @param theirRevision the incoming revision
+	 * @param the local repository 
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the ancestor revision of <code>myRevision</code> and <code>theirRevision</code> 
+	 * @throws IOException if the revision can not be determined
+	 * @throws InterruptedException if the {@link IProgressMonitor} has been canceled
+	 */
+//	IFileRevision getFileRevision(IRepository<R> repository,
+//			IRevision<T> revision, String objectId);
+	
+	/**
+	 * Returns the incoming operations.
+	 * @param resource the resource, which contains the operations
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the incoming operations
+	 */
+	List<AbstractOperation> getTheirOperations(IResource resource, IProgressMonitor monitor);
+	
+	/**
+	 * Returns the local operations.
+	 * @param resource the resource, which contains the operations
+	 * @param monitor a {@link IProgressMonitor} instance
+	 * @return the local operations
+	 */
+	List<AbstractOperation> getMyOperations(IResource resource, IProgressMonitor monitor);
+	
+	/**
+	 * Returns the content of given {@link IResource} as it has been in the given {@link IRevision}.
+	 * @param resource a resource
+	 * @param revision a revision
+	 * @param monitor an {@link IProgressMonitor} instance
+	 * @return the content of the given resource
+	 */
+//	String getFileContent(IResource resource, IRevision<T> revision, IProgressMonitor monitor);
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/VCSProviderRegistry.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/VCSProviderRegistry.java
new file mode 100644
index 0000000..86ed694
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/vcs/VCSProviderRegistry.java
@@ -0,0 +1,138 @@
+package org.eclipse.emf.emfstore.standalone.core.vcs;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+
+import org.eclipse.core.resources.IContainer;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IWorkspaceRoot;
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.VCSProviderNotFoundException;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+
+
+public class VCSProviderRegistry {
+	
+	private static VCSProviderRegistry instance;
+	private static Map<String, IVCSProvider> providers;
+	// TODO: currentProvider nach ArtifactMerger umziehen oder entsprechendes Attribute anlegen
+	private IVCSProvider currentProvider;
+	
+	private VCSProviderRegistry() {
+		providers = new HashMap<String, IVCSProvider>();
+	}
+	
+	public static VCSProviderRegistry getInstance() {
+		if (instance == null) {
+			instance = new VCSProviderRegistry();
+		}
+		
+		return instance;
+	}
+	
+	public IVCSProvider getActiveProvider() {
+		return currentProvider;
+	}
+	
+	public void setActiveProvider(IVCSProvider provider) {
+		currentProvider = provider;
+	}
+
+	public void initArtifacts() throws CoreException, InvocationTargetException, IOException {
+		
+		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
+		
+		for (IProject project : root.getProjects()) {
+			for (IFile file: fetchAllFiles(project, new HashSet<IFile>())) {
+				
+				if (!FileUtil.isHistoryFile(file)) {
+					continue;
+				}
+
+				// we know that file now needs to be the history file 
+				IFile artifactFile = FileUtil.getArtifactFile(file);
+				
+				if (!ArtifactRegistry.getInstance().isRegistered(artifactFile) 
+						|| !ArtifactRegistry.getInstance().isFlagged(artifactFile)) {
+					ArtifactRegistry.getInstance().flag(artifactFile);
+//					VCS_PROVIDER.clearHistoryFile(FileUtil.getHistoryFile(artifactFile));
+				}
+			}
+		}
+	}
+	
+	/**
+	 * Fetches all instances of {@link IFile} contained in a {@link IContainer}.
+	 * 
+	 * @param container the container to fetch the files from
+	 * @param files a collection that will hold all instances of files, may be empty, but not null
+	 * @return the given <code>files</code> collection with all files contained within the given container
+	 * @throws CoreException if the given container either does not exist or is not accessible
+	 * @throws IllegalArgumentException if <code>files</code> is null
+	 */
+	private Collection<IFile> fetchAllFiles(IContainer container, Collection<IFile> files) 
+		throws CoreException, IllegalArgumentException {
+		
+		if (files == null) {
+			throw new IllegalArgumentException("files must not be null");
+		}
+		
+		for (IResource resource : container.members()) {
+			if (resource instanceof IContainer) {
+				IContainer c = (IContainer) resource;
+				files.addAll(fetchAllFiles(c, files));
+			} else if (resource instanceof IFile){
+				files.add((IFile) resource);
+			}
+		}
+		return files; 
+	}
+	
+	public void initVCSProviders() {
+//		if (vcsProviders == null) {
+			// collect singleton ID resolvers
+//			vcsProviders = new HashMap<String, IVCSProvider>();
+			IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(
+					"org.eclipse.emf.emfstore.standalone.core.vcs.provider");
+
+			for (IConfigurationElement extension : config) {
+				try {
+					IVCSProvider provider = (IVCSProvider) extension.createExecutableExtension("class");
+					String providerId =  extension.getAttribute("id");
+					providers.put(providerId, provider);					
+				} catch (CoreException e) {
+					ModelUtil.logWarning("Could not instantiate EMFStore Standalone VCS connector:"
+							+ e.getMessage());
+				}
+			}
+//		}
+	}
+
+	/**
+	 * Returns the team provider with the given ID.
+	 * @param teamProviderID the ID of a team provider, e.g. <code></code>
+	 * @return the team provider
+	 * @throws VCSProviderNotFoundException if the desired team provider is not registered
+	 */
+	public IVCSProvider getVCSProvider(String teamProviderID) throws VCSProviderNotFoundException {
+		IVCSProvider provider = providers.get(teamProviderID);
+		
+		if (provider == null) {
+			throw new VCSProviderNotFoundException();
+		}
+		
+		return provider;
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/IResourceOpenedObserver.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/IResourceOpenedObserver.java
new file mode 100644
index 0000000..153e957
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/IResourceOpenedObserver.java
@@ -0,0 +1,8 @@
+package org.eclipse.emf.emfstore.standalone.core.workspace;
+
+import org.eclipse.core.resources.IResource;
+
+public interface IResourceOpenedObserver {
+
+	void resourceOpened(IResource resource);
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceDeltaVisitor.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceDeltaVisitor.java
new file mode 100644
index 0000000..ac8c6fc
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceDeltaVisitor.java
@@ -0,0 +1,39 @@
+package org.eclipse.emf.emfstore.standalone.core.workspace;
+
+import java.util.HashSet;
+import java.util.Set;
+
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IResourceDelta;
+import org.eclipse.core.resources.IResourceDeltaVisitor;
+
+public class ResourceDeltaVisitor implements IResourceDeltaVisitor {
+	
+    private Set<IResource> addedResources;
+    
+    public ResourceDeltaVisitor() {
+    	addedResources = new HashSet<IResource>();
+    }
+
+	public boolean visit(IResourceDelta delta) {
+    	
+        switch (delta.getKind()) {
+        case IResourceDelta.ADDED :
+        	getAddedResources().add(delta.getResource());
+        	break;
+        case IResourceDelta.REMOVED :
+            // handle removed resource
+            break;
+        case IResourceDelta.CHANGED :
+            // handle changed resource
+            break;
+        }
+        
+        return true;
+    }
+
+	public Set<IResource> getAddedResources() {
+		return addedResources;
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceFactoryRegistry.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceFactoryRegistry.java
new file mode 100644
index 0000000..dfba3f6
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/ResourceFactoryRegistry.java
@@ -0,0 +1,207 @@
+/*******************************************************************************
+ * Copyright (c) 2008-2011 Chair for Applied Software Engineering, Technische Universitaet Muenchen. 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.standalone.core.workspace;
+
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IConfigurationElement;
+import org.eclipse.core.runtime.Platform;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.ecore.resource.Resource;
+import org.eclipse.emf.ecore.resource.Resource.Factory;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.Artifact;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.NoActiveVCSProviderException;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+
+/**
+ *
+ * @author emueller
+ */
+public class ResourceFactoryRegistry implements Resource.Factory, Resource.Factory.Registry {
+
+	/**
+	 * The initial resource factory is kept if a file is not EMF Store managed, so the initial resource factory has to
+	 * handle the file.
+	 */
+	private static Map<String, Object> initialResourceFactory = new HashMap<String, Object>();
+	public static URI CURRENT_URI;
+	
+	/**
+	 * The Resource.Factory.Registry will be manipulated, so that the EMFStoreResourceFactoryWrapper will be responsible
+	 * for Ecore files.
+	 */
+	public static void replaceSupportedFactories() {
+		Map<String, Object> extensionToFactoryMap = Resource.Factory.Registry.INSTANCE.getExtensionToFactoryMap();
+		
+		// replace factories for all managed file extensions
+		for (String fileExtension : FileUtil.getManagedFileExtensions()) {
+			Object factory = extensionToFactoryMap.get(fileExtension);
+			for (String key : extensionToFactoryMap.keySet()) {
+				Object currentFactory = extensionToFactoryMap.get(key);
+				if (factory == currentFactory) {
+					// remember initial ResourceFactory
+					initialResourceFactory.put(key, currentFactory);
+					// replace factory in registry with an EMF Store adapted one.
+					extensionToFactoryMap.put(key, new ResourceFactoryRegistry());
+				}
+			}
+		}
+	}
+	
+	private Set<IResourceOpenedObserver> resourceOpenedObservers;
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory#createResource(org.eclipse.emf.common.util.URI)
+	 */
+	public Resource createResource(final URI uri) {
+	
+		// use initial resource factory
+		Object object = initialResourceFactory.get(uri.fileExtension());
+		Factory factory = null;
+		if (object instanceof Resource.Factory.Registry) {
+			Resource.Factory.Registry registry = (Resource.Factory.Registry) object;
+			factory = registry.getFactory(uri);
+
+		} else if (object instanceof Resource.Factory.Descriptor) {
+			Resource.Factory.Descriptor descriptor = (Resource.Factory.Descriptor) object;
+			factory = descriptor.createFactory();
+		}
+
+		XMIResource xmiResource = (XMIResource) factory.createResource(uri);
+		IFile artifactFile = FileUtil.getFile(xmiResource.getURI());
+		
+		IVCSProvider activeProvider = VCSProviderRegistry.getInstance().getActiveProvider();
+		
+		if (activeProvider == IVCSProvider.NONE) {
+			return xmiResource;
+		}
+		
+		try {
+			// file has been marked to be put under recorder control
+			if (ArtifactRegistry.getInstance().isFlagged(uri)) {
+				//			IFile historyFile = FileUtil.getHistoryFile(artifactFile);
+				Artifact artifact = new Artifact(xmiResource, FileUtil.getHistoryURI(xmiResource.getURI()));
+				ArtifactRegistry.getInstance().register(artifact);
+				artifact.initialize();
+				VCSProviderRegistry.getInstance().getActiveProvider().addToVCS(FileUtil.getHistoryFile(artifactFile));						
+				ArtifactRegistry.getInstance().unflag(uri);
+
+			} else if (ArtifactRegistry.getInstance().isRegistered(uri)) {
+				Artifact versionedArtifact = ArtifactRegistry.getInstance().getArtifact(uri);
+				if (!versionedArtifact.isInitialized()) {
+					versionedArtifact.initialize(xmiResource);
+				}			
+			}
+		} catch (NoActiveVCSProviderException e) {
+			// should not happen because of guard above
+		}
+		
+		CURRENT_URI = uri;
+		
+		if (resourceOpenedObservers == null) {
+			initResourceOpenedObservers();
+		}
+		
+		notifyResourceOpenedObservers(artifactFile);
+		
+		
+
+		return xmiResource;
+	}
+	
+	private void notifyResourceOpenedObservers(IResource resource) {
+		for (IResourceOpenedObserver observer : resourceOpenedObservers) {
+			observer.resourceOpened(resource);
+		}
+	}
+
+	private void initResourceOpenedObservers() {
+		resourceOpenedObservers = new HashSet<IResourceOpenedObserver>();
+		IConfigurationElement[] config = Platform.getExtensionRegistry().getConfigurationElementsFor(
+				"org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened");
+
+		for (IConfigurationElement extension : config) {
+			try {
+				IResourceOpenedObserver observer = (IResourceOpenedObserver) extension.createExecutableExtension("class");
+				resourceOpenedObservers.add(observer);
+			} catch (CoreException e) {
+				ModelUtil.logWarning("Could not instantiate EMFStore Standalone ResourceOpenedObserver:"
+						+ e.getMessage());
+			}
+		}
+		
+		if (resourceOpenedObservers.size() == 0) {
+			throw new IllegalStateException("No ResourceOpenedObserver registered.  Artifacts will cause memory leaks. Quitting.");
+		}
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getFactory(org.eclipse.emf.common.util.URI)
+	 */
+	public Factory getFactory(URI uri) {
+		return this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getFactory(org.eclipse.emf.common.util.URI,
+	 *      java.lang.String)
+	 */
+	public Factory getFactory(URI uri, String contentType) {
+		return this;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getProtocolToFactoryMap()
+	 */
+	public Map<String, Object> getProtocolToFactoryMap() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getExtensionToFactoryMap()
+	 */
+	public Map<String, Object> getExtensionToFactoryMap() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+
+	/**
+	 * {@inheritDoc}
+	 * 
+	 * @see org.eclipse.emf.ecore.resource.Resource.Factory.Registry#getContentTypeToFactoryMap()
+	 */
+	public Map<String, Object> getContentTypeToFactoryMap() {
+		// TODO Auto-generated method stub
+		return null;
+	}
+	
+	public static Object getDefaultFactory(String extension) {
+		return initialResourceFactory.get(extension);
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/WorkspaceObserver.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/WorkspaceObserver.java
new file mode 100644
index 0000000..a340025
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.core/src/org/eclipse/emf/emfstore/standalone/core/workspace/WorkspaceObserver.java
@@ -0,0 +1,46 @@
+package org.eclipse.emf.emfstore.standalone.core.workspace;
+
+import java.util.Set;
+
+import org.eclipse.core.resources.IFile;
+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.runtime.CoreException;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+
+public class WorkspaceObserver implements IResourceChangeListener {
+
+	public void resourceChanged(IResourceChangeEvent event) {
+		
+		IResourceDelta delta = event.getDelta();
+		ResourceDeltaVisitor visitor = new ResourceDeltaVisitor();
+		
+		try {
+			delta.accept(visitor);
+		} catch (CoreException e) {
+			ModelUtil.logException(e);
+
+		}
+		
+		Set<IResource> addedResources = visitor.getAddedResources();
+		
+		for (IResource resource : addedResources) {
+			if (!(resource instanceof IFile) || !FileUtil.isHistoryFile((IFile) resource)) {
+				continue;
+			}
+
+			IFile historyFile = (IFile) resource;
+			IFile artifactFile = FileUtil.getArtifactFile(historyFile);
+			
+			// new model resource together with its history resource must
+			// have been added
+			if (!ArtifactRegistry.getInstance().isRegistered(artifactFile)) {
+				ArtifactRegistry.getInstance().flag(artifactFile);
+			}
+		}
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.checkstyle b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.checkstyle
new file mode 100644
index 0000000..2f2667a
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.checkstyle
@@ -0,0 +1,7 @@
+<?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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.classpath b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.classpath
new file mode 100644
index 0000000..8a8f166
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.project b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.project
new file mode 100644
index 0000000..1bea40d
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.emfstore.standalone.git</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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.settings/org.eclipse.jdt.core.prefs b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..73f18ff
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Tue Aug 16 17:12:30 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/META-INF/MANIFEST.MF b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..36548ff
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/META-INF/MANIFEST.MF
@@ -0,0 +1,20 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Git
+Bundle-SymbolicName: org.eclipse.emf.emfstore.standalone.git;singleton:=true
+Bundle-Version: 0.9.3.M930
+Bundle-Activator: org.eclipse.emf.emfstore.standalone.git.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.egit;bundle-version="1.0.0",
+ org.eclipse.egit.core;bundle-version="1.0.0",
+ org.junit4;bundle-version="4.8.1",
+ org.eclipse.jgit;bundle-version="1.0.0",
+ org.eclipse.core.resources;bundle-version="3.6.1",
+ org.eclipse.emf.emfstore.standalone.core,
+ org.eclipse.core.filesystem;bundle-version="1.3.1",
+ org.eclipse.compare;bundle-version="3.5.101",
+ org.eclipse.emf.ecore;bundle-version="2.6.1",
+ org.eclipse.emf.ecore.xmi;bundle-version="2.5.0"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/build.properties b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/build.properties
new file mode 100644
index 0000000..6f20375
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/plugin.xml b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/plugin.xml
new file mode 100644
index 0000000..7002744
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/plugin.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         name="gitProvider"
+         point="org.eclipse.emf.emfstore.standalone.core.vcs.provider">
+      <provider
+            class="org.eclipse.emf.emfstore.standalone.git.GitVCSProvider"
+            id="org.eclipse.egit.core.GitProvider">
+      </provider>
+   </extension>
+
+</plugin>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/Activator.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/Activator.java
new file mode 100644
index 0000000..0ac3ee2
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/Activator.java
@@ -0,0 +1,50 @@
+package org.eclipse.emf.emfstore.standalone.git;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.emf.emfstore.standalone.git"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/GitVCSProvider.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/GitVCSProvider.java
new file mode 100644
index 0000000..2a77be8
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.git/src/org/eclipse/emf/emfstore/standalone/git/GitVCSProvider.java
@@ -0,0 +1,447 @@
+package org.eclipse.emf.emfstore.standalone.git;
+
+import java.io.File;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.resources.IStorage;
+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.core.runtime.Path;
+import org.eclipse.egit.core.internal.storage.GitFileRevision;
+import org.eclipse.egit.core.op.AddToIndexOperation;
+import org.eclipse.egit.core.project.RepositoryMapping;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.RepositoryNotFoundException;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.AbstractVCSProvider;
+import org.eclipse.jgit.api.AddCommand;
+import org.eclipse.jgit.api.RebaseCommand;
+import org.eclipse.jgit.api.errors.NoFilepatternException;
+import org.eclipse.jgit.dircache.DirCache;
+import org.eclipse.jgit.dircache.DirCacheEntry;
+import org.eclipse.jgit.errors.CorruptObjectException;
+import org.eclipse.jgit.errors.IncorrectObjectTypeException;
+import org.eclipse.jgit.errors.MissingObjectException;
+import org.eclipse.jgit.errors.NoWorkTreeException;
+import org.eclipse.jgit.lib.Constants;
+import org.eclipse.jgit.lib.IndexDiff;
+import org.eclipse.jgit.lib.ObjectId;
+import org.eclipse.jgit.lib.Repository;
+import org.eclipse.jgit.lib.RepositoryState;
+import org.eclipse.jgit.revwalk.RevCommit;
+import org.eclipse.jgit.revwalk.RevWalk;
+import org.eclipse.jgit.treewalk.FileTreeIterator;
+import org.eclipse.jgit.treewalk.TreeWalk;
+import org.eclipse.jgit.treewalk.WorkingTreeIterator;
+import org.eclipse.jgit.treewalk.filter.AndTreeFilter;
+import org.eclipse.jgit.treewalk.filter.NotIgnoredFilter;
+import org.eclipse.jgit.treewalk.filter.OrTreeFilter;
+import org.eclipse.jgit.treewalk.filter.PathFilter;
+import org.eclipse.jgit.treewalk.filter.TreeFilter;
+import org.eclipse.jgit.util.FS;
+import org.eclipse.jgit.util.IO;
+import org.eclipse.jgit.util.RawParseUtils;
+import org.eclipse.osgi.util.NLS;
+import org.eclipse.team.core.history.IFileRevision;
+
+public class GitVCSProvider extends AbstractVCSProvider {
+
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public boolean isModified(IFile historyFile) throws IOException {
+	
+		RepositoryMapping mapping = RepositoryMapping.getMapping(historyFile.getProject());
+		Repository repo = mapping.getRepository();
+
+		if (repo != null && repo != mapping.getRepository()) {
+					new IllegalStateException("No unique repository");
+		}
+
+		TreeWalk walk = new TreeWalk(repo);
+		walk.addTree(new FileTreeIterator(repo));
+		WorkingTreeIterator workingTreeIterator = walk.getTree(0,
+				WorkingTreeIterator.class);
+
+		IndexDiff diff = new IndexDiff(repo, "HEAD", workingTreeIterator);
+		diff.diff();
+
+		boolean wasCleared = false;
+		if (historyFile.exists()) {
+			// TODO: is there a better way for the containment check?
+			if (diff.getModified().contains(historyFile.getFullPath().toString().substring(1))) {
+				wasCleared = true;
+				// if history file has not been modified, its content may get cleared
+				// in any other cases, operations have been added to the history file
+				// and the modify check will evaluate to true
+//				URI historyUri = FileUtil.getUri(historyFile);
+//				Object defaultFactory = ResourceFactoryRegistry.getDefaultFactory("ecore");
+//				XMIResource historyResource = (XMIResource) ((Resource.Factory.Descriptor) defaultFactory).createFactory().createResource(historyUri); 
+//				historyResource.getContents().clear();
+//				historyResource.save(null);
+//				wasCleared  = true;
+			}
+		}
+
+		return wasCleared;
+	}
+ 
+	/**
+	 * {@inheritDoc}
+	 */
+	@Override
+	public void resolveConflict(IFile file) {
+		AddCommand addCmd;
+		try {
+			addCmd = new AddCommand(getRepository(file.getProject()));
+			addCmd.addFilepattern(file.getFullPath().toString().substring(1));
+			addCmd.addFilepattern(FileUtil.getFile(FileUtil.getUri(file)).getFullPath().toString().substring(1));
+			addCmd.call();
+		} catch (RepositoryNotFoundException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		} catch (NoFilepatternException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getMyRevision(IResource resource, IProgressMonitor monitor) 
+	throws IOException, InterruptedException {
+		String target;
+		Repository repository = null;
+		try {
+			repository = getRepository(resource.getProject());
+		} catch (RepositoryNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+ 
+		if (repository.getRepositoryState().equals(RepositoryState.MERGING)) {
+			target = Constants.MERGE_HEAD;
+		} else if (repository.getRepositoryState().equals(RepositoryState.CHERRY_PICKING)) {
+			target = Constants.CHERRY_PICK_HEAD;
+		} else if (repository.getRepositoryState().equals(
+				RepositoryState.REBASING_INTERACTIVE)) {
+			target = readFile(repository.getDirectory(),
+					RebaseCommand.REBASE_MERGE + File.separatorChar
+							+ RebaseCommand.STOPPED_SHA);
+		} else {
+			target = Constants.ORIG_HEAD;
+		}
+		
+		RevCommit commit = getCommit(resource, target, monitor);
+		return getFileContent(resource, commit, monitor);
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public String getTheirRevision(IResource resource, IProgressMonitor monitor) 
+	throws IOException, InterruptedException {
+		Repository repository = null;
+		try {
+			repository = getRepository(resource.getProject());
+		} catch (RepositoryNotFoundException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		ObjectId head = repository.resolve(Constants.HEAD);
+		if (head == null) {
+			throw new IOException("UIText.ValidationUtils_CanNotResolveRefMessage, Constants.HEAD");
+		}
+
+		RevCommit commit = getCommit(resource, Constants.HEAD, monitor);
+		return getFileContent(resource, commit, monitor);
+	}
+	
+	private RevCommit getCommit(IResource resource, String target, IProgressMonitor monitor) 
+	throws InterruptedException, IOException {
+		// make sure all resources belong to the same repository
+		RevWalk revWalk = null;
+
+		monitor.beginTask("Checking resources", IProgressMonitor.UNKNOWN); 
+		List<String> filterPaths = new ArrayList<String>();
+		// TODO: duplicate code -> activator.java
+		Repository repository = null;
+		RepositoryMapping map = RepositoryMapping.getMapping(resource.getProject());
+
+		if (repository != null && repository != map.getRepository()) {
+			throw new IllegalStateException("No unique repository");
+		}
+
+		filterPaths.add(map.getRepoRelativePath(resource));
+		repository = map.getRepository();
+
+		if (repository == null) {
+			throw new IllegalStateException("No unique repository");
+		}
+
+		if (monitor.isCanceled()) {
+			throw new InterruptedException();
+		}
+
+		revWalk = new RevWalk(repository);
+		ObjectId objectId = repository.resolve(target);
+		
+		if (objectId == null) {
+			throw new IOException(NLS.bind(
+					String.format("Can not resolve given target {0}", target),
+					target));
+		}
+		
+		RevCommit commit = revWalk.parseCommit(objectId);
+		return commit; 
+	}
+		
+	public String getFileContent(IResource resource,
+			RevCommit commit, 
+			IProgressMonitor monitor) {
+		
+		monitor.setTaskName("TODO");//UIText.GitMergeEditorInput_CalculatingDiffTaskName);
+		RepositoryMapping map = RepositoryMapping.getMapping(resource.getProject());
+		
+		List<String> filterPaths = new ArrayList<String>();
+		filterPaths.add(map.getRepoRelativePath(resource));
+		Repository repository = map.getRepository();
+		TreeWalk tw = new TreeWalk(repository);
+	
+		String s = null;
+		try {
+			int fileTreeIndex = tw.addTree(new FileTreeIterator(repository));
+			// skip ignored resources
+			NotIgnoredFilter notIgnoredFilter = new NotIgnoredFilter(
+					fileTreeIndex);
+
+			// filter by selected resources
+			if (filterPaths.size() > 1) {
+				List<TreeFilter> suffixFilters = new ArrayList<TreeFilter>();
+				for (String filterPath : filterPaths)
+					suffixFilters.add(PathFilter.create(filterPath));
+				TreeFilter otf = OrTreeFilter.create(suffixFilters);
+				tw.setFilter(AndTreeFilter.create(otf, notIgnoredFilter));
+			} else if (filterPaths.size() > 0)
+				tw.setFilter(AndTreeFilter.create(PathFilter.create(filterPaths
+						.get(0)), notIgnoredFilter));
+			else
+				tw.setFilter(notIgnoredFilter);
+
+			tw.setRecursive(true);
+		
+			while (tw.next()) {
+				if (monitor.isCanceled())
+					throw new InterruptedException();
+				String gitPath = tw.getPathString();
+				monitor.setTaskName(gitPath);
+
+				FileTreeIterator fit = tw.getTree(fileTreeIndex,
+						FileTreeIterator.class);
+				if (fit == null)
+					continue;
+
+				// if this is neither conflicting nor changed, we skip it
+				//				if (!conflicting && !modified)
+				//					continue;
+
+				IFileRevision fileRevision;
+				// TODO: conflicting muss sich auf ecore beziehne
+				// TODO: parameter checken
+				fileRevision = getFileRevision(repository, commit, gitPath);
+
+				try {
+					if (fileRevision != null) {
+						IStorage storage = fileRevision.getStorage(null);
+						s = FileUtil.slurpAndClose(storage.getContents());
+					} else {
+						IPath locationPath = new Path(fit.getEntryFile().getPath());
+						final IFile file = ResourcesPlugin.getWorkspace().getRoot()
+						.getFileForLocation(locationPath);
+						if (file == null) {
+							// TODO in the future, we should be able to show a version
+							// for a non-workspace file as well
+							continue;
+						}
+						fileRevision = GitFileRevision.inCommit(repository, commit,
+								gitPath, null);
+						IStorage storage;
+
+						storage = fileRevision.getStorage(null);
+						s = FileUtil.slurpAndClose(storage.getContents());
+					}
+				} catch (CoreException e) {
+					// TODO Auto-generated catch block
+					e.printStackTrace();
+				}
+
+				tw.release();
+			}
+		} catch (MissingObjectException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IncorrectObjectTypeException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (CorruptObjectException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InterruptedException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (NoWorkTreeException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		}
+
+		return s;
+	}
+
+	private String readFile(File directory, String fileName) throws IOException {
+		byte[] content = IO.readFully(new File(directory, fileName));
+		// strip off the last LF
+		int end = content.length;
+		while (0 < end && content[end - 1] == '\n')
+			end--;
+		return RawParseUtils.decode(content, 0, end);
+	}
+
+	public Repository getRepository(IResource resource) throws RepositoryNotFoundException {
+		Repository repository = null;
+		List<String> filterPaths = new ArrayList<String>();
+		RepositoryMapping map = RepositoryMapping.getMapping(resource.getProject());
+		repository = map.getRepository();
+
+		if (repository != null && repository != map.getRepository()) {
+			throw new RepositoryNotFoundException(
+					new IllegalStateException("No unique repository"));
+		}
+
+		filterPaths.add(map.getRepoRelativePath(resource));
+		repository = map.getRepository();
+
+		if (repository == null) {
+			throw new RepositoryNotFoundException(
+					new IllegalStateException("No unique repository"));
+		}
+
+		return repository;
+	}
+
+//	public IRevision<RevCommit> getAncestorRevision(
+//			IRevision<RevCommit> rightRevision,
+//			IRevision<RevCommit> headRevision, IRepository<Repository> repository,
+//			IProgressMonitor monitor)
+//			throws IOException, InterruptedException {
+//		
+//		final String fullBranch;
+//		
+//		RevWalk revWalk = new RevWalk(repository.getRepository());
+//		fullBranch = repository.getRepository().getFullBranch();
+//
+//		// try to obtain the common ancestor
+//		List<RevCommit> startPoints = new ArrayList<RevCommit>();
+//		revWalk.setRevFilter(RevFilter.MERGE_BASE);
+//		startPoints.add(rightRevision.getRevision());
+//		startPoints.add(headRevision.getRevision());
+//		RevCommit ancestorCommit;
+//		
+//		try {
+//			revWalk.markStart(startPoints);
+//			ancestorCommit = revWalk.next();
+//		} catch (Exception e) {
+//			ancestorCommit = null;
+//		}
+//
+//		if (monitor.isCanceled()) {
+//			throw new InterruptedException();
+//		}
+//		
+//		return new GitRevision(ancestorCommit);
+//	}
+
+	public IFileRevision getFileRevision(Repository repository,
+			RevCommit revision, String objectId) {
+//		RevCommit rev = revision.getRevision();
+//		IRepository<Repository> repo = repository.getRepository();
+		TreeWalk w;
+		try {
+			w = TreeWalk.forPath(repository, objectId, revision.getTree());
+			if (w != null) {
+				final IFileRevision fileRevision = GitFileRevision.inCommit(repository,
+						revision, objectId, null);
+				return fileRevision;
+			}
+		} catch (MissingObjectException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IncorrectObjectTypeException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (CorruptObjectException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		// check if file is contained in commit
+		
+		return null;
+	}
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public void addToVCS(IFile file) {
+		RepositoryMapping mapping = RepositoryMapping.getMapping(file);
+
+		if (mapping != null) {
+			Repository repository = mapping.getRepository();
+			try {
+				DirCache cache = new DirCache(repository.getIndexFile(), FS.DETECTED);
+				cache.read();
+				for (int i = 0; i < cache.getEntryCount(); i++) {
+					DirCacheEntry entry = cache.getEntry(i);
+					if (entry.getPathString().equals(file.getFullPath().makeRelative().toString())) {
+						// selected file is either added or staged 
+						// thus we may add the version file to the staging area
+//						String historyFileName = FileUtil.getHistoryFilename(file); 
+						
+//						IResource historyFile = file.getProject().findMember(historyFileName);
+						
+						if (file != null) {
+							// add to index -> extract
+							AddToIndexOperation addToIndexOp = new AddToIndexOperation(Collections.singleton(file));
+							addToIndexOp.execute(new NullProgressMonitor());
+						}
+					}
+				}
+			} catch (NoWorkTreeException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (CorruptObjectException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (IOException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			} catch (CoreException e) {
+				// TODO Auto-generated catch block
+				e.printStackTrace();
+			}
+		}
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.checkstyle b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.checkstyle
new file mode 100644
index 0000000..2f2667a
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.checkstyle
@@ -0,0 +1,7 @@
+<?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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.classpath b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.classpath
new file mode 100644
index 0000000..8a8f166
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.classpath
@@ -0,0 +1,7 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<classpath>
+	<classpathentry kind="con" path="org.eclipse.jdt.launching.JRE_CONTAINER/org.eclipse.jdt.internal.debug.ui.launcher.StandardVMType/JavaSE-1.6"/>
+	<classpathentry kind="con" path="org.eclipse.pde.core.requiredPlugins"/>
+	<classpathentry kind="src" path="src"/>
+	<classpathentry kind="output" path="bin"/>
+</classpath>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.project b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.project
new file mode 100644
index 0000000..74c1938
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.project
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<projectDescription>
+	<name>org.eclipse.emf.emfstore.standalone.ui</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/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.settings/org.eclipse.jdt.core.prefs b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.settings/org.eclipse.jdt.core.prefs
new file mode 100644
index 0000000..2a5026b
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/.settings/org.eclipse.jdt.core.prefs
@@ -0,0 +1,8 @@
+#Wed Aug 17 17:11:16 CEST 2011
+eclipse.preferences.version=1
+org.eclipse.jdt.core.compiler.codegen.inlineJsrBytecode=enabled
+org.eclipse.jdt.core.compiler.codegen.targetPlatform=1.6
+org.eclipse.jdt.core.compiler.compliance=1.6
+org.eclipse.jdt.core.compiler.problem.assertIdentifier=error
+org.eclipse.jdt.core.compiler.problem.enumIdentifier=error
+org.eclipse.jdt.core.compiler.source=1.6
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/META-INF/MANIFEST.MF b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/META-INF/MANIFEST.MF
new file mode 100644
index 0000000..8c08879
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/META-INF/MANIFEST.MF
@@ -0,0 +1,14 @@
+Manifest-Version: 1.0
+Bundle-ManifestVersion: 2
+Bundle-Name: Ui
+Bundle-SymbolicName: org.eclipse.emf.emfstore.standalone.ui;singleton:=true
+Bundle-Version: 0.9.3.M930
+Bundle-Activator: org.eclipse.emf.emfstore.standalone.ui.Activator
+Require-Bundle: org.eclipse.ui,
+ org.eclipse.core.runtime,
+ org.eclipse.core.resources;bundle-version="3.6.1",
+ org.eclipse.emf.ecore.xmi;bundle-version="2.5.0",
+ org.eclipse.emf.emfstore.standalone.core,
+ org.eclipse.emf.emfstore.client.ui;bundle-version="0.9.3"
+Bundle-ActivationPolicy: lazy
+Bundle-RequiredExecutionEnvironment: JavaSE-1.6
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/build.properties b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/build.properties
new file mode 100644
index 0000000..6f20375
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/build.properties
@@ -0,0 +1,5 @@
+source.. = src/
+output.. = bin/
+bin.includes = META-INF/,\
+               .,\
+               plugin.xml
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/plugin.xml b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/plugin.xml
new file mode 100644
index 0000000..4842136
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/plugin.xml
@@ -0,0 +1,64 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<?eclipse version="3.4"?>
+<plugin>
+   <extension
+         point="org.eclipse.ui.popupMenus">
+      <viewerContribution
+            id="org.eclipse.emf.emfstore.teamprovider.recording.ui.navigator"
+            targetID="org.eclipse.ui.views.ResourceNavigator">
+         <action
+               class="org.eclipse.emf.emfstore.standalone.ui.handlers.EnableMergingHandler"
+               enablesFor="1"
+               id="org.eclipse.emf.emfstore.teamprovider.recording.ui.enable"
+               label="Enable EMFStore Merging"
+               menubarPath="org.eclipse.emf.emfstore.teamprovider.recording.ui.menu/group"
+               tooltip="Enables EMFStore merging facility for model files">
+         </action>
+         <action
+               class="org.eclipse.emf.emfstore.standalone.ui.handlers.DisableMergingHandler"
+               enablesFor="1"
+               id="org.eclipse.emf.emfstore.teamprovider.recording.ui.disable"
+               label="Disable EMFStore Merging"
+               menubarPath="org.eclipse.emf.emfstore.teamprovider.recording.ui.menu/group"
+               tooltip="Disables EMFStore merging facility for model files">
+         </action>
+         <action
+               class="org.eclipse.emf.emfstore.standalone.ui.handlers.ExecuteMergerHandler"
+               id="org.eclipse.emf.emfstore.teamprovider.recording.ui.merge"
+               label="Merge"
+               menubarPath="org.eclipse.emf.emfstore.teamprovider.recording.ui.menu/group"
+               tooltip="Executes merging">
+         </action>
+         <menu
+               id="org.eclipse.emf.emfstore.teamprovider.recording.ui.menu"
+               label="emfstore merging">
+            <groupMarker
+                  name="org.eclipse.emf.emfstore.teamprovider.recording.ui.menu/group">
+            </groupMarker>
+         </menu>
+      </viewerContribution>
+   </extension>
+	<extension
+         point="org.eclipse.ui.decorators">
+      <decorator
+            adaptable="false"
+            class="org.eclipse.emf.emfstore.standalone.ui.MergeDecorator"
+            id="org.eclipse.emf.emfstore.teamprovider.recording.decorator"
+            label="Recorder Label"
+            lightweight="true"
+            location="UNDERLAY"
+            state="true">
+      </decorator>
+   </extension>
+   <extension
+         point="org.eclipse.ui.startup">
+      <startup
+            class="org.eclipse.emf.emfstore.standalone.ui.SynchronizeControl"></startup>
+   </extension>
+   <extension
+         point="org.eclipse.emf.emfstore.standalone.core.workspace.resourceOpened">
+      <observer
+            class="org.eclipse.emf.emfstore.standalone.ui.ResourceOpenedObserver">
+      </observer>
+   </extension>
+</plugin>
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/Activator.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/Activator.java
new file mode 100644
index 0000000..fae5ac4
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/Activator.java
@@ -0,0 +1,50 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+
+import org.eclipse.ui.plugin.AbstractUIPlugin;
+import org.osgi.framework.BundleContext;
+
+/**
+ * The activator class controls the plug-in life cycle
+ */
+public class Activator extends AbstractUIPlugin {
+
+	// The plug-in ID
+	public static final String PLUGIN_ID = "org.eclipse.emf.emfstore.teamprovider.recording.ui"; //$NON-NLS-1$
+
+	// The shared instance
+	private static Activator plugin;
+	
+	/**
+	 * The constructor
+	 */
+	public Activator() {
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#start(org.osgi.framework.BundleContext)
+	 */
+	public void start(BundleContext context) throws Exception {
+		super.start(context);
+		plugin = this;
+	}
+
+	/*
+	 * (non-Javadoc)
+	 * @see org.eclipse.ui.plugin.AbstractUIPlugin#stop(org.osgi.framework.BundleContext)
+	 */
+	public void stop(BundleContext context) throws Exception {
+		plugin = null;
+		super.stop(context);
+	}
+
+	/**
+	 * Returns the shared instance
+	 *
+	 * @return the shared instance
+	 */
+	public static Activator getDefault() {
+		return plugin;
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactDisposeListener.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactDisposeListener.java
new file mode 100644
index 0000000..5b0049f
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactDisposeListener.java
@@ -0,0 +1,73 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.Artifact;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.ui.IPartListener2;
+import org.eclipse.ui.IWorkbenchPartReference;
+
+public class ArtifactDisposeListener implements IPartListener2 {
+	
+	// TODO: read ID from ecore editor plugin
+	public static final String ECORE_EDITOR_ID = "org.eclipse.emf.ecore.presentation.EcoreEditorID";
+	private String fileName;
+	private final IFile file;
+
+	public ArtifactDisposeListener(IFile file) {
+		this.file = file;
+		fileName = file.getName();
+	}
+
+	public void partActivated(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partBroughtToTop(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partClosed(IWorkbenchPartReference partRef) {
+		if (partRef.getId().equals(ECORE_EDITOR_ID)) {
+			String partName = partRef.getPartName();
+			if (partName.equals(fileName)) {
+				URI uri = FileUtil.getUri(file);
+				Artifact mergerArtifact = ArtifactRegistry.getInstance().getArtifact(uri);
+				// may be null in case file is not under merger control
+				if (mergerArtifact != null) {
+					mergerArtifact.dispose();
+				}
+			}
+		}
+		partRef.getPage().removePartListener(this);
+	}
+
+	public void partDeactivated(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partOpened(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partHidden(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partVisible(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	public void partInputChanged(IWorkbenchPartReference partRef) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactMerger.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactMerger.java
new file mode 100644
index 0000000..139f7b6
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ArtifactMerger.java
@@ -0,0 +1,325 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+
+import java.io.IOException;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.core.runtime.NullProgressMonitor;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.resource.impl.ResourceSetImpl;
+import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.xmi.XMIResource;
+import org.eclipse.emf.emfstore.client.ui.dialogs.merge.DecisionManager;
+import org.eclipse.emf.emfstore.client.ui.dialogs.merge.MergeWizard;
+import org.eclipse.emf.emfstore.common.model.ModelElementId;
+import org.eclipse.emf.emfstore.common.model.Project;
+import org.eclipse.emf.emfstore.common.model.impl.ProjectImpl;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.common.model.util.SerializationException;
+import org.eclipse.emf.emfstore.server.model.versioning.ChangePackage;
+import org.eclipse.emf.emfstore.server.model.versioning.PrimaryVersionSpec;
+import org.eclipse.emf.emfstore.server.model.versioning.VersioningFactory;
+import org.eclipse.emf.emfstore.server.model.versioning.operations.AbstractOperation;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.Artifact;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.workspace.ResourceFactoryRegistry;
+import org.eclipse.jface.wizard.WizardDialog;
+import org.eclipse.swt.widgets.Display;
+import org.xml.sax.InputSource;
+
+public class ArtifactMerger {
+
+	private IResource resource;
+//	private Project project;
+//	private XMIResource historyResource;
+//	private final XMIResource xmiResource;
+	private IVCSProvider provider;
+	private Artifact artifact;
+	
+	public ArtifactMerger(IVCSProvider provider, IResource resource,
+			Artifact artifact) {
+		this.resource = resource;
+		this.artifact = artifact;
+//		this.xmiResource = artifact.getModelResource();
+//		this.historyResource = artifact.getHistoryResource();
+//		this.project = artifact.getCollection();
+		this.provider = provider;
+	}
+	
+	public void merge() {
+		artifact.getProject().getChangeNotifier().disableNotifications(true);
+				
+		try {
+			// restore project state 
+			String artifactFileContent = provider.getMyRevision(
+					FileUtil.getFile(artifact.getModelResource().getURI()),	new NullProgressMonitor());
+			artifact.setProject(stringToEObjectIntoProject(artifactFileContent));
+			writeToXMIResource(artifact.getProject().getModelElements(), artifact.getModelResource());
+			
+		} catch (IOException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		} catch (InterruptedException e1) {
+			// TODO Auto-generated catch block
+			e1.printStackTrace();
+		} catch (SerializationException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		List theirOperations = provider.getTheirOperations(resource, new NullProgressMonitor());
+		List myOperations = provider.getMyOperations(resource, new NullProgressMonitor());
+		List<AbstractOperation> mergeResult = callMergeDialog(myOperations, theirOperations);
+		// if mergeResult is empty, file have been auto-merged
+		try {
+			Artifact artifact = ArtifactRegistry.getInstance().getArtifact(ResourceFactoryRegistry.CURRENT_URI);
+			applyMergeResult(myOperations, theirOperations, mergeResult);
+			// resolve conflict on ecore
+			IFile artifactFile = FileUtil.getFile(artifact.getModelResource().getURI());
+			provider.resolveConflict(artifactFile);
+			artifact.getHistoryResource().getContents().clear();
+			artifact.getHistoryResource().getContents().addAll(mergeResult);
+			artifact.getHistoryResource().save(null);
+			provider.resolveConflict(FileUtil.getHistoryFile(artifactFile));
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		artifact.getProject().getChangeNotifier().disableNotifications(false);
+	}
+
+	/**
+	 * Applies a list of operations to the project. The change tracking is
+	 * stopped and the operations are added to the projectspace.
+	 * 
+	 * @see #applyOperationsWithRecording(List, boolean)
+	 * @param operations
+	 *            list of operations
+	 * @param addOperation
+	 *            true if operation should be saved in project space.
+	 */
+	public void applyOperations(List<AbstractOperation> operations) {
+		// TODO: API
+//		((ProjectImpl) artifact.getProject()).getChangeNotifier().disableNotifications(true);
+//		try {
+			for (AbstractOperation operation : operations) {
+				operation.apply(artifact.getProject());
+			}
+//		} finally {
+//			((ProjectImpl) project).getChangeNotifier().disableNotifications(false);
+//		}
+	}
+	
+	private ChangePackage createChangePackage(List<AbstractOperation> operations) {
+		ChangePackage changePackage = VersioningFactory.eINSTANCE.createChangePackage();
+
+		for (EObject o : operations) {
+			AbstractOperation copy = (AbstractOperation) EcoreUtil.copy(o);
+			changePackage.getOperations().add(copy);
+		}
+		
+		return changePackage;
+	}
+
+	private List<AbstractOperation> callMergeDialog(List<AbstractOperation> myOperations, 
+			List<AbstractOperation> theirOperations) {
+		
+		ChangePackage myChangePackage = createChangePackage(myOperations);
+		ChangePackage theirChangePackage = createChangePackage(theirOperations);
+		
+		PrimaryVersionSpec dummy = VersioningFactory.eINSTANCE.createPrimaryVersionSpec();
+		
+		DecisionManager mgr = new DecisionManager(artifact.getProject(), 
+				myChangePackage, Collections.singletonList(theirChangePackage), 
+				dummy, dummy);
+		mgr.calcResult();
+		List<AbstractOperation> mergeResult = new ArrayList<AbstractOperation>();
+	
+		if (mgr.getConflicts().size() > 0 ) {
+			MergeWizard mergeWizard = new MergeWizard(mgr);
+			WizardDialog mergeDialog = new WizardDialog(Display.getCurrent().getActiveShell(), mergeWizard);
+			mergeDialog.create();
+			// TODO: handle cancel case
+			mergeDialog.open();
+
+			// generate merge result and apply to local workspace
+			List<AbstractOperation> acceptedMine = mgr.getAcceptedMine();
+			List<AbstractOperation> rejectedTheirs = mgr.getRejectedTheirs();
+		
+			for (AbstractOperation operationToReverse : rejectedTheirs) {
+				mergeResult.add(0, operationToReverse.reverse());
+			}
+			
+			mergeResult.addAll(acceptedMine);
+		} 
+		
+		return mergeResult;
+	}
+	
+	/**
+	 * Applies the given merge result upon the given {@link Artifact}. 
+	 * @param artifact the {@link Artifact} upon which to apply the merge result
+	 * @param myOperations the local operations
+	 * @param theirOperations the incoming operations
+	 * @param mergeResult the merge result as determined by the user
+	 * @throws IOException
+	 */
+	private void applyMergeResult(List<AbstractOperation> myOperations, 
+			List<AbstractOperation> theirOperations, List<AbstractOperation> mergeResult) 
+		throws IOException {
+		
+		ChangePackage myChangePackage = createChangePackage(myOperations);
+		ChangePackage theirChangePackage = createChangePackage(theirOperations);
+		
+		// revert our changes
+		revert(myChangePackage.getOperations());
+
+		applyOperations(theirChangePackage.getOperations());
+		applyOperations(mergeResult);
+
+		// write merge result back to model resource
+//		List<EObject> modelElements = ModelUtil.clone(project.getModelElements());
+
+		try {
+			writeToXMIResource(mergeResult, artifact.getHistoryResource());
+		} catch (IOException e) {
+			throw new IOException(String.format("Can not write merge result {0} to history resource {1}. Reason: {2}", 
+					mergeResult, artifact.getHistoryResource(), e.getMessage())); 
+		}
+		
+		try {
+			writeToXMIResource(artifact.getProject().getModelElements(), artifact.getModelResource());
+		} catch (IOException e) {
+			throw new IOException(String.format("Can not write model elements {0} to resource {1}. Reason: {2}", 
+					artifact.getProject().getModelElements(), artifact.getModelResource(), e.getMessage())); 
+		}
+	}
+	
+	/**
+	 * Reverts the 
+	 * @param operations
+	 */
+	public void revert(List<AbstractOperation> operations) {
+		while (!operations.isEmpty()) {
+			AbstractOperation lastOperation = operations
+					.get(operations.size() - 1);
+			((ProjectImpl) artifact.getProject()).getChangeNotifier().disableNotifications(true);
+			try {
+				lastOperation.reverse().apply(artifact.getProject());
+			} finally {
+				((ProjectImpl) artifact.getProject()).getChangeNotifier().disableNotifications(false);
+			}
+			operations.remove(lastOperation);
+		}
+	}
+		
+	/**
+	 * Write 
+	 * @param modelElements
+	 * @param resource
+	 * @throws IOException
+	 */
+	private void writeToXMIResource(List<? extends EObject> modelElements, XMIResource resource) throws IOException {
+//		resource.getContents().s
+
+		// TODO: will be slow
+//		int index = 0;
+		for (EObject me : modelElements) {
+
+			List<EObject> allContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(me, false);
+			allContainedModelElements.add(me);
+
+			EObject copiedElement = EcoreUtil.copy(me);
+			List<EObject> copiedAllContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(copiedElement, false);
+			copiedAllContainedModelElements.add(copiedElement);
+			
+			resource.getContents().add(copiedElement);
+
+			for (int i = 0; i < allContainedModelElements.size(); i++) {
+				EObject child = allContainedModelElements.get(i);
+				EObject copiedChild = copiedAllContainedModelElements.get(i);
+				ModelElementId modelElementId = artifact.getProject().getModelElementId(child);
+				if (modelElementId == null) {
+					modelElementId = artifact.getProject().getDeletedModelElementId(child);
+				}				
+				if (modelElementId != null) {
+					resource.setID(copiedChild, modelElementId.getId());
+				}
+			}
+		}
+		
+		for (int i = 0; i < modelElements.size(); i++) {
+			resource.getContents().remove(0);
+		}
+
+		resource.save(null);
+	}
+	
+	/**
+	 * Converts a {@link String} to an {@link EObject}. <b>Note</b>:
+	 * {@link String} must be the result of
+	 * {@link ModelUtil#eObjectToString(EObject)}
+	 * 
+	 * @param object
+	 *            the {@link String} representation of the {@link EObject}
+	 * @return the deserialized {@link EObject}
+	 * @throws SerializationException
+	 *             if deserialization fails
+	 */
+	public static Project stringToEObjectIntoProject(String object)
+			throws SerializationException {
+		if (object == null) {
+			return null;
+		}
+
+		XMIResource res = (XMIResource) (new ResourceSetImpl())
+				.createResource(ModelUtil.VIRTUAL_URI);
+
+		try {
+			res.load(new InputSource(new StringReader(object)),
+					null);
+		} catch (UnsupportedEncodingException e) {
+			throw new SerializationException(e);
+		} catch (IOException e) {
+			throw new SerializationException(e);
+		}
+
+		EObject result = res.getContents().get(0);
+
+		if (result instanceof Project) {
+			return (Project) result;
+		}
+
+		// TODO: init
+		Project project = null;
+		try {
+			project = new ProjectImpl(res);
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			// Do NOT catch all Exceptions ("catch (Exception e)")
+			// Log AND handle Exceptions if possible
+			//
+			// You can just uncomment one of the lines below to log an
+			// exception:
+			// logException will show the logged excpetion to the user
+			// ModelUtil.logException(e);
+			// ModelUtil.logException("YOUR MESSAGE HERE", e);
+			// logWarning will only add the message to the error log
+			// ModelUtil.logWarning("YOUR MESSAGE HERE", e);
+			// ModelUtil.logWarning("YOUR MESSAGE HERE");
+			//
+			// If handling is not possible declare and rethrow Exception
+			e.printStackTrace();
+		}
+
+		return project;
+	}
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/MergeDecorator.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/MergeDecorator.java
new file mode 100644
index 0000000..9d2615b
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/MergeDecorator.java
@@ -0,0 +1,50 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.jface.viewers.IDecoration;
+import org.eclipse.jface.viewers.ILabelProviderListener;
+import org.eclipse.jface.viewers.ILightweightLabelDecorator;
+
+
+public class MergeDecorator implements ILightweightLabelDecorator {
+
+	@Override
+	public void decorate(Object element, IDecoration decoration) {
+		if (element instanceof IFile) {
+			IFile file = (IFile) element;
+			URI uri = FileUtil.getUri(file);
+			if (ArtifactRegistry.getInstance().isFlagged(uri)) {
+				decoration.addPrefix("[F]");
+			} else if (ArtifactRegistry.getInstance().isRegistered(uri)) {
+				decoration.addPrefix("[R]");
+			} 
+		}
+	}
+
+	@Override
+	public void addListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public void dispose() {
+		// TODO Auto-generated method stub
+		
+	}
+
+	@Override
+	public boolean isLabelProperty(Object element, String property) {
+		// TODO Auto-generated method stub
+		return false;
+	}
+
+	@Override
+	public void removeListener(ILabelProviderListener listener) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ResourceOpenedObserver.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ResourceOpenedObserver.java
new file mode 100644
index 0000000..503eefb
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/ResourceOpenedObserver.java
@@ -0,0 +1,34 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IResource;
+import org.eclipse.emf.emfstore.standalone.core.workspace.IResourceOpenedObserver;
+import org.eclipse.ui.IWorkbench;
+import org.eclipse.ui.IWorkbenchPage;
+import org.eclipse.ui.IWorkbenchWindow;
+import org.eclipse.ui.PlatformUI;
+
+public class ResourceOpenedObserver implements IResourceOpenedObserver {
+
+	public ResourceOpenedObserver() {
+
+	}
+
+	@Override
+	public void resourceOpened(IResource resource) {
+		
+		if (!(resource instanceof IFile)) {
+			return;
+		}
+		
+		IFile artifactFile = (IFile) resource;
+		IWorkbench wb = PlatformUI.getWorkbench();
+		IWorkbenchWindow win = wb.getActiveWorkbenchWindow();
+		
+		if (win != null) {
+			IWorkbenchPage page = win.getActivePage();
+			page.addPartListener(new ArtifactDisposeListener(artifactFile));
+		}
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/SynchronizeControl.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/SynchronizeControl.java
new file mode 100644
index 0000000..fe83a75
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/SynchronizeControl.java
@@ -0,0 +1,41 @@
+package org.eclipse.emf.emfstore.standalone.ui;
+
+import java.io.IOException;
+import java.lang.reflect.InvocationTargetException;
+
+import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+import org.eclipse.emf.emfstore.standalone.core.workspace.ResourceFactoryRegistry;
+import org.eclipse.emf.emfstore.standalone.core.workspace.WorkspaceObserver;
+import org.eclipse.ui.IStartup;
+
+public class SynchronizeControl extends WorkspaceObserver implements IStartup {
+
+	
+	/**
+	 * {@inheritDoc}
+	 */
+	public void earlyStartup() {
+		ResourceFactoryRegistry.replaceSupportedFactories();
+		
+		try {
+			VCSProviderRegistry.getInstance().initVCSProviders();
+			VCSProviderRegistry.getInstance().initArtifacts();
+		} catch (CoreException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (InvocationTargetException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		} catch (IOException e) {
+			// TODO Auto-generated catch block
+			e.printStackTrace();
+		}
+		
+		// TODO: do we need to dispose this? I guess not?
+		ResourcesPlugin.getWorkspace().addResourceChangeListener(this);	
+	}
+
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/AbstractTeamProviderHandler.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/AbstractTeamProviderHandler.java
new file mode 100644
index 0000000..cab60e0
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/AbstractTeamProviderHandler.java
@@ -0,0 +1,58 @@
+package org.eclipse.emf.emfstore.standalone.ui.handlers;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.QualifiedName;
+import org.eclipse.emf.emfstore.common.model.util.ModelUtil;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.VCSProviderNotFoundException;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.ui.IViewActionDelegate;
+
+public abstract class AbstractTeamProviderHandler implements IViewActionDelegate {
+	
+	private static final String TEAM_PROVIDER_KEY = "org.eclipse.team.core.repository";
+	protected IFile selectedFile;
+	
+	protected String getTeamProviderID(IFile file) {
+		IProject project = file.getProject();
+		String key = TEAM_PROVIDER_KEY;
+		int dot = key.lastIndexOf('.');
+		QualifiedName qualifiedName = new QualifiedName(key.substring(0, dot), key.substring(dot + 1));
+		try {
+			Object object = project.getPersistentProperties().get(qualifiedName);
+			return (String) object;
+		} catch (CoreException e) {
+			ModelUtil.logException("Can not determine team provider.", e);
+		}
+		
+		return null;
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (!(selection instanceof StructuredSelection)) {
+			return;
+		}
+		
+		StructuredSelection ss = (StructuredSelection)selection;
+		
+		if (!(ss.getFirstElement() instanceof IFile)) {
+			return;				
+		}
+		
+		selectedFile = (IFile) ss.getFirstElement();
+		String teamProviderID = getTeamProviderID(selectedFile);
+		try {
+			IVCSProvider vcsProvider = VCSProviderRegistry.getInstance().getVCSProvider(teamProviderID);
+			VCSProviderRegistry.getInstance().setActiveProvider(vcsProvider);
+		} catch (VCSProviderNotFoundException e) {
+			// do nothing
+		}
+	}
+	
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/DisableMergingHandler.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/DisableMergingHandler.java
new file mode 100644
index 0000000..1852a39
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/DisableMergingHandler.java
@@ -0,0 +1,54 @@
+package org.eclipse.emf.emfstore.standalone.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.emf.common.util.URI;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class DisableMergingHandler extends AbstractTeamProviderHandler implements IViewActionDelegate {
+
+	public DisableMergingHandler() {
+		// TODO Auto-generated constructor stub
+	}
+
+	@Override
+	public void run(IAction action) {
+		if (selectedFile != null) {
+			URI platformURI = URI.createPlatformResourceURI(selectedFile.getFullPath().toString(), true);
+			if (ArtifactRegistry.getInstance().isRegistered(platformURI)) {
+				try {
+					ArtifactRegistry.getInstance().unregister(platformURI);
+				} catch (CoreException e) {
+					MessageDialog.openError(Display.getCurrent().getActiveShell(), 
+							"Disable merging",
+							"The history file can not be deleted.");
+				}
+			} else if (!ArtifactRegistry.getInstance().isRegistered(platformURI) || !FileUtil.hasManagedFileExtension(selectedFile)) {
+				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), 
+						"File is not under versioned control",
+						"The selected file is not put under versioned control. TODO");
+			} 
+		} else {
+			// TODO: actually this should not get executed ever
+			MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Disable merging", 
+					"Please first select a file");
+		}
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		return null;
+	}
+
+	@Override
+	public void init(IViewPart view) {
+		// TODO Auto-generated method stub	
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/EnableMergingHandler.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/EnableMergingHandler.java
new file mode 100644
index 0000000..334ff14
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/EnableMergingHandler.java
@@ -0,0 +1,54 @@
+package org.eclipse.emf.emfstore.standalone.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class EnableMergingHandler extends AbstractTeamProviderHandler implements IViewActionDelegate {
+
+	@Override
+	public void run(IAction action) {
+		
+		if (selectedFile != null) {
+			if (VCSProviderRegistry.getInstance().getActiveProvider() == IVCSProvider.NONE) {
+				MessageDialog.openWarning(Display.getCurrent().getActiveShell(), "Enable merging", 
+						"The VCS provider could not be determined.");
+			}
+			
+			if (ArtifactRegistry.getInstance().isRegistered(FileUtil.getUri(selectedFile))) {
+				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), 
+						"File already under EMFStore merger control",
+						"The selected file already is under control of EMFStore merger.");
+			} else if (FileUtil.hasManagedFileExtension(selectedFile)) {
+				ArtifactRegistry.getInstance().flag(FileUtil.getUri(selectedFile));
+			} else {
+				MessageDialog.openInformation(Display.getCurrent().getActiveShell(), 
+						"File can not be put under control of EMFStore merger",
+						"The selected file can not be put under control of EMFStore merger. TODO"); 
+			}
+		} else {
+			// TODO: actually this should not get executed ever
+			MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Enable merging", 
+					"Please first select a file");
+		}
+	}
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		return null;
+	}
+
+	@Override
+	public void init(IViewPart view) {
+		// TODO Auto-generated method stub
+		
+	}
+
+}
diff --git a/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/ExecuteMergerHandler.java b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/ExecuteMergerHandler.java
new file mode 100644
index 0000000..4521c00
--- /dev/null
+++ b/Archive/EMFStoreStandalone/org.eclipse.emf.emfstore.standalone.ui/src/org/eclipse/emf/emfstore/standalone/ui/handlers/ExecuteMergerHandler.java
@@ -0,0 +1,86 @@
+package org.eclipse.emf.emfstore.standalone.ui.handlers;
+
+import org.eclipse.core.commands.ExecutionEvent;
+import org.eclipse.core.commands.ExecutionException;
+import org.eclipse.core.resources.IFile;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.Artifact;
+import org.eclipse.emf.emfstore.standalone.core.artifacts.ArtifactRegistry;
+import org.eclipse.emf.emfstore.standalone.core.exceptions.NoActiveVCSProviderException;
+import org.eclipse.emf.emfstore.standalone.core.util.FileUtil;
+import org.eclipse.emf.emfstore.standalone.core.vcs.IVCSProvider;
+import org.eclipse.emf.emfstore.standalone.core.vcs.VCSProviderRegistry;
+import org.eclipse.emf.emfstore.standalone.core.workspace.ResourceFactoryRegistry;
+import org.eclipse.emf.emfstore.standalone.ui.ArtifactMerger;
+import org.eclipse.jface.action.IAction;
+import org.eclipse.jface.dialogs.MessageDialog;
+import org.eclipse.jface.viewers.ISelection;
+import org.eclipse.jface.viewers.StructuredSelection;
+import org.eclipse.swt.widgets.Display;
+import org.eclipse.ui.IViewActionDelegate;
+import org.eclipse.ui.IViewPart;
+
+public class ExecuteMergerHandler extends AbstractTeamProviderHandler implements IViewActionDelegate {
+
+	public Object execute(ExecutionEvent event) throws ExecutionException {
+		return null;
+	}
+
+	@Override
+	public void run(IAction action) {
+		if (selectedFile != null) {
+			
+			IVCSProvider activeProvider = VCSProviderRegistry.getInstance().getActiveProvider();
+			
+			if (activeProvider == IVCSProvider.NONE) {
+				MessageDialog.openWarning(Display.getCurrent().getActiveShell(), "Warning", 
+						"The VCS provider could not be determined.");
+				return;
+			}
+			
+			Artifact versionedArtifact = ArtifactRegistry.getInstance().getArtifact(
+					ResourceFactoryRegistry.CURRENT_URI);
+			// TODO: how can this be not initalized?
+			if (!versionedArtifact.isInitialized()) {
+				try {
+					versionedArtifact.initialize();
+				} catch (NoActiveVCSProviderException e) {
+					// should not happen because of guard above
+				}
+			}
+			
+			ArtifactMerger merger = new ArtifactMerger(activeProvider,
+					selectedFile, versionedArtifact);
+			merger.merge(); 
+			
+		} else {
+			MessageDialog.openInformation(Display.getCurrent().getActiveShell(), "Execute merging", 
+					"Please first select a conflicting history file.");
+		}
+	}
+
+	@Override
+	public void selectionChanged(IAction action, ISelection selection) {
+		if (!(selection instanceof StructuredSelection)) {
+			return;
+		}
+
+		StructuredSelection ss = (StructuredSelection) selection;
+		Object firstElement = ss.getFirstElement();
+		
+		if (!(firstElement instanceof IFile)) {
+			return;
+		}
+		
+		IFile file = (IFile) firstElement;
+		
+		if (FileUtil.isHistoryFile(file)) {
+			selectedFile = file;
+		}		
+	}
+
+	@Override
+	public void init(IViewPart view) {
+		// TODO Auto-generated method stub
+		
+	}
+}
