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 18c994e454a75bb17ea1e69777778d9592e18eab..6528627d0e7080452827f8b70b87c34c78ac6c57 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,24 +107,21 @@ 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);
-        }
-      }
-    }
 
-    for (final Property p : stage1Inserts) {
-      if (p.hasProperties()) {
-        if (p instanceof Replacement && ((Replacement) p).isState2Replacement()) {
-          stage2Inserts.add(((Replacement) p).replacement);
+        EntityID replacementId = replacementIds.pop();
+        ((Replacement) p).setReplacementId(replacementId);
+
+        if (p.hasProperties()) {
+          for (Property subP : p.getProperties()) {
+            subP.setDomain(p);
+            stage2Inserts.add(subP);
+          }
         }
-        for (Property subP : p.getProperties()) {
-          if (!subP.hasProperties()) {
+      } else {
+        if (p.hasProperties()) {
+          for (Property subP : p.getProperties()) {
             stage2Inserts.add(subP);
           }
         }
@@ -145,13 +142,9 @@ 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()) {
-        Replacement r = new Replacement(subP);
-        r.replacement.setDomain(p);
-        r.setStage2Replacement(true);
-        stage1Inserts.add(r);
-        processSubPropertiesStage1(stage1Inserts, r);
+        stage1Inserts.add(new Replacement(subP));
+        processSubPropertiesStage1(stage1Inserts, subP);
       }
     }
   }
@@ -171,10 +164,9 @@ public class DatabaseUtils {
           if (desc != null) {
             p.desc = desc;
           }
-          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 type = bytes2UTF8(rs.getBytes("type_override"));
+          if (type != null) {
+            p.type = type;
           }
           final String coll = bytes2UTF8(rs.getBytes("collection_override"));
           if (coll != null) {
@@ -229,8 +221,7 @@ public class DatabaseUtils {
     final SparseEntity ret = parseNameRoleACL(rs);
     ret.id = rs.getString("EntityID");
     ret.description = bytes2UTF8(rs.getBytes("EntityDesc"));
-    ret.datatype_id = bytes2UTF8(rs.getBytes("DatatypeID"));
-    ret.datatype_name = bytes2UTF8(rs.getBytes("DatatypeName"));
+    ret.datatype = bytes2UTF8(rs.getBytes("Datatype"));
     ret.collection = bytes2UTF8(rs.getBytes("Collection"));
 
     ret.filePath = bytes2UTF8(rs.getBytes("FilePath"));
@@ -309,14 +300,6 @@ 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()) {
@@ -342,13 +325,6 @@ 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(
@@ -382,8 +358,7 @@ public class DatabaseUtils {
     }
     pp.desc = replacement.desc;
     pp.name = replacement.name;
-    pp.type_id = replacement.type_id;
-    pp.type_name = replacement.type_name;
+    pp.type = replacement.type;
     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 40c7a40754d823ce20580b671147c9cf21576af7..4260ae03e76eec7fab1e33957a00dedc2ef77e17 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_id);
+      insertEntityDatatypeStmt.setString(2, entity.datatype);
 
       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 d303acca337cf196ddd251666d71ccb2d21ee21c..cef624dce3a022043a2f86e56acd6ca589d493d1 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_id);
+      stmt.setString(10, fp.type);
       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_id =
+            fp.type =
                 ((AbstractCollectionDatatype) property.getDatatype())
                     .getDatatype()
                     .getId()
@@ -215,7 +215,7 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
             fp.collection =
                 ((AbstractCollectionDatatype) property.getDatatype()).getCollectionName();
           } else {
-            fp.type_id = property.getDatatype().getId().toString();
+            fp.type = 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 0957ab539e74b960e5e384ba395bef7156cbda97..8d2af662f32d2f5a788d6470cf6cd526e15d0976 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_id != null) {
-        updateEntityStmt.setString(5, spe.datatype_id);
+      if (spe.datatype != null) {
+        updateEntityStmt.setString(5, spe.datatype);
       } 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 fbe2f57e1cdc7868dac239313f7579011e23e868..8ec47231d7d3644bc4c21a2b2125175a75f4bc97 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,18 +41,12 @@ 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);
   }
@@ -61,18 +55,10 @@ public class Replacement extends Property {
     super(p);
     replacement = new Property(new RetrieveEntity());
 
-    replacement.setDomain(p);
+    replacement.setDomain(p.getDomainEntity());
     replacement.setId(new EntityID());
     replacement.setStatementStatus(ReplacementStatus.REPLACEMENT);
     replacement.setValue(new ReferenceValue(p.getId()));
-    replacement.setPIdx(p.getPIdx());
-  }
-
-  public void setStage2Replacement(boolean t) {
-    this.state2Replacement = t;
-  }
-
-  public boolean isState2Replacement() {
-    return state2Replacement;
+    replacement.setPIdx(0);
   }
 }
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 ecb49147474e156ea3f560edc3e039f8181dd0ca..b2123ce206ce01acee3ef70b1c22151b94f59bd9 100644
--- a/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
+++ b/src/main/java/org/caosdb/server/database/proto/FlatProperty.java
@@ -33,7 +33,6 @@ public class FlatProperty implements Serializable {
   public Integer idx = null;
   public String name = null;
   public String desc = null;
-  public String type_id = null;
-  public String type_name = null;
+  public String type = 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 f4ff2d41c46ceec3b408b980df906fdc8d10553f..d2292c58825ac6807e24f3ad3d086b29dd8a6e7e 100644
--- a/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/proto/SparseEntity.java
@@ -33,8 +33,7 @@ public class SparseEntity extends VerySparseEntity {
   private static final long serialVersionUID = -560259468853956476L;
 
   public String collection = null;
-  public String datatype_id = null;
-  public String datatype_name = null;
+  public String datatype = null;
   public String fileHash = null;
   public String filePath = null;
   public Long fileSize = null;
@@ -49,8 +48,7 @@ public class SparseEntity extends VerySparseEntity {
         .append(this.description)
         .append(this.role)
         .append(this.collection)
-        .append(this.datatype_id)
-        .append(this.datatype_name)
+        .append(this.datatype)
         .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 1d816947d642e2ccb6f9867ced4478ea9a59c2d3..cbd822ee10a24127483fae9adff440404a243771 100644
--- a/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/AbstractCollectionDatatype.java
@@ -25,7 +25,6 @@ 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 {
 
@@ -51,7 +50,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, null, type);
+      return collectionDatatypeFactory(col, type);
     }
     return null;
   }
@@ -74,9 +73,7 @@ public abstract class AbstractCollectionDatatype extends AbstractDatatype {
   }
 
   public static AbstractCollectionDatatype collectionDatatypeFactory(
-      final String col, final String id, String name) {
-    return instances
-        .get(col)
-        .createDataType(AbstractDatatype.datatypeFactory(new EntityID(id), name));
+      final String col, final String dt) {
+    return instances.get(col).createDataType(AbstractDatatype.datatypeFactory(dt));
   }
 }
diff --git a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
index 795ac56dbb1df24f38964edc5eac47e491199c37..583145fb19361adf08ae81bf8c9e338d53ad908f 100644
--- a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
@@ -65,24 +65,6 @@ 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)) {
@@ -139,6 +121,6 @@ public abstract class AbstractDatatype {
 
   @Override
   public String toString() {
-    return "DT." + (getName() != null ? getName() : getId().toString());
+    return "DT." + getName();
   }
 }
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
index cbc080b92b1220b21a36da43aecfd9434515420f..503e4679335381da6c08b746af8ed14665bd409b 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
@@ -30,10 +30,6 @@ 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);
@@ -60,11 +56,6 @@ 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 1a1c33ffe4ebafca0ca6e3011740a2d789750671..e07b1b807c3226cb5bc074aeafd4d8c712ce2ec1 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
@@ -55,10 +55,6 @@ 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;
@@ -74,7 +70,11 @@ public class ReferenceValue implements SingleValue {
     } else if (reference instanceof CollectionValue) {
       throw ServerMessages.DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES;
     } else {
-      return new ReferenceValue(reference.toString());
+      try {
+        return new ReferenceValue(reference.toString());
+      } catch (final NumberFormatException e) {
+        return new ReferenceValue(reference.toString());
+      }
     }
   }
 
@@ -242,8 +242,4 @@ 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 8179375d8f4671f721969e0103a427077ca8e027..b27eaa28e5111d783d1d8d3779f36a1938898173 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -200,6 +200,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     } else {
       setDatatype(AbstractDatatype.datatypeFactory(datatype));
     }
+    notifyObservers(DATATYPE_CHANGED_EVENT);
   }
 
   @Override
@@ -366,12 +367,9 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     if (hasDatatype()) {
       if (getDatatype() instanceof AbstractCollectionDatatype) {
         ret.collection = ((AbstractCollectionDatatype) getDatatype()).getCollectionName();
-        ret.datatype_id =
-            ((AbstractCollectionDatatype) getDatatype()).getDatatype().getId().toString();
-        ret.datatype_name = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName();
+        ret.datatype = ((AbstractCollectionDatatype) getDatatype()).getDatatype().getName();
       } else {
-        ret.datatype_id = getDatatype().getId().toString();
-        ret.datatype_name = getDatatype().getName();
+        ret.datatype = getDatatype().getName();
       }
     }
     if (hasFileProperties()) {
@@ -730,13 +728,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
         // Parse sub elements which represent PROPERTIES of this
         // record.
 
-        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);
+        final Property property = new Property(new WritableEntity(pe, Role.Property));
 
         // Ignore parents of properties
         property.getParents().clear();
@@ -745,13 +737,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
       } else if (pe.getName().equalsIgnoreCase("Parent")) {
         // Parse sub elements which represent PARENTS of this
         // record.
-        WritableEntity wrapped;
-        if (this instanceof InsertEntity) {
-          wrapped = new InsertEntity(pe, null);
-        } else {
-          wrapped = new UpdateEntity(pe, null);
-        }
-        final Parent parent = new Parent(wrapped);
+        final Parent parent = new Parent(new WritableEntity(pe, null));
         addParent(parent);
       } else if (pe.getName().equalsIgnoreCase("EntityACL")) {
         // Parse and concatenate EntityACL
@@ -967,14 +953,18 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     if (!isDescOverride()) {
       setDescription(spe.description);
     }
-    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));
+    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);
+        }
       }
     }
 
diff --git a/src/main/java/org/caosdb/server/entity/EntityID.java b/src/main/java/org/caosdb/server/entity/EntityID.java
index 5f6c4667bc3eba056a036d718a350aa032bcb8f0..9f61127db2969578300fbe2f12091c0f9f258d90 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;
   }
 
-  public boolean hasId() {
+  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 b17a54b9a68ebcdf21d8e67b9c31b0f7d59d02e8..6c967cc4e3404c7940066dc123bf805785a6e4c3 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 abstract class WritableEntity extends Entity {
+public 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 4d2b8e25b8e7518822b13c08ef04623e74d37a29..9268d7f3cb327a70a4cca872657d72e2779fc344 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java
@@ -27,7 +27,6 @@ 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;
@@ -87,13 +86,12 @@ public class Property extends EntityWrapper {
       setDescription(pp.desc);
       setDescOverride(true);
     }
-    if (pp.type_id != null) {
+    if (pp.type != null) {
       if (pp.collection != null) {
         this.setDatatype(
-            AbstractCollectionDatatype.collectionDatatypeFactory(
-                pp.collection, pp.type_id, pp.type_name));
+            AbstractCollectionDatatype.collectionDatatypeFactory(pp.collection, pp.type));
       } else {
-        this.setDatatype(AbstractDatatype.datatypeFactory(new EntityID(pp.type_id), pp.type_name));
+        this.setDatatype(pp.type);
       }
       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 83300e00d4be7c463f4b92f4fdbb521c17739a7b..b2bb0d4a1b13a98dd68893c9f0cad7bc8192edba 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.EntityWrapper;
+import org.caosdb.server.entity.wrapper.Property;
 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 EntityWrapper) {
-      transactionType = getTransactionType(((EntityWrapper) target).getWrapped());
+    if (target instanceof Property) {
+      transactionType = getTransactionType(((Property) target).getDomainEntity());
     } 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 4a43d4a2985ad3607bb5cb9b2789acd085cc31e0..b3a06ca09d7870da843a2f3ad295e019ab683c12 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
@@ -28,7 +28,6 @@ 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;
@@ -116,11 +115,7 @@ public final class CheckDatatypePresent extends EntityJob {
   }
 
   private void checkReference2(final ReferenceDatatype2 datatype) throws Message {
-    EntityID datatypeId = datatype.getId();
-    if (datatypeId == null) {
-      datatypeId = new EntityID(datatype.getName());
-    }
-    EntityInterface datatypeEntity = resolve(datatypeId, datatype.getName(), (String) null);
+    EntityInterface datatypeEntity = resolve(datatype.getId(), 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 78d257eadf4fa1de4331bd9bf38855ca04ccdd9e..86e95542aaa0e6f373521149d9f7376f09d3972c 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
@@ -28,7 +28,6 @@ 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;
@@ -81,11 +80,7 @@ public class CheckRefidValid extends EntityJob implements Observer {
   }
 
   private void checkRefValue(final ReferenceValue ref) throws Message {
-    EntityID refId = ref.getId();
-    if (refId == null) {
-      refId = new EntityID(ref.getName());
-    }
-    EntityInterface referencedEntity = resolve(refId, ref.getName(), ref.getVersion());
+    EntityInterface referencedEntity = resolve(ref.getId(), 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 b460085db94864e9936a1b7d0e8c12e74555bb1f..69dde0ea3602a650e52dadcdbc0107ff7cf12ded 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() || e.hasDatatype()) {
+      if (e.hasValue()) {
         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 939d0bf6473611cb1a0bb1ee28bfd91a568babd3..b780d3d68f20cb6973c902cbe92fbd4fd46d51c1 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -398,17 +398,14 @@ 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 {
-      if (oldEntity.hasDatatype()) {
-        newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride());
-        newEntity.setDatatype(oldEntity.getDatatype());
-      }
+      newEntity.setDatatypeOverride(oldEntity.isDatatypeOverride());
     }
 
     // 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 90b642f17070e2f67312d533331ee7929117b447..8ff05660afde6e67d65e94011b662f09bdda9294 100644
--- a/src/test/java/org/caosdb/server/caching/TestCaching.java
+++ b/src/test/java/org/caosdb/server/caching/TestCaching.java
@@ -26,7 +26,6 @@ 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;
@@ -37,7 +36,6 @@ 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 e8749510b906a12c97daed5bf3971f826d26d477..feee1360bf7fa0ae865422b31d8a2ad2bcf64ebe 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,23 +174,20 @@ public class InsertTest {
     assertEquals("V3", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString());
     assertEquals(new EntityID("2"), stage2Inserts.get(0).getDomain());
 
-    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("5"), stage2Inserts.get(1).getId());
+    assertEquals("V5", ((SingleValue) stage2Inserts.get(1).getValue()).toDatabaseString());
     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("-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("8"), stage2Inserts.get(3).getId());
+    assertEquals("V8", ((SingleValue) stage2Inserts.get(3).getValue()).toDatabaseString());
     assertEquals(new EntityID("7"), stage2Inserts.get(3).getDomain());
 
-    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("9"), stage2Inserts.get(4).getId());
+    assertEquals("V9", ((SingleValue) stage2Inserts.get(4).getValue()).toDatabaseString());
     assertEquals(new EntityID("-2"), stage2Inserts.get(4).getDomain());
 
     assertEquals(new EntityID("10"), stage2Inserts.get(5).getId());