diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
index 6528627d0e7080452827f8b70b87c34c78ac6c57..18c994e454a75bb17ea1e69777778d9592e18eab 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/DatabaseUtils.java
@@ -87,19 +87,19 @@ public class DatabaseUtils {
 
   private static void processPropertiesStage1(
       final List<Property> stage1Inserts, final Property p, final EntityInterface e) {
-
     if (!p.isDescOverride()
         && !p.isNameOverride()
         && !p.isDatatypeOverride()
         && (!p.hasProperties() || hasUniquePropertyId(p, e))
         && !(p.getDatatype() instanceof AbstractCollectionDatatype)) {
       stage1Inserts.add(p);
+      processSubPropertiesStage1(stage1Inserts, p);
     } else {
       Replacement r = new Replacement(p);
       stage1Inserts.add(r);
       stage1Inserts.add(r.replacement);
+      processSubPropertiesStage1(stage1Inserts, r);
     }
-    processSubPropertiesStage1(stage1Inserts, p);
   }
 
   public static void deriveStage2Inserts(
@@ -107,21 +107,24 @@ public class DatabaseUtils {
       final List<Property> stage1Inserts,
       Deque<EntityID> replacementIds,
       EntityInterface entity) {
+    Map<String, EntityInterface> replacements = new HashMap<>();
     for (final Property p : stage1Inserts) {
       if (p instanceof Replacement) {
+        if (!p.hasId() || p.getId().isTemporary()) {
+          EntityID replacementId = replacementIds.pop();
+          replacements.put(replacementId.toString(), p);
+          ((Replacement) p).setReplacementId(replacementId);
+        }
+      }
+    }
 
-        EntityID replacementId = replacementIds.pop();
-        ((Replacement) p).setReplacementId(replacementId);
-
-        if (p.hasProperties()) {
-          for (Property subP : p.getProperties()) {
-            subP.setDomain(p);
-            stage2Inserts.add(subP);
-          }
+    for (final Property p : stage1Inserts) {
+      if (p.hasProperties()) {
+        if (p instanceof Replacement && ((Replacement) p).isState2Replacement()) {
+          stage2Inserts.add(((Replacement) p).replacement);
         }
-      } else {
-        if (p.hasProperties()) {
-          for (Property subP : p.getProperties()) {
+        for (Property subP : p.getProperties()) {
+          if (!subP.hasProperties()) {
             stage2Inserts.add(subP);
           }
         }
@@ -142,9 +145,13 @@ public class DatabaseUtils {
   private static void processSubPropertiesStage1(
       final List<Property> stage1Inserts, final EntityInterface p) {
     for (final Property subP : p.getProperties()) {
+      subP.setDomain(p);
       if (subP.hasProperties()) {
-        stage1Inserts.add(new Replacement(subP));
-        processSubPropertiesStage1(stage1Inserts, subP);
+        Replacement r = new Replacement(subP);
+        r.replacement.setDomain(p);
+        r.setStage2Replacement(true);
+        stage1Inserts.add(r);
+        processSubPropertiesStage1(stage1Inserts, r);
       }
     }
   }
@@ -164,9 +171,10 @@ public class DatabaseUtils {
           if (desc != null) {
             p.desc = desc;
           }
-          final String type = bytes2UTF8(rs.getBytes("type_override"));
-          if (type != null) {
-            p.type = type;
+          final String type_id = bytes2UTF8(rs.getBytes("type_id_override"));
+          if (type_id != null) {
+            p.type_id = type_id;
+            p.type_name = bytes2UTF8(rs.getBytes("type_name_override"));
           }
           final String coll = bytes2UTF8(rs.getBytes("collection_override"));
           if (coll != null) {
@@ -221,7 +229,8 @@ public class DatabaseUtils {
     final SparseEntity ret = parseNameRoleACL(rs);
     ret.id = rs.getString("EntityID");
     ret.description = bytes2UTF8(rs.getBytes("EntityDesc"));
-    ret.datatype = bytes2UTF8(rs.getBytes("Datatype"));
+    ret.datatype_id = bytes2UTF8(rs.getBytes("DatatypeID"));
+    ret.datatype_name = bytes2UTF8(rs.getBytes("DatatypeName"));
     ret.collection = bytes2UTF8(rs.getBytes("Collection"));
 
     ret.filePath = bytes2UTF8(rs.getBytes("FilePath"));
@@ -300,6 +309,14 @@ public class DatabaseUtils {
       if (pp.status.equals(ReplacementStatus.REPLACEMENT.name())) {
         replacements.put(pp.value, null);
       }
+      if (pp.subProperties != null) {
+        for (ProtoProperty subP : pp.subProperties) {
+          if (subP.status.equals(ReplacementStatus.REPLACEMENT.name())) {
+
+            replacements.put(subP.value, null);
+          }
+        }
+      }
     }
     Iterator<ProtoProperty> iterator = properties.iterator();
     while (iterator.hasNext()) {
@@ -325,6 +342,13 @@ public class DatabaseUtils {
       if (pp.status.equals(ReplacementStatus.REPLACEMENT.name())) {
         replace(pp, replacements.get(pp.value), isHead);
       }
+      if (pp.subProperties != null) {
+        for (ProtoProperty subP : pp.subProperties) {
+          if (subP.status.equals(ReplacementStatus.REPLACEMENT.name())) {
+            replace(subP, replacements.get(subP.value), isHead);
+          }
+        }
+      }
       if (pp.collValues != null) {
         // sort
         pp.collValues.sort(
@@ -358,7 +382,8 @@ public class DatabaseUtils {
     }
     pp.desc = replacement.desc;
     pp.name = replacement.name;
-    pp.type = replacement.type;
+    pp.type_id = replacement.type_id;
+    pp.type_name = replacement.type_name;
     pp.collection = replacement.collection;
     pp.value = replacement.value;
     pp.collValues = replacement.collValues;
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
index 4260ae03e76eec7fab1e33957a00dedc2ef77e17..40c7a40754d823ce20580b671147c9cf21576af7 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityDatatype.java
@@ -62,7 +62,7 @@ public class MySQLInsertEntityDatatype extends MySQLTransaction
           prepareStatement(STMT_INSERT_ENTITY_DATATYPE);
 
       insertEntityDatatypeStmt.setString(1, entity.id);
-      insertEntityDatatypeStmt.setString(2, entity.datatype);
+      insertEntityDatatypeStmt.setString(2, entity.datatype_id);
 
       insertEntityDatatypeStmt.execute();
 
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
index cef624dce3a022043a2f86e56acd6ca589d493d1..d303acca337cf196ddd251666d71ccb2d21ee21c 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertEntityProperties.java
@@ -113,7 +113,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
       stmt.setString(7, fp.status);
       stmt.setString(8, fp.name);
       stmt.setString(9, fp.desc);
-      stmt.setString(10, fp.type);
+      stmt.setString(10, fp.type_id);
       stmt.setString(11, fp.collection);
       stmt.setInt(12, fp.idx);
       stmt.execute();
@@ -207,7 +207,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
         }
         if (property.isDatatypeOverride()) {
           if (property.getDatatype() instanceof AbstractCollectionDatatype) {
-            fp.type =
+            fp.type_id =
                 ((AbstractCollectionDatatype) property.getDatatype())
                     .getDatatype()
                     .getId()
@@ -215,7 +215,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
             fp.collection =
                 ((AbstractCollectionDatatype) property.getDatatype()).getCollectionName();
           } else {
-            fp.type = property.getDatatype().getId().toString();
+            fp.type_id = property.getDatatype().getId().toString();
           }
         }
       }
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
index 8d2af662f32d2f5a788d6470cf6cd526e15d0976..0957ab539e74b960e5e384ba395bef7156cbda97 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLUpdateSparseEntity.java
@@ -69,8 +69,8 @@ public class MySQLUpdateSparseEntity extends MySQLTransaction implements UpdateS
       updateEntityStmt.setString(2, spe.name);
       updateEntityStmt.setString(3, spe.description);
       updateEntityStmt.setString(4, spe.role);
-      if (spe.datatype != null) {
-        updateEntityStmt.setString(5, spe.datatype);
+      if (spe.datatype_id != null) {
+        updateEntityStmt.setString(5, spe.datatype_id);
       } else {
         updateEntityStmt.setNull(5, Types.VARCHAR);
       }
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java
index 8ec47231d7d3644bc4c21a2b2125175a75f4bc97..fbe2f57e1cdc7868dac239313f7579011e23e868 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/Replacement.java
@@ -41,12 +41,18 @@ enum ReplacementStatus implements StatementStatusInterface {
 public class Replacement extends Property {
 
   public Property replacement;
+  private boolean state2Replacement;
 
   @Override
   public EntityID getId() {
     return replacement.getId();
   }
 
+  @Override
+  public boolean hasId() {
+    return replacement.hasId();
+  }
+
   public void setReplacementId(EntityID id) {
     replacement.getId().link(id);
   }
@@ -55,10 +61,18 @@ public class Replacement extends Property {
     super(p);
     replacement = new Property(new RetrieveEntity());
 
-    replacement.setDomain(p.getDomainEntity());
+    replacement.setDomain(p);
     replacement.setId(new EntityID());
     replacement.setStatementStatus(ReplacementStatus.REPLACEMENT);
     replacement.setValue(new ReferenceValue(p.getId()));
-    replacement.setPIdx(0);
+    replacement.setPIdx(p.getPIdx());
+  }
+
+  public void setStage2Replacement(boolean t) {
+    this.state2Replacement = t;
+  }
+
+  public boolean isState2Replacement() {
+    return state2Replacement;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
index b2123ce206ce01acee3ef70b1c22151b94f59bd9..ecb49147474e156ea3f560edc3e039f8181dd0ca 100644
--- a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
+++ b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
@@ -33,6 +33,7 @@ public class FlatProperty implements Serializable {
   public Integer idx = null;
   public String name = null;
   public String desc = null;
-  public String type = null;
+  public String type_id = null;
+  public String type_name = null;
   public String collection = null;
 }
diff --git a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
index d2292c58825ac6807e24f3ad3d086b29dd8a6e7e..f4ff2d41c46ceec3b408b980df906fdc8d10553f 100644
--- a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
@@ -33,7 +33,8 @@ public class SparseEntity extends VerySparseEntity {
   private static final long serialVersionUID = -560259468853956476L;
 
   public String collection = null;
-  public String datatype = null;
+  public String datatype_id = null;
+  public String datatype_name = null;
   public String fileHash = null;
   public String filePath = null;
   public Long fileSize = null;
@@ -48,7 +49,8 @@ public class SparseEntity extends VerySparseEntity {
         .append(this.description)
         .append(this.role)
         .append(this.collection)
-        .append(this.datatype)
+        .append(this.datatype_id)
+        .append(this.datatype_name)
         .append(this.fileHash)
         .append(this.filePath)
         .append(this.fileSize)
diff --git a/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java
index cbd822ee10a24127483fae9adff440404a243771..1d816947d642e2ccb6f9867ced4478ea9a59c2d3 100644
--- a/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java
@@ -25,6 +25,7 @@ package org.caosdb.server.datatype;
 import java.util.HashMap;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
+import org.caosdb.server.entity.EntityID;
 
 public abstract class AbstractCollectionDatatype extends AbstractDatatype {
 
@@ -50,7 +51,7 @@ public abstract class AbstractCollectionDatatype extends AbstractDatatype {
     if (matcher.matches()) {
       final String col = matcher.group(1).toUpperCase();
       final String type = matcher.group(2);
-      return collectionDatatypeFactory(col, type);
+      return collectionDatatypeFactory(col, null, type);
     }
     return null;
   }
@@ -73,7 +74,9 @@ public abstract class AbstractCollectionDatatype extends AbstractDatatype {
   }
 
   public static AbstractCollectionDatatype collectionDatatypeFactory(
-      final String col, final String dt) {
-    return instances.get(col).createDataType(AbstractDatatype.datatypeFactory(dt));
+      final String col, final String id, String name) {
+    return instances
+        .get(col)
+        .createDataType(AbstractDatatype.datatypeFactory(new EntityID(id), name));
   }
 }
diff --git a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
index 583145fb19361adf08ae81bf8c9e338d53ad908f..795ac56dbb1df24f38964edc5eac47e491199c37 100644
--- a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
@@ -65,6 +65,24 @@ public abstract class AbstractDatatype {
     return ret;
   }
 
+  public static AbstractDatatype datatypeFactory(final EntityID id, String name) {
+    AbstractDatatype dt;
+    if (id.hasId()) {
+      dt = datatypeFactory(id);
+
+      if (name != null) {
+        dt.setName(name);
+      }
+    } else {
+      dt = AbstractDatatype.datatypeFactory(name);
+    }
+    return dt;
+  }
+
+  protected void setName(String name) {
+    this.name = name;
+  }
+
   public static AbstractDatatype datatypeFactory(final EntityID datatype) {
     for (final AbstractDatatype abstractDatatype : instances.values()) {
       if (abstractDatatype.getId().equals(datatype)) {
@@ -121,6 +139,6 @@ public abstract class AbstractDatatype {
 
   @Override
   public String toString() {
-    return "DT." + getName();
+    return "DT." + (getName() != null ? getName() : getId().toString());
   }
 }
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
index 503e4679335381da6c08b746af8ed14665bd409b..cbc080b92b1220b21a36da43aecfd9434515420f 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
@@ -30,6 +30,10 @@ public class ReferenceDatatype2 extends ReferenceDatatype {
 
   private final ReferenceValue refid;
 
+  public ReferenceDatatype2(final EntityID entity) {
+    refid = ReferenceValue.parseReference(entity);
+  }
+
   public ReferenceDatatype2(final Object entity) {
     try {
       this.refid = ReferenceValue.parseReference(entity);
@@ -56,6 +60,11 @@ public class ReferenceDatatype2 extends ReferenceDatatype {
     return this.refid.getName();
   }
 
+  @Override
+  protected void setName(String name) {
+    this.refid.setName(name);
+  }
+
   @Override
   public boolean equals(final Object obj) {
     if (obj instanceof ReferenceDatatype2) {
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
index e07b1b807c3226cb5bc074aeafd4d8c712ce2ec1..1a1c33ffe4ebafca0ca6e3011740a2d789750671 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
@@ -55,6 +55,10 @@ public class ReferenceValue implements SingleValue {
   private String version = null;
   private boolean versioned = false;
 
+  public static ReferenceValue parseReference(final EntityID reference) {
+    return new ReferenceValue(reference);
+  }
+
   public static ReferenceValue parseReference(final Object reference) throws Message {
     if (reference == null) {
       return null;
@@ -70,11 +74,7 @@ public class ReferenceValue implements SingleValue {
     } else if (reference instanceof CollectionValue) {
       throw ServerMessages.DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES;
     } else {
-      try {
-        return new ReferenceValue(reference.toString());
-      } catch (final NumberFormatException e) {
-        return new ReferenceValue(reference.toString());
-      }
+      return new ReferenceValue(reference.toString());
     }
   }
 
@@ -242,4 +242,8 @@ public class ReferenceValue implements SingleValue {
     }
     return false;
   }
+
+  public void setName(String name) {
+    this.name = name;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index b27eaa28e5111d783d1d8d3779f36a1938898173..8179375d8f4671f721969e0103a427077ca8e027 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -200,7 +200,6 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     } else {
       setDatatype(AbstractDatatype.datatypeFactory(datatype));
     }
-    notifyObservers(DATATYPE_CHANGED_EVENT);
   }
 
   @Override
@@ -367,9 +366,12 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     if (hasDatatype()) {
       if (getDatatype() instanceof AbstractCollectionDatatype) {
         ret.collection = ((AbstractCollectionDatatype) getDatatype()).getCollectionName();
-        ret.datatype = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName();
+        ret.datatype_id =
+            ((AbstractCollectionDatatype) getDatatype()).getDatatype().getId().toString();
+        ret.datatype_name = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName();
       } else {
-        ret.datatype = getDatatype().getName();
+        ret.datatype_id = getDatatype().getId().toString();
+        ret.datatype_name = getDatatype().getName();
       }
     }
     if (hasFileProperties()) {
@@ -728,7 +730,13 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
         // Parse sub elements which represent PROPERTIES of this
         // record.
 
-        final Property property = new Property(new WritableEntity(pe, Role.Property));
+        WritableEntity wrapped;
+        if (this instanceof InsertEntity) {
+          wrapped = new InsertEntity(pe, Role.Property);
+        } else {
+          wrapped = new UpdateEntity(pe, Role.Property);
+        }
+        final Property property = new Property(wrapped);
 
         // Ignore parents of properties
         property.getParents().clear();
@@ -737,7 +745,13 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
       } else if (pe.getName().equalsIgnoreCase("Parent")) {
         // Parse sub elements which represent PARENTS of this
         // record.
-        final Parent parent = new Parent(new WritableEntity(pe, null));
+        WritableEntity wrapped;
+        if (this instanceof InsertEntity) {
+          wrapped = new InsertEntity(pe, null);
+        } else {
+          wrapped = new UpdateEntity(pe, null);
+        }
+        final Parent parent = new Parent(wrapped);
         addParent(parent);
       } else if (pe.getName().equalsIgnoreCase("EntityACL")) {
         // Parse and concatenate EntityACL
@@ -953,18 +967,14 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     if (!isDescOverride()) {
       setDescription(spe.description);
     }
-    if (!isDatatypeOverride()) {
-      final String dt = spe.datatype;
-      final String col = spe.collection;
-
-      if (dt != null
-          && !dt.equalsIgnoreCase("null")
-          && (!hasDatatype() || !dt.equalsIgnoreCase(getDatatype().toString()))) {
-        if (col != null && !col.equalsIgnoreCase("null")) {
-          this.setDatatype(AbstractCollectionDatatype.collectionDatatypeFactory(col, dt));
-        } else {
-          this.setDatatype(dt);
-        }
+    if (!isDatatypeOverride() && spe.datatype_id != null) {
+      if (spe.collection != null) {
+        this.setDatatype(
+            AbstractCollectionDatatype.collectionDatatypeFactory(
+                spe.collection, spe.datatype_id, spe.datatype_name));
+      } else {
+        this.setDatatype(
+            AbstractDatatype.datatypeFactory(new EntityID(spe.datatype_id), spe.datatype_name));
       }
     }
 
diff --git a/src/main/java/org/caosdb/server/entity/EntityID.java b/src/main/java/org/caosdb/server/entity/EntityID.java
index 9f61127db2969578300fbe2f12091c0f9f258d90..5f6c4667bc3eba056a036d718a350aa032bcb8f0 100644
--- a/src/main/java/org/caosdb/server/entity/EntityID.java
+++ b/src/main/java/org/caosdb/server/entity/EntityID.java
@@ -59,7 +59,7 @@ public class EntityID implements Serializable {
     return this.id;
   }
 
-  boolean hasId() {
+  public boolean hasId() {
     return this.id != null || this.link != null && this.link.hasId();
   }
 
diff --git a/src/main/java/org/caosdb/server/entity/WritableEntity.java b/src/main/java/org/caosdb/server/entity/WritableEntity.java
index 6c967cc4e3404c7940066dc123bf805785a6e4c3..b17a54b9a68ebcdf21d8e67b9c31b0f7d59d02e8 100644
--- a/src/main/java/org/caosdb/server/entity/WritableEntity.java
+++ b/src/main/java/org/caosdb/server/entity/WritableEntity.java
@@ -23,7 +23,7 @@ package org.caosdb.server.entity;
 
 import org.jdom2.Element;
 
-public class WritableEntity extends Entity {
+public abstract class WritableEntity extends Entity {
 
   public WritableEntity(final Element element, Role role) {
     super();
diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Property.java b/src/main/java/org/caosdb/server/entity/wrapper/Property.java
index 9268d7f3cb327a70a4cca872657d72e2779fc344..4d2b8e25b8e7518822b13c08ef04623e74d37a29 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java
@@ -27,6 +27,7 @@ import org.apache.shiro.authz.Permission;
 import org.apache.shiro.subject.Subject;
 import org.caosdb.server.database.proto.ProtoProperty;
 import org.caosdb.server.datatype.AbstractCollectionDatatype;
+import org.caosdb.server.datatype.AbstractDatatype;
 import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.GenericValue;
 import org.caosdb.server.entity.EntityID;
@@ -86,12 +87,13 @@ public class Property extends EntityWrapper {
       setDescription(pp.desc);
       setDescOverride(true);
     }
-    if (pp.type != null) {
+    if (pp.type_id != null) {
       if (pp.collection != null) {
         this.setDatatype(
-            AbstractCollectionDatatype.collectionDatatypeFactory(pp.collection, pp.type));
+            AbstractCollectionDatatype.collectionDatatypeFactory(
+                pp.collection, pp.type_id, pp.type_name));
       } else {
-        this.setDatatype(pp.type);
+        this.setDatatype(AbstractDatatype.datatypeFactory(new EntityID(pp.type_id), pp.type_name));
       }
       setDatatypeOverride(true);
     }
diff --git a/src/main/java/org/caosdb/server/jobs/JobConfig.java b/src/main/java/org/caosdb/server/jobs/JobConfig.java
index b2bb0d4a1b13a98dd68893c9f0cad7bc8192edba..83300e00d4be7c463f4b92f4fdbb521c17739a7b 100644
--- a/src/main/java/org/caosdb/server/jobs/JobConfig.java
+++ b/src/main/java/org/caosdb/server/jobs/JobConfig.java
@@ -36,7 +36,7 @@ import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.container.TransactionContainer;
-import org.caosdb.server.entity.wrapper.Property;
+import org.caosdb.server.entity.wrapper.EntityWrapper;
 import org.caosdb.server.jobs.core.JobFailureSeverity;
 import org.caosdb.server.transaction.Transaction;
 import org.caosdb.server.utils.ConfigurationException;
@@ -173,8 +173,8 @@ public class JobConfig {
       final EntityInterface target,
       final Transaction<? extends TransactionContainer> transaction) {
     String transactionType;
-    if (target instanceof Property) {
-      transactionType = getTransactionType(((Property) target).getDomainEntity());
+    if (target instanceof EntityWrapper) {
+      transactionType = getTransactionType(((EntityWrapper) target).getWrapped());
     } else {
       transactionType = getTransactionType(target);
     }
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
index b3a06ca09d7870da843a2f3ad295e019ab683c12..4a43d4a2985ad3607bb5cb9b2789acd085cc31e0 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
@@ -28,6 +28,7 @@ import org.caosdb.server.database.exceptions.EntityWasNotUniqueException;
 import org.caosdb.server.datatype.AbstractCollectionDatatype;
 import org.caosdb.server.datatype.AbstractDatatype;
 import org.caosdb.server.datatype.ReferenceDatatype2;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.Message;
@@ -115,7 +116,11 @@ public final class CheckDatatypePresent extends EntityJob {
   }
 
   private void checkReference2(final ReferenceDatatype2 datatype) throws Message {
-    EntityInterface datatypeEntity = resolve(datatype.getId(), datatype.getName(), (String) null);
+    EntityID datatypeId = datatype.getId();
+    if (datatypeId == null) {
+      datatypeId = new EntityID(datatype.getName());
+    }
+    EntityInterface datatypeEntity = resolve(datatypeId, datatype.getName(), (String) null);
 
     if (datatypeEntity == null) {
       throw ServerMessages.UNKNOWN_DATATYPE;
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
index 86e95542aaa0e6f373521149d9f7376f09d3972c..78d257eadf4fa1de4331bd9bf38855ca04ccdd9e 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
@@ -28,6 +28,7 @@ import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.IndexedSingleValue;
 import org.caosdb.server.datatype.ReferenceValue;
 import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.jobs.EntityJob;
@@ -80,7 +81,11 @@ public class CheckRefidValid extends EntityJob implements Observer {
   }
 
   private void checkRefValue(final ReferenceValue ref) throws Message {
-    EntityInterface referencedEntity = resolve(ref.getId(), ref.getName(), ref.getVersion());
+    EntityID refId = ref.getId();
+    if (refId == null) {
+      refId = new EntityID(ref.getName());
+    }
+    EntityInterface referencedEntity = resolve(refId, ref.getName(), ref.getVersion());
     if (referencedEntity == null) {
       throw ServerMessages.REFERENCED_ENTITY_DOES_NOT_EXIST;
     }
diff --git a/src/main/java/org/caosdb/server/transaction/Transaction.java b/src/main/java/org/caosdb/server/transaction/Transaction.java
index 69dde0ea3602a650e52dadcdbc0107ff7cf12ded..b460085db94864e9936a1b7d0e8c12e74555bb1f 100644
--- a/src/main/java/org/caosdb/server/transaction/Transaction.java
+++ b/src/main/java/org/caosdb/server/transaction/Transaction.java
@@ -197,7 +197,7 @@ public abstract class Transaction<C extends TransactionContainer> extends Abstra
       this.schedule.addAll(loadJobs);
 
       // additionally load datatype job
-      if (e.hasValue()) {
+      if (e.hasValue() || e.hasDatatype()) {
         this.schedule.add(new CheckDatatypePresent().init(JobFailureSeverity.ERROR, e, this));
       }
 
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
index b780d3d68f20cb6973c902cbe92fbd4fd46d51c1..939d0bf6473611cb1a0bb1ee28bfd91a568babd3 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -398,14 +398,17 @@ public class WriteTransaction extends Transaction<WritableContainer>
     }
 
     // new datatype?
-    if (newEntity.hasDatatype()
+    if ((newEntity.hasDatatype()
             && oldEntity.hasDatatype()
-            && !newEntity.getDatatype().equals(oldEntity.getDatatype())
+            && !newEntity.getDatatype().equals(oldEntity.getDatatype()))
         || newEntity.hasDatatype() ^ oldEntity.hasDatatype()) {
       needPermissions.add(EntityPermission.UPDATE_DATA_TYPE);
       updatetable = true;
     } else {
-      newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride());
+      if (oldEntity.hasDatatype()) {
+        newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride());
+        newEntity.setDatatype(oldEntity.getDatatype());
+      }
     }
 
     // entity role
diff --git a/src/test/java/org/caosdb/server/caching/TestCaching.java b/src/test/java/org/caosdb/server/caching/TestCaching.java
index 8ff05660afde6e67d65e94011b662f09bdda9294..90b642f17070e2f67312d533331ee7929117b447 100644
--- a/src/test/java/org/caosdb/server/caching/TestCaching.java
+++ b/src/test/java/org/caosdb/server/caching/TestCaching.java
@@ -26,6 +26,7 @@ import java.io.IOException;
 import org.apache.commons.jcs.JCS;
 import org.apache.commons.jcs.access.CacheAccess;
 import org.caosdb.server.CaosDBServer;
+import org.caosdb.server.ServerProperties;
 import org.caosdb.server.accessControl.Pam;
 import org.caosdb.server.database.backend.transaction.RetrieveProperties;
 import org.junit.jupiter.api.BeforeAll;
@@ -36,6 +37,7 @@ public class TestCaching {
   @BeforeAll
   public static void init() throws IOException {
     CaosDBServer.initServerProperties();
+    CaosDBServer.getServerProperties().setProperty(ServerProperties.KEY_CACHE_DISABLE, "FALSE");
     CaosDBServer.initCaching();
     JCSCacheHelper.init();
   }
diff --git a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
index feee1360bf7fa0ae865422b31d8a2ad2bcf64ebe..e8749510b906a12c97daed5bf3971f826d26d477 100644
--- a/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
+++ b/src/test/java/org/caosdb/server/database/backend/implementation/MySQL/InsertTest.java
@@ -174,20 +174,23 @@ public class InsertTest {
     assertEquals("V3", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString());
     assertEquals(new EntityID("2"), stage2Inserts.get(0).getDomain());
 
-    assertEquals(new EntityID("5"), stage2Inserts.get(1).getId());
-    assertEquals("V5", ((SingleValue) stage2Inserts.get(1).getValue()).toDatabaseString());
+    assertEquals(new EntityID("-1"), stage2Inserts.get(1).getId());
+    assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(1).getStatementStatus());
+    assertEquals(new EntityID("5"), ((ReferenceValue) stage2Inserts.get(1).getValue()).getId());
     assertEquals(new EntityID("4"), stage2Inserts.get(1).getDomain());
 
     assertEquals(new EntityID("6"), stage2Inserts.get(2).getId());
     assertEquals("V6", ((SingleValue) stage2Inserts.get(2).getValue()).toDatabaseString());
     assertEquals(new EntityID("-1"), stage2Inserts.get(2).getDomain());
 
-    assertEquals(new EntityID("8"), stage2Inserts.get(3).getId());
-    assertEquals("V8", ((SingleValue) stage2Inserts.get(3).getValue()).toDatabaseString());
+    assertEquals(new EntityID("-2"), stage2Inserts.get(3).getId());
+    assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(3).getStatementStatus());
+    assertEquals(new EntityID("8"), ((ReferenceValue) stage2Inserts.get(3).getValue()).getId());
     assertEquals(new EntityID("7"), stage2Inserts.get(3).getDomain());
 
-    assertEquals(new EntityID("9"), stage2Inserts.get(4).getId());
-    assertEquals("V9", ((SingleValue) stage2Inserts.get(4).getValue()).toDatabaseString());
+    assertEquals(new EntityID("-3"), stage2Inserts.get(4).getId());
+    assertEquals(ReplacementStatus.REPLACEMENT, stage2Inserts.get(4).getStatementStatus());
+    assertEquals(new EntityID("9"), ((ReferenceValue) stage2Inserts.get(4).getValue()).getId());
     assertEquals(new EntityID("-2"), stage2Inserts.get(4).getDomain());
 
     assertEquals(new EntityID("10"), stage2Inserts.get(5).getId());