Bug 500515 - Fix ECore bundle when commiting simple data type

Change-Id: I73825c4388e5bc770d441c2f465b59b592528edd
diff --git a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/changeTracking/notification/filter/FilterStack.java b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/changeTracking/notification/filter/FilterStack.java
index a206a02..1c4accb 100644
--- a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/changeTracking/notification/filter/FilterStack.java
+++ b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/changeTracking/notification/filter/FilterStack.java
@@ -37,7 +37,7 @@
 	private static final String NOTIFICATION_FILTER_EXTENSION_ID = "org.eclipse.emf.emfstore.client.notificationFilter"; //$NON-NLS-1$
 
 	private static final ESNotificationFilter[] DEFAULT_STACK = { new TouchFilter(), new TransientFilter(),
-		new UnknownEventTypeFilter(), new EmptyRemovalsFilter(), new IgnoreDatatypeFilter(),
+		new UnknownEventTypeFilter(), new EmptyRemovalsFilter(), // new IgnoreDatatypeFilter(),
 		new IgnoreOutsideProjectReferencesFilter(), new IgnoreNullFeatureNotificationsFilter(),
 		new NotifiableIdEObjectCollectionFilter(), new IgnoreNotificationsOutsideProject() };
 
diff --git a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/impl/OperationRecorder.java b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/impl/OperationRecorder.java
index 58507b9..8e0340a 100644
--- a/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/impl/OperationRecorder.java
+++ b/bundles/org.eclipse.emf.emfstore.client/src/org/eclipse/emf/emfstore/internal/client/model/impl/OperationRecorder.java
@@ -35,15 +35,14 @@
 import org.eclipse.emf.ecore.EStructuralFeature.Setting;
 import org.eclipse.emf.ecore.InternalEObject;
 import org.eclipse.emf.ecore.util.EcoreUtil;
+import org.eclipse.emf.ecore.util.EcoreUtil.Copier;
 import org.eclipse.emf.emfstore.client.ESLocalProject;
 import org.eclipse.emf.emfstore.client.changetracking.ESCommandObserver;
 import org.eclipse.emf.emfstore.client.observer.ESCommitObserver;
 import org.eclipse.emf.emfstore.client.observer.ESPostCreationObserver;
 import org.eclipse.emf.emfstore.client.observer.ESShareObserver;
 import org.eclipse.emf.emfstore.client.observer.ESUpdateObserver;
-import org.eclipse.emf.emfstore.client.util.ESCopier;
 import org.eclipse.emf.emfstore.internal.client.model.CompositeOperationHandle;
-import org.eclipse.emf.emfstore.internal.client.model.Configuration;
 import org.eclipse.emf.emfstore.internal.client.model.ESWorkspaceProviderImpl;
 import org.eclipse.emf.emfstore.internal.client.model.ProjectSpace;
 import org.eclipse.emf.emfstore.internal.client.model.changeTracking.NotificationToOperationConverter;
@@ -403,14 +402,24 @@
 		final List<EObject> allContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(element, false);
 		allContainedModelElements.add(element);
 
-		final ESCopier copier = Configuration.getClientBehavior().getESCopierFor(element);
-		final EObject copiedElement = copier.copy(element);
+		final Copier copier = new Copier(true, false);
+		EObject copiedElement = copier.copy(element);
+		copier.copyReferences();
 
-		final List<EObject> copiedAllContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(
+		List<EObject> copiedAllContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(
 			copiedElement,
 			false);
 		copiedAllContainedModelElements.add(copiedElement);
 
+		if (allContainedModelElements.size() != copiedAllContainedModelElements.size()) {
+			copiedElement = EcoreUtil.copy(element);
+			copiedAllContainedModelElements = ModelUtil.getAllContainedModelElementsAsList(
+				copiedElement,
+				false);
+			copiedAllContainedModelElements.add(copiedElement);
+
+		}
+
 		for (int i = 0; i < allContainedModelElements.size(); i++) {
 			final EObject child = allContainedModelElements.get(i);
 
diff --git a/bundles/org.eclipse.emf.emfstore.common.model/src/org/eclipse/emf/emfstore/internal/common/model/util/ModelUtil.java b/bundles/org.eclipse.emf.emfstore.common.model/src/org/eclipse/emf/emfstore/internal/common/model/util/ModelUtil.java
index c9abff6..64f3736 100644
--- a/bundles/org.eclipse.emf.emfstore.common.model/src/org/eclipse/emf/emfstore/internal/common/model/util/ModelUtil.java
+++ b/bundles/org.eclipse.emf.emfstore.common.model/src/org/eclipse/emf/emfstore/internal/common/model/util/ModelUtil.java
@@ -398,6 +398,25 @@
 	 */
 	public static synchronized boolean isIgnoredDatatype(EObject eObject) {
 
+		return false;
+
+		// if (ignoredDataTypes == null) {
+		// ignoredDataTypes = new LinkedHashSet<String>();
+		// for (final ESExtensionElement element : new ESExtensionPoint(
+		// IGNORED_DATATYPE_EXT_POINT_ID,
+		// true).getExtensionElements()) {
+		// try {
+		// ignoredDataTypes.add(element.getAttribute("type")); //$NON-NLS-1$
+		// } catch (final ESExtensionPointException e) {
+		// }
+		// }
+		// }
+		//
+		// return ignoredDataTypes.contains(eObject.eClass().getInstanceClassName());
+	}
+
+	public static synchronized boolean isIgnoredDatatype2(EObject eObject) {
+
 		if (ignoredDataTypes == null) {
 			ignoredDataTypes = new LinkedHashSet<String>();
 			for (final ESExtensionElement element : new ESExtensionPoint(
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/.settings/.api_filters b/bundles/org.eclipse.emf.emfstore.ecore/.settings/.api_filters
index b59639b..280864a 100644
--- a/bundles/org.eclipse.emf.emfstore.ecore/.settings/.api_filters
+++ b/bundles/org.eclipse.emf.emfstore.ecore/.settings/.api_filters
@@ -1,18 +1,10 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.emf.emfstore.ecore" version="2">
-    <resource path="src/org/eclipse/emf/emfstore/internal/ecore/EDatatypeIdResolver.java" type="org.eclipse.emf.emfstore.internal.ecore.EDatatypeIdResolver">
-        <filter comment="internal API usage" id="574619656">
+    <resource path="src/org/eclipse/emf/emfstore/internal/ecore/ECoreElementsResolver.java" type="org.eclipse.emf.emfstore.internal.ecore.ECoreElementsResolver">
+        <filter id="574619656">
             <message_arguments>
                 <message_argument value="ESSingletonIdResolver"/>
-                <message_argument value="EDatatypeIdResolver"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="src/org/eclipse/emf/emfstore/internal/ecore/ETypeIdResolver.java" type="org.eclipse.emf.emfstore.internal.ecore.ETypeIdResolver">
-        <filter comment="internal API usage" id="574619656">
-            <message_arguments>
-                <message_argument value="ESSingletonIdResolver"/>
-                <message_argument value="ETypeIdResolver"/>
+                <message_argument value="ECoreElementsResolver"/>
             </message_arguments>
         </filter>
     </resource>
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/plugin.xml b/bundles/org.eclipse.emf.emfstore.ecore/plugin.xml
index af73ecd..5425d2d 100644
--- a/bundles/org.eclipse.emf.emfstore.ecore/plugin.xml
+++ b/bundles/org.eclipse.emf.emfstore.ecore/plugin.xml
@@ -2,12 +2,6 @@
 <?eclipse version="3.4"?>
 <plugin>
    <extension
-         point="org.eclipse.emf.emfstore.common.model.singletonIdResolver">
-	  <singletonidresolver
-            class="org.eclipse.emf.emfstore.internal.ecore.EDatatypeIdResolver">
-      </singletonidresolver>
-   </extension>
-   <extension
          point="org.eclipse.emf.emfstore.common.model.ignoreDatatype">
       <ignoredatatype
             type="org.eclipse.emf.ecore.EGenericType">
@@ -16,7 +10,7 @@
    <extension
          point="org.eclipse.emf.emfstore.common.model.singletonIdResolver">
       <singletonidresolver
-            class="org.eclipse.emf.emfstore.internal.ecore.ETypeIdResolver">
+            class="org.eclipse.emf.emfstore.internal.ecore.ECoreElementsResolver">
       </singletonidresolver>
    </extension>
    <extension
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ECoreElementsResolver.java b/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ECoreElementsResolver.java
new file mode 100644
index 0000000..a4e991c
--- /dev/null
+++ b/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ECoreElementsResolver.java
@@ -0,0 +1,82 @@
+/*******************************************************************************
+ * Copyright (c) 2012-2013 EclipseSource Muenchen GmbH and others.
+ *
+ * All rights reserved. This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License v1.0
+ * which accompanies this distribution, and is available at
+ * http://www.eclipse.org/legal/epl-v10.html
+ *
+ * Contributors:
+ ******************************************************************************/
+package org.eclipse.emf.emfstore.internal.ecore;
+
+import org.eclipse.emf.common.util.EList;
+import org.eclipse.emf.ecore.EClassifier;
+import org.eclipse.emf.ecore.EObject;
+import org.eclipse.emf.ecore.EcorePackage;
+import org.eclipse.emf.emfstore.common.model.ESModelElementId;
+import org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver;
+import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
+import org.eclipse.emf.emfstore.internal.common.model.ModelFactory;
+
+public class ECoreElementsResolver implements ESSingletonIdResolver {
+
+	/**
+	 * Constructor.
+	 */
+	public ECoreElementsResolver() {
+	}
+
+	/**
+	 *
+	 * {@inheritDoc}
+	 *
+	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#getSingleton(org.eclipse.emf.emfstore.common.model.ESModelElementId)
+	 */
+	public EObject getSingleton(ESModelElementId singletonId) {
+		if (singletonId == null) {
+			return null;
+		}
+
+		final String id = singletonId.getId();
+
+		// TODO: build up cache
+		final EList<EClassifier> eClassifiers = EcorePackage.eINSTANCE.getEClassifiers();
+		for (final EClassifier eClassifier : eClassifiers) {
+			if (eClassifier.getName().equals(id)) {
+				return eClassifier;
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 *
+	 * {@inheritDoc}
+	 *
+	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#getSingletonModelElementId(org.eclipse.emf.ecore.EObject)
+	 */
+	public ESModelElementId getSingletonModelElementId(EObject singleton) {
+		if (singleton == null || !isSingleton(singleton) || !EClassifier.class.isInstance(singleton)) {
+			return null;
+		}
+
+		final EClassifier eClassifier = EClassifier.class.cast(singleton);
+		final ModelElementId id = ModelFactory.eINSTANCE.createModelElementId();
+		id.setId(eClassifier.getName());
+
+		return id.toAPI();
+	}
+
+	/**
+	 *
+	 * {@inheritDoc}
+	 *
+	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#isSingleton(org.eclipse.emf.ecore.EObject)
+	 */
+	public boolean isSingleton(EObject eDataType) {
+		return eDataType.eContainer() == EcorePackage.eINSTANCE;
+	}
+
+}
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EDatatypeIdResolver.java b/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EDatatypeIdResolver.java
deleted file mode 100644
index f305250..0000000
--- a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EDatatypeIdResolver.java
+++ /dev/null
@@ -1,134 +0,0 @@
-/*******************************************************************************
- * 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:
- * emueller
- ******************************************************************************/
-package org.eclipse.emf.emfstore.internal.ecore;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EDataType;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.emfstore.common.model.ESModelElementId;
-import org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver;
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.ModelFactory;
-
-/**
- * An implementation of a {@link ESSingletonIdResolver} that treats all {@link EDataType}s as singletons.
- *
- * @author emueller
- *
- */
-public class EDatatypeIdResolver implements ESSingletonIdResolver {
-
-	private final Map<String, EDataType> datatypes = new LinkedHashMap<String, EDataType>();
-
-	/**
-	 * Default constructor.
-	 */
-	public EDatatypeIdResolver() {
-		datatypes.put("Literal", EcorePackage.eINSTANCE.getEString()); //$NON-NLS-1$
-		// String
-		datatypes.put("String", EcorePackage.eINSTANCE.getEString()); //$NON-NLS-1$
-		datatypes.put("EString", EcorePackage.eINSTANCE.getEString()); //$NON-NLS-1$
-		// Date
-		datatypes.put("Date", EcorePackage.eINSTANCE.getEDate()); //$NON-NLS-1$
-		datatypes.put("EDate", EcorePackage.eINSTANCE.getEDate()); //$NON-NLS-1$
-		// integer
-		datatypes.put("Int", EcorePackage.eINSTANCE.getEInt()); //$NON-NLS-1$
-		datatypes.put("EInt", EcorePackage.eINSTANCE.getEInt()); //$NON-NLS-1$
-		datatypes.put("Integer", EcorePackage.eINSTANCE.getEIntegerObject()); //$NON-NLS-1$
-		datatypes.put("EInteger", EcorePackage.eINSTANCE.getEIntegerObject()); //$NON-NLS-1$
-		datatypes.put("EIntegerObject", EcorePackage.eINSTANCE.getEIntegerObject()); //$NON-NLS-1$
-		// double
-		datatypes.put("Double", EcorePackage.eINSTANCE.getEDouble()); //$NON-NLS-1$
-		datatypes.put("EDouble", EcorePackage.eINSTANCE.getEDouble()); //$NON-NLS-1$
-		datatypes.put("EDoubleObject", EcorePackage.eINSTANCE.getEDoubleObject()); //$NON-NLS-1$
-		// long
-		datatypes.put("Long", EcorePackage.eINSTANCE.getELong()); //$NON-NLS-1$
-		datatypes.put("ELong", EcorePackage.eINSTANCE.getELong()); //$NON-NLS-1$
-		datatypes.put("ELongObject", EcorePackage.eINSTANCE.getELongObject()); //$NON-NLS-1$
-		// float
-		datatypes.put("Float", EcorePackage.eINSTANCE.getEFloat()); //$NON-NLS-1$
-		datatypes.put("EFloat", EcorePackage.eINSTANCE.getEFloat()); //$NON-NLS-1$
-		datatypes.put("EFloatObject", EcorePackage.eINSTANCE.getEFloatObject()); //$NON-NLS-1$
-		// short
-		datatypes.put("Short", EcorePackage.eINSTANCE.getEShort()); //$NON-NLS-1$
-		datatypes.put("EShort", EcorePackage.eINSTANCE.getEShort()); //$NON-NLS-1$
-		datatypes.put("EShortObject", EcorePackage.eINSTANCE.getEShortObject()); //$NON-NLS-1$
-		// boolean
-		datatypes.put("Boolean", EcorePackage.eINSTANCE.getEBoolean()); //$NON-NLS-1$
-		datatypes.put("EBoolean", EcorePackage.eINSTANCE.getEBoolean()); //$NON-NLS-1$
-		datatypes.put("EBooleanObject", EcorePackage.eINSTANCE.getEBooleanObject()); //$NON-NLS-1$
-		// byte
-		datatypes.put("Byte", EcorePackage.eINSTANCE.getEByte()); //$NON-NLS-1$
-		datatypes.put("EByte", EcorePackage.eINSTANCE.getEByte()); //$NON-NLS-1$
-		datatypes.put("EByteObject", EcorePackage.eINSTANCE.getEByteObject()); //$NON-NLS-1$
-		datatypes.put("EByteArray", EcorePackage.eINSTANCE.getEByteArray()); //$NON-NLS-1$
-		// char
-		datatypes.put("EChar", EcorePackage.eINSTANCE.getEChar()); //$NON-NLS-1$
-		datatypes.put("ECharacterObject", EcorePackage.eINSTANCE.getECharacterObject()); //$NON-NLS-1$
-		datatypes.put("EBigDecimal", EcorePackage.eINSTANCE.getEBigDecimal()); //$NON-NLS-1$
-		datatypes.put("EBigInteger", EcorePackage.eINSTANCE.getEBigInteger()); //$NON-NLS-1$
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public EObject getSingleton(ESModelElementId singletonId) {
-
-		if (singletonId == null) {
-			return null;
-		}
-
-		return datatypes.get(singletonId.getId());
-	}
-
-	/**
-	 * {@inheritDoc}
-	 *
-	 * @return the {@link ESModelElementId} of the the singleton object or <code>null</code> if the given
-	 *         {@link EObject} is not a singleton, is not an instance of {@link EDataType} or is <code>null</code>
-	 */
-	public ESModelElementId getSingletonModelElementId(EObject singleton) {
-
-		if (!EDataType.class.isInstance(singleton)) {
-			return null;
-		}
-
-		// TODO: EM, provide 2nd map for performance reasons
-		for (final Map.Entry<String, EDataType> entry : datatypes.entrySet()) {
-			if (entry.getValue() != singleton) {
-				continue;
-			}
-
-			// TODO: don't create IDs on the fly rather put them directly into the map
-			final ModelElementId id = ModelFactory.eINSTANCE.createModelElementId();
-			id.setId(entry.getKey());
-			return id.toAPI();
-		}
-
-		return null;
-	}
-
-	/**
-	 * {@inheritDoc}
-	 */
-	public boolean isSingleton(EObject eDataType) {
-
-		if (!EDataType.class.isInstance(eDataType)) {
-			return false;
-		}
-
-		return datatypes.containsValue(eDataType);
-	}
-}
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ETypeIdResolver.java b/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ETypeIdResolver.java
deleted file mode 100644
index 4b1756dd..0000000
--- a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/ETypeIdResolver.java
+++ /dev/null
@@ -1,99 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2012-2013 EclipseSource Muenchen GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- ******************************************************************************/
-package org.eclipse.emf.emfstore.internal.ecore;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-
-import org.eclipse.emf.ecore.EClass;
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.EcorePackage;
-import org.eclipse.emf.emfstore.common.model.ESModelElementId;
-import org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver;
-import org.eclipse.emf.emfstore.internal.common.model.ModelElementId;
-import org.eclipse.emf.emfstore.internal.common.model.ModelFactory;
-
-/**
- *
- *
- */
-public class ETypeIdResolver implements ESSingletonIdResolver {
-
-	private final Map<String, EClass> datatypes = new LinkedHashMap<String, EClass>();
-
-	/**
-	 * Constructor.
-	 */
-	public ETypeIdResolver() {
-		// eclass stuff
-		datatypes.put("EClass", EcorePackage.eINSTANCE.getEClass()); //$NON-NLS-1$
-		datatypes.put("EStructuralFeature", EcorePackage.eINSTANCE.getEStructuralFeature()); //$NON-NLS-1$
-		datatypes.put("EGenericType", EcorePackage.eINSTANCE.getEGenericType()); //$NON-NLS-1$
-		datatypes.put("EPackage", EcorePackage.eINSTANCE.getEPackage()); //$NON-NLS-1$
-	}
-
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#getSingleton(org.eclipse.emf.emfstore.common.model.ESModelElementId)
-	 */
-	public EObject getSingleton(ESModelElementId singletonId) {
-		if (singletonId == null) {
-			return null;
-		}
-
-		return datatypes.get(singletonId.getId());
-	}
-
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#getSingletonModelElementId(org.eclipse.emf.ecore.EObject)
-	 */
-	public ESModelElementId getSingletonModelElementId(EObject singleton) {
-		if (!isSingleton(singleton) || singleton == null) {
-			return null;
-		}
-
-		// TODO: EM, provide 2nd map for performance reasons
-		for (final Map.Entry<String, EClass> entry : datatypes.entrySet()) {
-			if (!entry.getValue().isInstance(singleton)) {
-				continue;
-			}
-
-			// TODO: don't create IDs on the fly rather put them directly into the map
-			final ModelElementId id = ModelFactory.eINSTANCE.createModelElementId();
-			id.setId(entry.getKey());
-			return id.toAPI();
-		}
-
-		return null;
-	}
-
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.emfstore.common.model.ESSingletonIdResolver#isSingleton(org.eclipse.emf.ecore.EObject)
-	 */
-	public boolean isSingleton(EObject eDataType) {
-		for (final EClass eClass : datatypes.values()) {
-			if (eClass.isInstance(eDataType)) {
-				return true;
-			}
-		}
-
-		return false;
-	}
-
-}
diff --git a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EcoreCopier.java b/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EcoreCopier.java
deleted file mode 100644
index 449f63e..0000000
--- a/bundles/org.eclipse.emf.emfstore.ecore/src/org/eclipse/emf/emfstore/internal/ecore/EcoreCopier.java
+++ /dev/null
@@ -1,51 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2016 EclipseSource Muenchen GmbH and others.
- *
- * All rights reserved. This program and the accompanying materials
- * are made available under the terms of the Eclipse Public License v1.0
- * which accompanies this distribution, and is available at
- * http://www.eclipse.org/legal/epl-v10.html
- *
- * Contributors:
- * Edgar Mueller - initial API and implementation
- ******************************************************************************/
-package org.eclipse.emf.emfstore.internal.ecore;
-
-import org.eclipse.emf.ecore.EObject;
-import org.eclipse.emf.ecore.ETypedElement;
-import org.eclipse.emf.ecore.util.EcoreUtil;
-import org.eclipse.emf.emfstore.client.util.ESCopier;
-import org.eclipse.emf.emfstore.internal.common.model.util.ModelUtil;
-
-/**
- * Copier responsible for copying {@link EObject}s that are considered
- * 'Singletons', that is, {@link ETypedElement}, by EMFStore.
- *
- *
- */
-public class EcoreCopier implements ESCopier {
-
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.emfstore.client.util.ESCopier#shouldHandle(org.eclipse.emf.ecore.EObject)
-	 */
-	public int shouldHandle(EObject eObject) {
-		if (ModelUtil.isSingleton(eObject)) {
-			return 1;
-		}
-		return -1;
-	}
-
-	/**
-	 *
-	 * {@inheritDoc}
-	 *
-	 * @see org.eclipse.emf.emfstore.client.util.ESCopier#copy(org.eclipse.emf.ecore.EObject)
-	 */
-	public EObject copy(EObject eObject) {
-		return EcoreUtil.copy(eObject);
-	}
-
-}
diff --git a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/impl/CreateDeleteOperationImpl.java b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/impl/CreateDeleteOperationImpl.java
index ae5826c..4722478 100644
--- a/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/impl/CreateDeleteOperationImpl.java
+++ b/bundles/org.eclipse.emf.emfstore.server.model/src/org/eclipse/emf/emfstore/internal/server/model/versioning/operations/impl/CreateDeleteOperationImpl.java
@@ -117,7 +117,7 @@
 				final EObject copiedChild = copiedAllContainedModelElements.get(i);
 				final ModelElementId childId = ModelUtil.clone(getEObjectToIdMap().get(child));
 
-				if (ModelUtil.isIgnoredDatatype(child)) {
+				if (ModelUtil.isIgnoredDatatype2(child) && childId == null) {
 					continue;
 				}