diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
index 28285ae9a2890e6fc6d69b63e620810867035f50..f8cba7d4c9734c1e6e12b72498ceaa6c57ed1a17 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteEntityProperties.java
@@ -28,6 +28,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.DeleteEntityPropertiesImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLDeleteEntityProperties extends MySQLTransaction
     implements DeleteEntityPropertiesImpl {
@@ -39,11 +40,11 @@ public class MySQLDeleteEntityProperties extends MySQLTransaction
   public static final String STMT_DELETE_ENTITY_PROPERTIES = "call deleteEntityProperties(?)";
 
   @Override
-  public void execute(final Integer id) throws TransactionException {
+  public void execute(final EntityID id) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_DELETE_ENTITY_PROPERTIES);
 
-      stmt.setInt(1, id);
+      stmt.setInt(1, id.toInteger());
       stmt.execute();
     } catch (final SQLIntegrityConstraintViolationException exc) {
       throw new IntegrityException(exc);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
index 9f504f3f2690a6415179761b5a647b2a13bb95d0..7fe8ac303b53ec26dc947c1e4a84e648d7b6517d 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLDeleteSparseEntity.java
@@ -28,6 +28,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.DeleteSparseEntityImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLDeleteSparseEntity extends MySQLTransaction implements DeleteSparseEntityImpl {
 
@@ -38,12 +39,12 @@ public class MySQLDeleteSparseEntity extends MySQLTransaction implements DeleteS
   public static final String STMT_DELETE_SPARSE_ENTITY = "call deleteEntity(?)";
 
   @Override
-  public void execute(final Integer id) throws TransactionException {
+  public void execute(final EntityID id) throws TransactionException {
 
     try {
       final PreparedStatement stmt = prepareStatement(STMT_DELETE_SPARSE_ENTITY);
 
-      stmt.setInt(1, id);
+      stmt.setInt(1, id.toInteger());
       stmt.execute();
     } catch (final SQLIntegrityConstraintViolationException exc) {
       throw new IntegrityException(exc);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
index d63de2d530d0f32bf3d068e7d1351cfb9609ce79..3c1cebf1e20a720a5f726e378bb22b1ad61c850a 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetChildren.java
@@ -24,11 +24,12 @@ package org.caosdb.server.database.backend.implementation.MySQL;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.GetChildrenImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLGetChildren extends MySQLTransaction implements GetChildrenImpl {
 
@@ -40,18 +41,18 @@ public class MySQLGetChildren extends MySQLTransaction implements GetChildrenImp
       "Select child from isa_cache where parent=? and rpath=child";
 
   @Override
-  public List<Integer> execute(final Integer entity) throws TransactionException {
+  public List<EntityID> execute(final EntityID entity) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_GET_CHILDREN);
 
-      stmt.setInt(1, entity);
+      stmt.setInt(1, entity.toInteger());
 
       ResultSet rs = null;
       try {
         rs = stmt.executeQuery();
-        final ArrayList<Integer> ret = new ArrayList<Integer>();
+        final List<EntityID> ret = new LinkedList<>();
         while (rs.next()) {
-          ret.add(rs.getInt(1));
+          ret.add(new EntityID(rs.getInt(1)));
         }
         return ret;
       } finally {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
index 7875ced0d89fd11ed14cf668bb9110f643c053c9..9384c8a04861a01f1e56236b0ab42433d87990f5 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetDependentEntities.java
@@ -24,11 +24,12 @@ package org.caosdb.server.database.backend.implementation.MySQL;
 
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
-import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.GetDependentEntitiesImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLGetDependentEntities extends MySQLTransaction
     implements GetDependentEntitiesImpl {
@@ -40,17 +41,17 @@ public class MySQLGetDependentEntities extends MySQLTransaction
   public static final String STMT_GET_DEPENDENT_ENTITIES = "call getDependentEntities(?)";
 
   @Override
-  public List<Integer> execute(final Integer entity) throws TransactionException {
+  public List<EntityID> execute(final EntityID entity) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_GET_DEPENDENT_ENTITIES);
 
-      stmt.setInt(1, entity);
+      stmt.setInt(1, entity.toInteger());
 
       final ResultSet rs = stmt.executeQuery();
       try {
-        final ArrayList<Integer> ret = new ArrayList<Integer>();
+        final List<EntityID> ret = new LinkedList<>();
         while (rs.next()) {
-          ret.add(rs.getInt(1));
+          ret.add(new EntityID(rs.getInt(1)));
         }
         return ret;
       } finally {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java
index 5a546ae1ae16c606a9b367cce94e1ceddf073239..71062816a57129d37dbc44806e30da9c22f33ae1 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLGetIDByName.java
@@ -29,6 +29,7 @@ import java.util.List;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.GetIDByNameImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImpl {
 
@@ -52,7 +53,7 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp
   public static final String STMT_LIMIT = " LIMIT ";
 
   @Override
-  public List<Integer> execute(final String name, final String role, final String limit)
+  public List<EntityID> execute(final String name, final String role, final String limit)
       throws TransactionException {
     try {
       final String stmtStr =
@@ -66,9 +67,9 @@ public class MySQLGetIDByName extends MySQLTransaction implements GetIDByNameImp
         stmt.setString(2, role);
       }
       try (ResultSet rs = stmt.executeQuery()) {
-        final ArrayList<Integer> ret = new ArrayList<Integer>();
+        final ArrayList<EntityID> ret = new ArrayList<>();
         while (rs.next()) {
-          ret.add(rs.getInt("id"));
+          ret.add(new EntityID(rs.getInt("id")));
         }
 
         return ret;
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 d4243d7712cc3982221e1e815cdbdaaa4561a205..7c3c5a33e160f3da6a8c2b89fe0487e0317c99da 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
@@ -33,6 +33,7 @@ import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.FlatProperty;
 import org.caosdb.server.datatype.AbstractDatatype.Table;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLInsertEntityProperties extends MySQLTransaction
     implements InsertEntityPropertiesImpl {
@@ -46,8 +47,8 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
 
   @Override
   public void execute(
-      final Integer domain,
-      final Integer entity,
+      final EntityID domain,
+      final EntityID entity,
       final FlatProperty fp,
       final Table table,
       final Long unit_sig)
@@ -55,8 +56,8 @@ public class MySQLInsertEntityProperties extends MySQLTransaction
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_ENTITY_PROPERTY);
 
-      stmt.setInt(1, domain);
-      stmt.setInt(2, entity);
+      stmt.setInt(1, domain.toInteger());
+      stmt.setInt(2, entity.toInteger());
       stmt.setInt(3, fp.id);
       stmt.setString(4, table.toString());
 
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
index a37bf066aa1573e67390f88bfe18bbed0d6dbb3b..61a5e8c48cdc85098e1b0a2f5531c358d6c6058d 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertParents.java
@@ -26,6 +26,7 @@ import java.sql.PreparedStatement;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.InsertParentsImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLInsertParents extends MySQLTransaction implements InsertParentsImpl {
 
@@ -36,11 +37,11 @@ public class MySQLInsertParents extends MySQLTransaction implements InsertParent
   public static final String STMT_INSERT_ISA = "call insertIsa(?,?)";
 
   @Override
-  public void execute(final Integer entity, final Integer parent) throws TransactionException {
+  public void execute(final EntityID entity, final EntityID parent) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_ISA);
-      stmt.setInt(1, entity);
-      stmt.setInt(2, parent);
+      stmt.setInt(1, entity.toInteger());
+      stmt.setInt(2, parent.toInteger());
       stmt.execute();
     } catch (final Exception e) {
       throw new TransactionException(e);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
index 27b0f8a156ae6b5c936772bf03d0d8ed8da4e42e..0832790a0b56446570fbd7b9c3a4383390c443a7 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLInsertTransactionHistory.java
@@ -26,6 +26,7 @@ import java.sql.PreparedStatement;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.InsertTransactionHistoryImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLInsertTransactionHistory extends MySQLTransaction
     implements InsertTransactionHistoryImpl {
@@ -44,7 +45,7 @@ public class MySQLInsertTransactionHistory extends MySQLTransaction
       final String user,
       final long seconds,
       final int nanos,
-      final int entity)
+      final EntityID entity)
       throws TransactionException {
     try {
 
@@ -55,7 +56,7 @@ public class MySQLInsertTransactionHistory extends MySQLTransaction
       logStmt.setString(3, user);
       logStmt.setLong(4, seconds);
       logStmt.setInt(5, nanos);
-      logStmt.setInt(6, entity);
+      logStmt.setInt(6, entity.toInteger());
       logStmt.execute();
     } catch (final Exception e) {
       throw new TransactionException(e);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
index bb847de7bf86e6e8a49414a52933a7bb87cf8d60..f6c2daf8d4a0bf4defcaa550cf715032d57cd9cd 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLIsSubType.java
@@ -28,6 +28,7 @@ import java.sql.SQLException;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.IsSubTypeImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLIsSubType extends MySQLTransaction implements IsSubTypeImpl {
 
@@ -38,12 +39,12 @@ public class MySQLIsSubType extends MySQLTransaction implements IsSubTypeImpl {
   public static final String STMT_IS_SUBTYPE = "call isSubtype(?,?)";
 
   @Override
-  public boolean execute(final Integer child, final Integer parent) throws TransactionException {
+  public boolean execute(final EntityID child, final EntityID parent) throws TransactionException {
     try {
       final PreparedStatement isSubtypeStmt = prepareStatement(STMT_IS_SUBTYPE);
 
-      isSubtypeStmt.setInt(1, child);
-      isSubtypeStmt.setInt(2, parent);
+      isSubtypeStmt.setInt(1, child.toInteger());
+      isSubtypeStmt.setInt(2, parent.toInteger());
 
       final ResultSet rs = isSubtypeStmt.executeQuery();
       try {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java
index 77618e92d56a166eb9d0df96258b943fb9df52d5..f847bf63e9f72b4632cecf55ee4a132f141a2cd1 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveAll.java
@@ -24,13 +24,14 @@ package org.caosdb.server.database.backend.implementation.MySQL;
 import java.sql.PreparedStatement;
 import java.sql.ResultSet;
 import java.sql.SQLException;
-import java.util.ArrayList;
+import java.util.LinkedList;
 import java.util.List;
 import org.apache.shiro.SecurityUtils;
 import org.caosdb.server.database.DatabaseUtils;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveAllImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.permissions.EntityACL;
 import org.caosdb.server.permissions.EntityPermission;
@@ -57,7 +58,7 @@ public class MySQLRetrieveAll extends MySQLTransaction implements RetrieveAllImp
   public static final String STMT_OTHER_ROLES = " AND e.role=?";
 
   @Override
-  public List<Integer> execute(final String role) throws TransactionException {
+  public List<EntityID> execute(final String role) throws TransactionException {
     try {
       final String STMT_GET_ALL =
           STMT_GET_ALL_HEAD
@@ -70,12 +71,12 @@ public class MySQLRetrieveAll extends MySQLTransaction implements RetrieveAllImp
 
       final ResultSet rs = stmt.executeQuery();
       try {
-        final ArrayList<Integer> ret = new ArrayList<Integer>();
+        final List<EntityID> ret = new LinkedList<>();
         while (rs.next()) {
-          String acl = DatabaseUtils.bytes2UTF8(rs.getBytes("ACL"));
+          final String acl = DatabaseUtils.bytes2UTF8(rs.getBytes("ACL"));
           if (EntityACL.deserialize(acl)
               .isPermitted(SecurityUtils.getSubject(), EntityPermission.RETRIEVE_ENTITY)) {
-            ret.add(rs.getInt("ID"));
+            ret.add(new EntityID(rs.getInt("ID")));
           }
         }
         return ret;
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
index 7b8c0d48db3c84183c16b449822065e0c8d798b9..64ce7e9023bd18506a4b13610033923fa7320ca8 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveParents.java
@@ -32,6 +32,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveParentsImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VerySparseEntity;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLRetrieveParents extends MySQLTransaction implements RetrieveParentsImpl {
 
@@ -42,14 +43,14 @@ public class MySQLRetrieveParents extends MySQLTransaction implements RetrievePa
   private static final String stmtStr = "call retrieveEntityParents(?, ?)";
 
   @Override
-  public ArrayList<VerySparseEntity> execute(final Integer id, final String version)
+  public ArrayList<VerySparseEntity> execute(final EntityID id, final String version)
       throws TransactionException {
     try {
       ResultSet rs = null;
       try {
         final PreparedStatement prepareStatement = prepareStatement(stmtStr);
 
-        prepareStatement.setInt(1, id);
+        prepareStatement.setInt(1, id.toInteger());
         if (version == null) {
           prepareStatement.setNull(2, Types.VARBINARY);
         } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
index 39de8692a48fb57b9ad22d0054bcd5bc3541e632..6bcfeac05cd3631f05615d26741c47f4c5c1bf63 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveProperties.java
@@ -34,6 +34,7 @@ import org.caosdb.server.database.backend.interfaces.RetrievePropertiesImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.FlatProperty;
 import org.caosdb.server.database.proto.ProtoProperty;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLRetrieveProperties extends MySQLTransaction implements RetrievePropertiesImpl {
 
@@ -45,13 +46,13 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
   private static final String stmtStr2 = "call retrieveOverrides(?,?,?)";
 
   @Override
-  public ArrayList<ProtoProperty> execute(final Integer entity, final String version)
+  public ArrayList<ProtoProperty> execute(final EntityID entity, final String version)
       throws TransactionException {
     try {
       final PreparedStatement prepareStatement = prepareStatement(stmtStr);
 
       final List<FlatProperty> props =
-          retrieveFlatPropertiesStage1(0, entity, version, prepareStatement);
+          retrieveFlatPropertiesStage1(0, entity.toInteger(), version, prepareStatement);
 
       final ArrayList<ProtoProperty> protos = new ArrayList<ProtoProperty>();
       for (final FlatProperty p : props) {
@@ -59,7 +60,7 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
         proto.property = p;
 
         final List<FlatProperty> subProps =
-            retrieveFlatPropertiesStage1(entity, p.id, version, prepareStatement);
+            retrieveFlatPropertiesStage1(entity.toInteger(), p.id, version, prepareStatement);
 
         proto.subProperties = subProps;
 
@@ -94,9 +95,9 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
         stmt.setString(3, version);
       }
 
-      long t1 = System.currentTimeMillis();
+      final long t1 = System.currentTimeMillis();
       rs = stmt.executeQuery();
-      long t2 = System.currentTimeMillis();
+      final long t2 = System.currentTimeMillis();
       addMeasurement(this.getClass().getSimpleName() + ".retrieveFlatPropertiesStage1", t2 - t1);
 
       final List<FlatProperty> props = DatabaseUtils.parsePropertyResultset(rs);
@@ -130,9 +131,9 @@ public class MySQLRetrieveProperties extends MySQLTransaction implements Retriev
       } else {
         stmt2.setString(3, version);
       }
-      long t1 = System.currentTimeMillis();
+      final long t1 = System.currentTimeMillis();
       rs = stmt2.executeQuery();
-      long t2 = System.currentTimeMillis();
+      final long t2 = System.currentTimeMillis();
       addMeasurement(this.getClass().getSimpleName() + ".retrieveOverrides", t2 - t1);
       DatabaseUtils.parseOverrides(props, rs);
     } finally {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
index fd0efb8e8756cfb7bec596382356e1ea951ad484..1ab95ae7afc756742475ff2f3c79eddfd632aae9 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveQueryTemplateDefinition.java
@@ -29,6 +29,7 @@ import java.sql.Types;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveQueryTemplateDefinitionImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLRetrieveQueryTemplateDefinition extends MySQLTransaction
     implements RetrieveQueryTemplateDefinitionImpl {
@@ -41,11 +42,11 @@ public class MySQLRetrieveQueryTemplateDefinition extends MySQLTransaction
       "call retrieveQueryTemplateDef(?,?)";
 
   @Override
-  public String retrieve(final Integer id, final String version) {
+  public String retrieve(final EntityID id, final String version) {
     try {
 
       final PreparedStatement stmt = prepareStatement(STMT_RETRIEVE_QUERY_TEMPLATE_DEF);
-      stmt.setInt(1, id);
+      stmt.setInt(1, id.toInteger());
       if (version == null) {
         stmt.setNull(2, Types.VARBINARY);
       } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
index 3775c1dd4f0b87eb36f43084776d58c0f14f5f80..ca3bd078daba4c72e7f516ce64b1da1515a1a6eb 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveSparseEntity.java
@@ -31,6 +31,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveSparseEntityImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 
 /**
  * Retrieve a single SparseEntity by id.
@@ -47,11 +48,11 @@ public class MySQLRetrieveSparseEntity extends MySQLTransaction
   private static final String stmtStr = "call retrieveEntity(?,?)";
 
   @Override
-  public SparseEntity execute(final int id, final String version) throws TransactionException {
+  public SparseEntity execute(final EntityID id, final String version) throws TransactionException {
     try {
       final PreparedStatement preparedStatement = prepareStatement(stmtStr);
 
-      preparedStatement.setInt(1, id);
+      preparedStatement.setInt(1, id.toInteger());
       if (version == null) {
         preparedStatement.setNull(2, Types.VARBINARY);
       } else {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
index 7ecfbfb7ac70a4a5ec248eb0e2be2c590f0676aa..585be49afe93dc94c6ba2bc4f058c5d46fcf40f6 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRetrieveVersionHistory.java
@@ -32,6 +32,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VersionHistoryItem;
+import org.caosdb.server.entity.EntityID;
 
 /**
  * Transaction to retrieve all versions of an entity.
@@ -43,26 +44,26 @@ public class MySQLRetrieveVersionHistory extends MySQLTransaction
 
   public static final String VERSION_HISTORY_STMT = "CALL get_version_history(?)";
 
-  public MySQLRetrieveVersionHistory(Access access) {
+  public MySQLRetrieveVersionHistory(final Access access) {
     super(access);
   }
 
   @Override
-  public HashMap<String, VersionHistoryItem> execute(Integer entityId) {
+  public HashMap<String, VersionHistoryItem> execute(final EntityID entityId) {
 
-    HashMap<String, VersionHistoryItem> result = new HashMap<>();
+    final HashMap<String, VersionHistoryItem> result = new HashMap<>();
     try {
-      PreparedStatement s = prepareStatement(VERSION_HISTORY_STMT);
-      s.setInt(1, entityId);
-      ResultSet rs = s.executeQuery();
+      final PreparedStatement s = prepareStatement(VERSION_HISTORY_STMT);
+      s.setInt(1, entityId.toInteger());
+      final ResultSet rs = s.executeQuery();
 
       while (rs.next()) {
-        String childId = DatabaseUtils.bytes2UTF8(rs.getBytes("child"));
-        String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent"));
-        Long childSeconds = rs.getLong("child_seconds");
-        Integer childNanos = rs.getInt("child_nanos");
-        String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username"));
-        String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm"));
+        final String childId = DatabaseUtils.bytes2UTF8(rs.getBytes("child"));
+        final String parentId = DatabaseUtils.bytes2UTF8(rs.getBytes("parent"));
+        final Long childSeconds = rs.getLong("child_seconds");
+        final Integer childNanos = rs.getInt("child_nanos");
+        final String childUsername = DatabaseUtils.bytes2UTF8(rs.getBytes("child_username"));
+        final String childRealm = DatabaseUtils.bytes2UTF8(rs.getBytes("child_realm"));
         VersionHistoryItem v = result.get(childId);
         if (v == null) {
           v = new VersionHistoryItem();
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
index fa4c60ad1a688fa13ee8e1f82ee6a8a1649d6d4f..18d7d9b7f510f5cb24e1fe844ac4caac86ff4913 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetFileCheckedTimestampImpl.java
@@ -27,6 +27,7 @@ import java.sql.SQLException;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.SetFileCheckedTimestampImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLSetFileCheckedTimestampImpl extends MySQLTransaction
     implements SetFileCheckedTimestampImpl {
@@ -38,11 +39,11 @@ public class MySQLSetFileCheckedTimestampImpl extends MySQLTransaction
   }
 
   @Override
-  public void execute(final Integer id, final Long ts) throws TransactionException {
+  public void execute(final EntityID id, final Long ts) throws TransactionException {
     try {
       final PreparedStatement stmt = getMySQLHelper().prepareStatement(STMT_SET_TS);
       stmt.setLong(1, ts);
-      stmt.setInt(2, id);
+      stmt.setInt(2, id.toInteger());
     } catch (final SQLException e) {
       throw new TransactionException(e);
     } catch (final ConnectionException e) {
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
index e938010ca56f85d7ad574e51d1b8ef7d88b6c5ad..f3ded949383c7d250d4ad58e6ae964aa9f96324c 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLSetQueryTemplateDefinition.java
@@ -27,6 +27,7 @@ import java.sql.SQLException;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.SetQueryTemplateDefinitionImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLSetQueryTemplateDefinition extends MySQLTransaction
     implements SetQueryTemplateDefinitionImpl {
@@ -39,10 +40,10 @@ public class MySQLSetQueryTemplateDefinition extends MySQLTransaction
       "INSERT INTO query_template_def (id, definition) VALUES (?,?) ON DUPLICATE KEY UPDATE definition=?;";
 
   @Override
-  public void insert(final Integer id, final String definition) {
+  public void insert(final EntityID id, final String definition) {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_INSERT_QUERY_TEMPLATE_DEF);
-      stmt.setInt(1, id);
+      stmt.setInt(1, id.toInteger());
       stmt.setString(2, definition);
       stmt.setString(3, definition);
       stmt.execute();
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java
index 93b7023bf10fd1b035b8d8483bc328cfef5aa5c4..1c271bcc4fec7ada01980c51c16e7c5b884fb79d 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteEntityPropertiesImpl.java
@@ -23,9 +23,10 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.utils.Undoable;
 
 public interface DeleteEntityPropertiesImpl extends BackendTransactionImpl, Undoable {
 
-  public abstract void execute(Integer id) throws TransactionException;
+  public abstract void execute(EntityID id) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java
index 30ee60609065c0ac02b5b40a143c0643d37b5667..5f1d2ec2364aaead626182e13777af8c7e809a20 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/DeleteSparseEntityImpl.java
@@ -23,9 +23,10 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.utils.Undoable;
 
 public interface DeleteSparseEntityImpl extends BackendTransactionImpl, Undoable {
 
-  public void execute(Integer id) throws TransactionException;
+  public void execute(EntityID id) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java
index a58579feb9de5982a09629dfe018e564c4e62b55..8b0211a0b56bec22e4823058dfa72c355e59d19d 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetChildrenImpl.java
@@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.List;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface GetChildrenImpl extends BackendTransactionImpl {
 
-  public abstract List<Integer> execute(Integer entity) throws TransactionException;
+  public abstract List<EntityID> execute(EntityID entity) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java
index ca63fac685ce97f75954b996ba9ee74013ae5b46..00c533dffb3ad067666f11d43f8469d9a7550e0a 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetDependentEntitiesImpl.java
@@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.List;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface GetDependentEntitiesImpl extends BackendTransactionImpl {
 
-  public abstract List<Integer> execute(Integer entity) throws TransactionException;
+  public abstract List<EntityID> execute(EntityID entity) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java
index d788a3570ebd045549420456814786b5e0b15b42..02cbc80731d1cc0d061f5aa9f080bea1364cdb7f 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetIDByNameImpl.java
@@ -24,9 +24,10 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.List;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface GetIDByNameImpl extends BackendTransactionImpl {
 
-  public abstract List<Integer> execute(String name, String role, String limit)
+  public abstract List<EntityID> execute(String name, String role, String limit)
       throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java
index 53aac4905a331a9f1e5fc71708cef9fdfa20efa5..762fa2d39ccad6a96f46246962de8746087b64a8 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/GetUpdateableChecksumsImpl.java
@@ -23,8 +23,9 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface GetUpdateableChecksumsImpl extends BackendTransactionImpl {
 
-  Integer execute() throws TransactionException;
+  EntityID execute() throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java
index e45fe9ead23f963c3010577de61be02e7c00042f..2406d4895487bdec5f271b41bf46207a48c7375d 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertEntityPropertiesImpl.java
@@ -25,11 +25,12 @@ package org.caosdb.server.database.backend.interfaces;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.FlatProperty;
 import org.caosdb.server.datatype.AbstractDatatype.Table;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.utils.Undoable;
 
 public interface InsertEntityPropertiesImpl extends BackendTransactionImpl, Undoable {
 
   public abstract void execute(
-      Integer domain, Integer integer, FlatProperty fp, Table table, Long unit_sig)
+      EntityID domain, EntityID entity, FlatProperty fp, Table table, Long unit_sig)
       throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java
index aa65abe60be758197c761be3d728437c53fefcf3..890ed6422aa7e39293dc6b64fbad710089e1cf83 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertParentsImpl.java
@@ -23,10 +23,11 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.utils.Undoable;
 
 public interface InsertParentsImpl extends BackendTransactionImpl, Undoable {
 
-  public abstract void execute(final Integer entity, final Integer parent)
+  public abstract void execute(final EntityID entity, final EntityID parent)
       throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java
index a0b7db433ef24c515946e3b4fb1556f2aa2a7c16..927238e6cf4b311886840695e9de13cc6f86c87c 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/InsertTransactionHistoryImpl.java
@@ -23,6 +23,7 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.utils.Undoable;
 
 public interface InsertTransactionHistoryImpl extends BackendTransactionImpl, Undoable {
@@ -33,6 +34,6 @@ public interface InsertTransactionHistoryImpl extends BackendTransactionImpl, Un
       final String user,
       long seconds,
       int nanos,
-      int entity)
+      EntityID entity)
       throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java
index 2e61c5fb1331ebd102e1e2034bc0ef6a47dcf5dc..10c18e43f07c927f049067a2767fe79f45f4990b 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/IsSubTypeImpl.java
@@ -23,8 +23,9 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface IsSubTypeImpl extends BackendTransactionImpl {
 
-  public abstract boolean execute(Integer child, Integer parent) throws TransactionException;
+  public abstract boolean execute(EntityID child, EntityID parent) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java
index 0aaa9707136ab1fc3cb498c80e2a1ad33771b746..8e5a55943176a557867925200230559609cf76c2 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllImpl.java
@@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.List;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface RetrieveAllImpl extends BackendTransactionImpl {
 
-  public abstract List<Integer> execute(String role) throws TransactionException;
+  public abstract List<EntityID> execute(String role) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java
index 031bfbf9a4566a6f5c1f7c017f86dcba81ed07ff..dc247bf6b2975f96185245813647662e8e9217f3 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveAllUncheckedFilesImpl.java
@@ -26,7 +26,22 @@ import java.util.Iterator;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
 
+/**
+ * Retrieve an iterator which iterates over all File entities which need to be consistency-checked.
+ *
+ * @author Timm Fitschen (t.fitschen@indiscale.com)
+ */
 public interface RetrieveAllUncheckedFilesImpl extends BackendTransactionImpl {
 
-  public Iterator<SparseEntity> execute(long ts, String location) throws TransactionException;
+  /**
+   * Return an iterator over all (non-directory) file entities which have not been
+   * consistency-checked since the (unix) timestamp `ts` and which are located below the directory
+   * `directory`.
+   *
+   * @param ts
+   * @param directory
+   * @return
+   * @throws TransactionException
+   */
+  public Iterator<SparseEntity> execute(long ts, String directory) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
index 230d4d34103603d5499532a7dc1a941cf82068e7..43266922ccc97584871f7b9ffa1559a442afd565 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveEntityACLImpl.java
@@ -25,5 +25,5 @@ import org.caosdb.server.database.proto.VerySparseEntity;
 
 public interface RetrieveEntityACLImpl extends BackendTransactionImpl {
 
-  public VerySparseEntity execute(Integer id);
+  public VerySparseEntity execute(Integer string);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java
index 1948be05dbb69cb0259184bf03413edd6c61dbb1..9bfddba10a8b548d1259adb22aac392a127a8b5e 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveParentsImpl.java
@@ -25,9 +25,10 @@ package org.caosdb.server.database.backend.interfaces;
 import java.util.ArrayList;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VerySparseEntity;
+import org.caosdb.server.entity.EntityID;
 
 public interface RetrieveParentsImpl extends BackendTransactionImpl {
 
-  public ArrayList<VerySparseEntity> execute(Integer id, String version)
+  public ArrayList<VerySparseEntity> execute(EntityID id, String version)
       throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java
index 54dba75e7b84dcae38d33a8bbd0245288dba65ee..dc1d5aa09653c9a4905dcc456a7037f4009bb838 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrievePropertiesImpl.java
@@ -25,8 +25,9 @@ package org.caosdb.server.database.backend.interfaces;
 import java.util.ArrayList;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.ProtoProperty;
+import org.caosdb.server.entity.EntityID;
 
 public interface RetrievePropertiesImpl extends BackendTransactionImpl {
 
-  public ArrayList<ProtoProperty> execute(Integer id, String version) throws TransactionException;
+  public ArrayList<ProtoProperty> execute(EntityID id, String version) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java
index df144c796b9349699432945c861ac42c44045db0..485b62899ecd1cd2c025b5928ed179a61e409fea 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveQueryTemplateDefinitionImpl.java
@@ -22,7 +22,9 @@
  */
 package org.caosdb.server.database.backend.interfaces;
 
+import org.caosdb.server.entity.EntityID;
+
 public interface RetrieveQueryTemplateDefinitionImpl extends BackendTransactionImpl {
 
-  public String retrieve(Integer id, String version);
+  public String retrieve(EntityID id, String version);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java
index 8bb790c98e2c45d788f7f1bd8ede6c7c4a2faa03..8b5c516b0d486a9bc6f7745c15eb999dffbe6182 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveSparseEntityImpl.java
@@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 
 public interface RetrieveSparseEntityImpl extends BackendTransactionImpl {
 
-  public SparseEntity execute(int id, String version) throws TransactionException;
+  public SparseEntity execute(EntityID id, String version) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java
index 50b6e13ca8eeb4b6b404ba3e9deb776111e5011e..1dbcbfb07e53cae2cd3289a87f5fedd7997cb1a9 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RetrieveVersionHistoryImpl.java
@@ -2,8 +2,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.HashMap;
 import org.caosdb.server.database.proto.VersionHistoryItem;
+import org.caosdb.server.entity.EntityID;
 
 public interface RetrieveVersionHistoryImpl extends BackendTransactionImpl {
 
-  public HashMap<String, VersionHistoryItem> execute(Integer entityId);
+  public HashMap<String, VersionHistoryItem> execute(EntityID entityId);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java
index a398353978b430bbc655ad78b1cadbfcc91f1d9e..8e6a6f2b039400c7fd74c0dbbdc6d91d61bf0210 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileCheckedTimestampImpl.java
@@ -23,8 +23,9 @@
 package org.caosdb.server.database.backend.interfaces;
 
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface SetFileCheckedTimestampImpl extends BackendTransactionImpl {
 
-  public void execute(Integer id, Long ts) throws TransactionException;
+  public void execute(EntityID id, Long ts) throws TransactionException;
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java
index ca33df8987aa4f82051feaaff936ea29455198a4..fdda7c542c644ccefe6fb83f8b30a043a74d6b54 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetFileChecksumImpl.java
@@ -1,6 +1,23 @@
 package org.caosdb.server.database.backend.interfaces;
 
+import org.caosdb.server.entity.EntityID;
+import org.caosdb.server.filesystem.Hash;
+
+/**
+ * Store the checksum and timestamp of the checksum for a File entity.
+ *
+ * @author Timm Fitschen (t.fitschen@indiscale.com)
+ */
 public interface SetFileChecksumImpl extends BackendTransactionImpl {
 
-  void execute(Integer id, String checksum);
+  /**
+   * Store the checksum of a File entity.
+   *
+   * <p>The entity is identified by the id.
+   *
+   * @param id
+   * @param checksum
+   * @param timestamp
+   */
+  void execute(EntityID id, Hash hash);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java
index aee26c5e53117028a9de91911cf9710a4164b6a7..53a0032fcab3b57d0f83a4843347a903c9078450 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/SetQueryTemplateDefinitionImpl.java
@@ -22,7 +22,9 @@
  */
 package org.caosdb.server.database.backend.interfaces;
 
+import org.caosdb.server.entity.EntityID;
+
 public interface SetQueryTemplateDefinitionImpl extends BackendTransactionImpl {
 
-  public void insert(Integer id, String queryTemplateDefinition);
+  public void insert(EntityID id, String queryTemplateDefinition);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java
index f45f5104283d7d27771a3e2a9b0a38772d4cccf0..5db82a5e3b71a2fbb6280277bc57f7ace951043f 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetAllNames.java
@@ -5,8 +5,8 @@ import java.util.List;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.GetAllNamesImpl;
 import org.caosdb.server.database.proto.SparseEntity;
-import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.RetrieveEntity;
 
 public class GetAllNames extends BackendTransaction {
 
@@ -22,7 +22,7 @@ public class GetAllNames extends BackendTransaction {
   public List<EntityInterface> getEntities() {
     ArrayList<EntityInterface> ret = new ArrayList<>();
     for (SparseEntity e : entities) {
-      ret.add(new Entity().parseSparseEntity(e));
+      ret.add(new RetrieveEntity().parseSparseEntity(e));
     }
     return ret;
   }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java
index 32bf8883b9f2662207352c8b80356b95f97d7d76..d0e2a809547ad2be4621ccab3f79d793dde70006 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetChildren.java
@@ -26,13 +26,14 @@ import java.util.List;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.GetChildrenImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class GetChildren extends BackendTransaction {
 
-  private final Integer entity;
-  private List<Integer> list;
+  private final EntityID entity;
+  private List<EntityID> list;
 
-  public GetChildren(final Integer entity) {
+  public GetChildren(final EntityID entity) {
     this.entity = entity;
   }
 
@@ -42,7 +43,7 @@ public class GetChildren extends BackendTransaction {
     this.list = t.execute(this.entity);
   }
 
-  public List<Integer> getList() {
+  public List<EntityID> getList() {
     return this.list;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java
index 067a422fd509b0987e0e5c8b69da1ee081c258a0..421fcaaed7c07e3bbbf0abb745e086260aad41d7 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetDependentEntities.java
@@ -26,16 +26,17 @@ import java.util.List;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.GetDependentEntitiesImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class GetDependentEntities extends BackendTransaction {
 
-  private final Integer entity;
+  private final EntityID entity;
 
-  public GetDependentEntities(final Integer entity) {
+  public GetDependentEntities(final EntityID entity) {
     this.entity = entity;
   }
 
-  private List<Integer> list;
+  private List<EntityID> list;
 
   @Override
   public void execute() throws TransactionException {
@@ -43,7 +44,7 @@ public class GetDependentEntities extends BackendTransaction {
     this.list = t.execute(this.entity);
   }
 
-  public List<Integer> getList() {
+  public List<EntityID> getList() {
     return this.list;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java
index b43db0010eeeb3179bb91333d854872f5e8ab18a..7855af4af3a7145bd5066875ffddc46585e599fd 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetIDByName.java
@@ -28,10 +28,11 @@ import org.caosdb.server.database.backend.interfaces.GetIDByNameImpl;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.exceptions.EntityWasNotUniqueException;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class GetIDByName extends BackendTransaction {
 
-  private List<Integer> list;
+  private List<EntityID> list;
   private final boolean unique;
   private final String name;
   private final String role;
@@ -74,11 +75,11 @@ public class GetIDByName extends BackendTransaction {
     }
   }
 
-  public List<Integer> getList() {
+  public List<EntityID> getList() {
     return this.list;
   }
 
-  public Integer getId() {
+  public EntityID getId() {
     return this.list.get(0);
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java
index eade9ea62168710e8928e52d1dc9176e366e0300..a9a8d280586c7f749a73940c14b178fd3c10ce64 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetUpdateableChecksums.java
@@ -25,10 +25,11 @@ package org.caosdb.server.database.backend.transaction;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.GetUpdateableChecksumsImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class GetUpdateableChecksums extends BackendTransaction {
 
-  private Integer next;
+  private EntityID next;
 
   @Override
   protected void execute() throws TransactionException {
@@ -36,7 +37,7 @@ public class GetUpdateableChecksums extends BackendTransaction {
     this.next = t.execute();
   }
 
-  public Integer getID() {
+  public EntityID getID() {
     return this.next;
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java
index bd5bf63a5eb7b194e119c56293e756ff0c4b6a20..f16e5f6b664f366917a42e387c112c8b4705297c 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityProperties.java
@@ -36,6 +36,7 @@ import org.caosdb.server.datatype.AbstractDatatype.Table;
 import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.IndexedSingleValue;
 import org.caosdb.server.datatype.SingleValue;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.StatementStatus;
@@ -71,12 +72,12 @@ public class InsertEntityProperties extends BackendTransaction {
       final InsertEntityPropertiesImpl t,
       final Deque<Integer> domainIds,
       final List<EntityInterface> stage1Inserts,
-      final Integer domain,
-      final Integer entity)
+      final EntityID domain,
+      final EntityID entity)
       throws TransactionException {
 
     for (final EntityInterface property : stage1Inserts) {
-      if (property.hasRole() && property.getRole() == Role.Domain && property.getId() == null) {
+      if (property.hasRole() && property.getRole() == Role.Domain && !property.hasId()) {
         property.setId(domainIds.removeFirst());
       }
       int pIdx;
@@ -92,11 +93,11 @@ public class InsertEntityProperties extends BackendTransaction {
       final FlatProperty fp = new FlatProperty();
       Table table = Table.null_data;
       Long unit_sig = null;
-      fp.id = property.getId();
+      fp.id = property.getId().toInteger();
       fp.idx = pIdx;
 
       if (property.hasReplacement()) {
-        if (property.getReplacement().getId() == null) {
+        if (!property.getReplacement().hasId()) {
           property.getReplacement().setId(domainIds.removeFirst());
         }
 
@@ -113,7 +114,7 @@ public class InsertEntityProperties extends BackendTransaction {
           if (property.getValue() instanceof CollectionValue) {
             // insert collection of values
             final CollectionValue v = (CollectionValue) property.getValue();
-            Iterator<IndexedSingleValue> iterator = v.iterator();
+            final Iterator<IndexedSingleValue> iterator = v.iterator();
             final SingleValue firstValue = iterator.next();
 
             // insert 2nd to nth item
@@ -128,7 +129,7 @@ public class InsertEntityProperties extends BackendTransaction {
                 table = vi.getTable();
               }
               t.execute(
-                  domain, (entity != null ? entity : property.getDomain()), fp, table, unit_sig);
+                  domain, entity != null ? entity : property.getDomain(), fp, table, unit_sig);
             }
 
             // insert first item
@@ -172,7 +173,7 @@ public class InsertEntityProperties extends BackendTransaction {
         }
       }
 
-      t.execute(domain, (entity != null ? entity : property.getDomain()), fp, table, unit_sig);
+      t.execute(domain, entity != null ? entity : property.getDomain(), fp, table, unit_sig);
     }
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java b/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java
index 683903f396a186c8243b6bba20c0d19e29a61688..7404572162ec5c85f3f940a723599e7bd200667f 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/IsSubType.java
@@ -25,19 +25,20 @@ package org.caosdb.server.database.backend.transaction;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.IsSubTypeImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class IsSubType extends BackendTransaction {
 
-  private final Integer child;
-  private Integer parent = null;
+  private final EntityID child;
+  private EntityID parent = null;
   private String parentName = null;
 
-  public IsSubType(final Integer child, final Integer parent) {
+  public IsSubType(final EntityID child, final EntityID parent) {
     this.child = child;
     this.parent = parent;
   }
 
-  public IsSubType(Integer child, String parent) {
+  public IsSubType(final EntityID child, final String parent) {
     this.parentName = parent;
     this.child = child;
   }
@@ -50,7 +51,7 @@ public class IsSubType extends BackendTransaction {
 
     if (this.parent == null) {
       this.isSubType = false;
-      for (Integer parent : execute(new GetIDByName(parentName, false)).getList()) {
+      for (final EntityID parent : execute(new GetIDByName(parentName, false)).getList()) {
         this.isSubType = t.execute(this.child, parent);
         if (this.isSubType) {
           return;
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java
index 7b6173ede59720234c58c6ca882e69e4dda9e6b2..e7f27afccec15a324a1247dc220cea79b62b7daf 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveAll.java
@@ -26,6 +26,7 @@ import java.util.List;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.RetrieveAllImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.container.TransactionContainer;
 
@@ -43,9 +44,9 @@ public class RetrieveAll extends BackendTransaction {
   public void execute() throws TransactionException {
     final RetrieveAllImpl t = getImplementation(RetrieveAllImpl.class);
 
-    final List<Integer> list = t.execute(this.role);
+    final List<EntityID> list = t.execute(this.role);
 
-    for (final Integer id : list) {
+    for (final EntityID id : list) {
       this.container.add(new RetrieveEntity(id));
     }
   }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java
index 56efbdd3864c5997758417ad02a97b663dfce6e5..b4a726da8d7b352f69df23a54371feef2d2201c5 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveDatatypes.java
@@ -28,6 +28,7 @@ import org.caosdb.server.database.backend.interfaces.RetrieveDatatypesImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VerySparseEntity;
 import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.container.Container;
@@ -45,7 +46,7 @@ public class RetrieveDatatypes extends BackendTransaction {
   public Container<? extends EntityInterface> getDatatypes() {
     final Container<Entity> ret = new Container<Entity>();
     for (final VerySparseEntity vse : this.list) {
-      final RetrieveEntity entity = new RetrieveEntity(vse.id);
+      final RetrieveEntity entity = new RetrieveEntity(new EntityID(vse.id));
       entity.setName(vse.name);
       entity.setDescription(vse.description);
       entity.setRole(vse.role);
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
index 9cb96112532fe249fd81c3e8d10d85ca900293d9..8ef143b44e292e5b100ff30ca023e91c0adb190e 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveEntityACLTransaction.java
@@ -25,15 +25,16 @@ import org.caosdb.server.database.CacheableBackendTransaction;
 import org.caosdb.server.database.backend.interfaces.RetrieveEntityACLImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VerySparseEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.permissions.EntityACL;
 
 public class RetrieveEntityACLTransaction
-    extends CacheableBackendTransaction<Integer, VerySparseEntity> {
+    extends CacheableBackendTransaction<EntityID, VerySparseEntity> {
 
-  private Integer id;
+  private EntityID id;
   private EntityACL entityAcl;
 
-  public RetrieveEntityACLTransaction(Integer id) {
+  public RetrieveEntityACLTransaction(EntityID id) {
     // TODO
     super(null);
     this.id = id;
@@ -42,7 +43,7 @@ public class RetrieveEntityACLTransaction
   @Override
   public VerySparseEntity executeNoCache() throws TransactionException {
     RetrieveEntityACLImpl t = getImplementation(RetrieveEntityACLImpl.class);
-    return t.execute(getKey());
+    return t.execute(getKey().toInteger());
   }
 
   @Override
@@ -51,7 +52,7 @@ public class RetrieveEntityACLTransaction
   }
 
   @Override
-  protected Integer getKey() {
+  protected EntityID getKey() {
     return id;
   }
 
@@ -59,13 +60,13 @@ public class RetrieveEntityACLTransaction
     return entityAcl;
   }
 
-  public RetrieveEntityACLTransaction reuse(Integer id) {
+  public RetrieveEntityACLTransaction reuse(EntityID id) {
     this.id = id;
     this.entityAcl = null;
     return this;
   }
 
-  public static void removeCached(Integer id) {
+  public static void removeCached(EntityID entityID) {
     // TODO
   }
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java
index e42b854e3284017059f8d0f6bf83a70ddfdfc165..eee73735a07cc2e152e0099bf5d027d1413631b4 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTransaction.java
@@ -31,6 +31,7 @@ import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.IndexedSingleValue;
 import org.caosdb.server.datatype.ReferenceValue;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
@@ -67,7 +68,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
     this.container = container;
   }
 
-  public RetrieveFullEntityTransaction(Integer id) {
+  public RetrieveFullEntityTransaction(final EntityID id) {
     this(new RetrieveEntity(id));
   }
 
@@ -81,9 +82,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    *
    * @param container
    */
-  public void retrieveFullEntitiesInContainer(Container<? extends EntityInterface> container) {
+  public void retrieveFullEntitiesInContainer(
+      final Container<? extends EntityInterface> container) {
     for (final EntityInterface e : container) {
-      if (e.hasId() && e.getId() > 0 && e.getEntityStatus() == EntityStatus.QUALIFIED) {
+      if (e.hasId() && !e.getId().isTemporary() && e.getEntityStatus() == EntityStatus.QUALIFIED) {
         retrieveFullEntity(e, e.getSelections());
       }
     }
@@ -100,7 +102,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * @param e The entity.
    * @param selections
    */
-  public void retrieveFullEntity(EntityInterface e, List<Selection> selections) {
+  public void retrieveFullEntity(final EntityInterface e, final List<Selection> selections) {
     if (!needMoreThanId(selections)) {
       return;
     }
@@ -180,15 +182,15 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * selected sub-properties).
    */
   private void resolveReferenceListProperty(
-      Property p, List<Selection> selections, String propertyName) {
+      final Property p, final List<Selection> selections, final String propertyName) {
     try {
       p.parseValue();
-    } catch (Message m) {
+    } catch (final Message m) {
       p.addError(m);
     }
 
-    CollectionValue values = (CollectionValue) p.getValue();
-    for (IndexedSingleValue sv : values) {
+    final CollectionValue values = (CollectionValue) p.getValue();
+    for (final IndexedSingleValue sv : values) {
       resolveReferenceValue((ReferenceValue) sv.getWrapped(), selections, propertyName);
     }
   }
@@ -198,10 +200,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * sub-properties).
    */
   private void resolveReferenceProperty(
-      Property p, List<Selection> selections, String propertyName) {
+      final Property p, final List<Selection> selections, final String propertyName) {
     try {
       p.parseValue();
-    } catch (Message m) {
+    } catch (final Message m) {
       p.addError(m);
     }
 
@@ -215,8 +217,8 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * #resolveReferenceProperty(Property, List, String)}.
    */
   private void resolveReferenceValue(
-      ReferenceValue value, List<Selection> selections, String propertyName) {
-    RetrieveEntity ref = new RetrieveEntity(value.getId());
+      final ReferenceValue value, final List<Selection> selections, final String propertyName) {
+    final RetrieveEntity ref = new RetrieveEntity(value.getId());
     // recursion! (Only for the matching selections)
     retrieveFullEntity(ref, getSubSelects(selections, propertyName));
     value.setEntity(ref, true);
@@ -228,10 +230,10 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * @param e
    * @param selections
    */
-  public void retrieveSubEntities(EntityInterface e, List<Selection> selections) {
+  public void retrieveSubEntities(final EntityInterface e, final List<Selection> selections) {
     for (final Selection s : selections) {
-      String propertyName = s.getSelector();
-      for (Property p : e.getProperties()) {
+      final String propertyName = s.getSelector();
+      for (final Property p : e.getProperties()) {
         if (s.getSubselection() != null) {
           // The presence of sub-selections means that the properties are
           // expected to be references (list or plain).
@@ -248,7 +250,8 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
               }
             } else {
               try {
-                boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType();
+                final boolean isSubtype =
+                    execute(new IsSubType(p.getId(), propertyName)).isSubType();
                 if (isSubtype) {
                   // ... handle reference properties that are a subtype of `propertyName`.
                   if (p.getValue() != null) {
@@ -263,7 +266,7 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
                   // wouldn't know what this property is supposed to be.
                   p.setName(propertyName);
                 }
-              } catch (EntityDoesNotExistException exc) {
+              } catch (final EntityDoesNotExistException exc) {
                 // unknown parent name.
               }
             }
@@ -273,11 +276,11 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
           if (!propertyName.equalsIgnoreCase(p.getName())) {
             // ... we only need to cover property sub-typing
             try {
-              boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType();
+              final boolean isSubtype = execute(new IsSubType(p.getId(), propertyName)).isSubType();
               if (isSubtype) {
                 p.setName(propertyName);
               }
-            } catch (EntityDoesNotExistException exc) {
+            } catch (final EntityDoesNotExistException exc) {
               // unknown parent name.
             }
           }
@@ -296,9 +299,9 @@ public class RetrieveFullEntityTransaction extends BackendTransaction {
    * @param select
    * @return A new list of Selections.
    */
-  public List<Selection> getSubSelects(List<Selection> selections, String select) {
-    List<Selection> result = new LinkedList<>();
-    for (Selection s : selections) {
+  public List<Selection> getSubSelects(final List<Selection> selections, final String select) {
+    final List<Selection> result = new LinkedList<>();
+    for (final Selection s : selections) {
       if (s.getSelector().equalsIgnoreCase(select) && s.getSubselection() != null) {
         result.add(s.getSubselection());
       }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java
index db35c45d52f40e5e6083770878dda4baed61a5a6..e82f1185d44bca9126ad7e19da5fe756060a4888 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RetrieveSparseEntity.java
@@ -31,8 +31,9 @@ import org.caosdb.server.database.DatabaseUtils;
 import org.caosdb.server.database.backend.interfaces.RetrieveSparseEntityImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
-import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.utils.EntityStatus;
 
 public class RetrieveSparseEntity extends CacheableBackendTransaction<String, SparseEntity> {
@@ -42,7 +43,7 @@ public class RetrieveSparseEntity extends CacheableBackendTransaction<String, Sp
       Cache.getCache("BACKEND_SparseEntities");
 
   /**
-   * To be called by {@link UpdateSparseEntity} and {@link DeleteSparseEntity} on execution.
+   * To be called by {@link UpdateSparseEntity} and {@link DeleteEntityTransaction} on execution.
    *
    * @param entity
    */
@@ -58,8 +59,8 @@ public class RetrieveSparseEntity extends CacheableBackendTransaction<String, Sp
     this.entity = entity;
   }
 
-  public RetrieveSparseEntity(final int id, final String version) {
-    this(new Entity(id));
+  public RetrieveSparseEntity(final EntityID id, final String version) {
+    this(new RetrieveEntity(id));
     this.entity.getVersion().setId(version);
   }
 
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java b/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java
index f7bf76c3d1cdcde7e712dd6d1ebe022c7300bea8..a96c028614baaaabe445e44cd0c4f5088db9ca42 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/SetFileCheckedTimestamp.java
@@ -25,13 +25,14 @@ package org.caosdb.server.database.backend.transaction;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.SetFileCheckedTimestampImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class SetFileCheckedTimestamp extends BackendTransaction {
 
   private final Long ts;
-  private final Integer id;
+  private final EntityID id;
 
-  public SetFileCheckedTimestamp(final Integer id, final Long ts) {
+  public SetFileCheckedTimestamp(final EntityID id, final Long ts) {
     this.id = id;
     this.ts = ts;
   }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java b/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java
index ee617a1c1110e9a01e9a6d6ee4c799e44cd66ab3..568528f8e779c578c5c45436d71ae016cf7611b8 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/VersionTransaction.java
@@ -31,6 +31,7 @@ import org.caosdb.server.database.CacheableBackendTransaction;
 import org.caosdb.server.database.backend.interfaces.RetrieveVersionHistoryImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.VersionHistoryItem;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Version;
 
@@ -43,11 +44,11 @@ import org.caosdb.server.entity.Version;
  * @author Timm Fitschen (t.fitschen@indiscale.com)
  */
 public abstract class VersionTransaction
-    extends CacheableBackendTransaction<Integer, HashMap<String, VersionHistoryItem>> {
+    extends CacheableBackendTransaction<EntityID, HashMap<String, VersionHistoryItem>> {
 
-  private static final ICacheAccess<Integer, HashMap<String, VersionHistoryItem>> cache =
+  private static final ICacheAccess<EntityID, HashMap<String, VersionHistoryItem>> cache =
       Cache.getCache("BACKEND_RetrieveVersionHistory");
-  private EntityInterface entity;
+  private final EntityInterface entity;
 
   /** A map of all history items which belong to this entity. The keys are the version ids. */
   private HashMap<String, VersionHistoryItem> historyItems;
@@ -57,30 +58,30 @@ public abstract class VersionTransaction
    *
    * @param entityId
    */
-  public static void removeCached(Integer entityId) {
+  public static void removeCached(final EntityID entityId) {
     cache.remove(entityId);
   }
 
-  public VersionTransaction(EntityInterface e) {
+  public VersionTransaction(final EntityInterface e) {
     super(cache);
     this.entity = e;
   }
 
   @Override
   public HashMap<String, VersionHistoryItem> executeNoCache() throws TransactionException {
-    RetrieveVersionHistoryImpl impl = getImplementation(RetrieveVersionHistoryImpl.class);
+    final RetrieveVersionHistoryImpl impl = getImplementation(RetrieveVersionHistoryImpl.class);
     return impl.execute(getKey());
   }
 
   /** After this method call, the version map is available to the object. */
   @Override
-  protected void process(HashMap<String, VersionHistoryItem> historyItems)
+  protected void process(final HashMap<String, VersionHistoryItem> historyItems)
       throws TransactionException {
     this.historyItems = historyItems;
   }
 
   @Override
-  protected Integer getKey() {
+  protected EntityID getKey() {
     return entity.getId();
   }
 
@@ -103,17 +104,18 @@ public abstract class VersionTransaction
    * @param transitive
    * @return A list of predecessors.
    */
-  protected List<Version> getPredecessors(String versionId, boolean transitive) {
-    LinkedList<Version> result = new LinkedList<>();
+  protected List<Version> getPredecessors(final String versionId, final boolean transitive) {
+    final LinkedList<Version> result = new LinkedList<>();
     if (getHistoryItems().containsKey(versionId)
-        && getHistoryItems().get(versionId).parents != null)
-      for (String p : getHistoryItems().get(versionId).parents) {
-        Version predecessor = getVersion(p);
+        && getHistoryItems().get(versionId).parents != null) {
+      for (final String p : getHistoryItems().get(versionId).parents) {
+        final Version predecessor = getVersion(p);
         if (transitive) {
           predecessor.setPredecessors(getPredecessors(p, transitive));
         }
         result.add(predecessor);
       }
+    }
     return result;
   }
 
@@ -137,15 +139,15 @@ public abstract class VersionTransaction
    * @param transitive
    * @return A list of successors.
    */
-  protected List<Version> getSuccessors(String versionId, boolean transitive) {
-    LinkedList<Version> result = new LinkedList<>();
+  protected List<Version> getSuccessors(final String versionId, final boolean transitive) {
+    final LinkedList<Version> result = new LinkedList<>();
 
     outer:
-    for (VersionHistoryItem i : getHistoryItems().values()) {
-      if (i.parents != null)
-        for (String p : i.parents) {
+    for (final VersionHistoryItem i : getHistoryItems().values()) {
+      if (i.parents != null) {
+        for (final String p : i.parents) {
           if (versionId.equals(p)) {
-            Version successor = getVersion(i.id);
+            final Version successor = getVersion(i.id);
             result.add(successor);
             if (transitive) {
               successor.setSuccessors(getSuccessors(i.id, transitive));
@@ -153,6 +155,7 @@ public abstract class VersionTransaction
             continue outer;
           }
         }
+      }
     }
     return result;
   }
diff --git a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
index 8dd9c22df4441db8b0fe882f613eb742106c983b..583145fb19361adf08ae81bf8c9e338d53ad908f 100644
--- a/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
+++ b/src/main/java/org/caosdb/server/datatype/AbstractDatatype.java
@@ -23,6 +23,7 @@
 package org.caosdb.server.datatype;
 
 import java.util.HashMap;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.container.Container;
@@ -48,7 +49,7 @@ public abstract class AbstractDatatype {
       new HashMap<String, AbstractDatatype>();
 
   protected String name = null;
-  protected Integer id = null;
+  protected EntityID id = null;
   protected String desc = null;
 
   public abstract Value parseValue(Object value) throws Message;
@@ -64,7 +65,7 @@ public abstract class AbstractDatatype {
     return ret;
   }
 
-  public static AbstractDatatype datatypeFactory(final Integer datatype) {
+  public static AbstractDatatype datatypeFactory(final EntityID datatype) {
     for (final AbstractDatatype abstractDatatype : instances.values()) {
       if (abstractDatatype.getId().equals(datatype)) {
         return abstractDatatype;
@@ -98,7 +99,7 @@ public abstract class AbstractDatatype {
     }
   }
 
-  public Integer getId() {
+  public EntityID getId() {
     return this.id;
   }
 
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
index 6d96d6deaae43d4d854875424129b7558d0fddf0..503e4679335381da6c08b746af8ed14665bd409b 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceDatatype2.java
@@ -22,6 +22,7 @@
  */
 package org.caosdb.server.datatype;
 
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 
@@ -38,11 +39,11 @@ public class ReferenceDatatype2 extends ReferenceDatatype {
   }
 
   @Override
-  public Integer getId() {
+  public EntityID getId() {
     return this.refid.getId();
   }
 
-  public void setId(final Integer id) {
+  public void setId(final EntityID id) {
     this.refid.setId(id);
   }
 
diff --git a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
index 525d3c43160adc4b47925c19cafe2acd2b6b2246..a24e2ddfda7faf333fd7d7f64420d4a6c7fdc290 100644
--- a/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
+++ b/src/main/java/org/caosdb/server/datatype/ReferenceValue.java
@@ -29,6 +29,7 @@ package org.caosdb.server.datatype;
 
 import java.util.Objects;
 import org.caosdb.server.datatype.AbstractDatatype.Table;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.utils.ServerMessages;
@@ -45,7 +46,7 @@ import org.jdom2.Element;
 public class ReferenceValue implements SingleValue {
   private EntityInterface entity = null;
   private String name = null;
-  private Integer id = null;
+  private EntityID id = null;
   private String version = null;
   private boolean versioned = false;
 
@@ -59,7 +60,7 @@ public class ReferenceValue implements SingleValue {
     } else if (reference instanceof ReferenceValue) {
       return (ReferenceValue) reference;
     } else if (reference instanceof GenericValue) {
-      String str = ((GenericValue) reference).toDatabaseString();
+      final String str = ((GenericValue) reference).toDatabaseString();
       return parseFromString(str);
     } else if (reference instanceof CollectionValue) {
       throw ServerMessages.DATA_TYPE_DOES_NOT_ACCEPT_COLLECTION_VALUES;
@@ -77,8 +78,8 @@ public class ReferenceValue implements SingleValue {
    *
    * <p>If parsing the entity ID part to an integer fails, a NumberFormatException may be thrown.
    */
-  public static ReferenceValue parseIdVersion(String str) {
-    String[] split = str.split("@", 2);
+  public static ReferenceValue parseIdVersion(final String str) {
+    final String[] split = str.split("@", 2);
     if (split.length == 2) {
       return new ReferenceValue(Integer.parseInt(split[0]), split[1]);
     } else {
@@ -92,7 +93,7 @@ public class ReferenceValue implements SingleValue {
    * <p>If the string looks like a valid "entityID@version" string, the result will have the
    * corresponding entity and version parts.
    */
-  public static ReferenceValue parseFromString(String str) {
+  public static ReferenceValue parseFromString(final String str) {
     try {
       return parseIdVersion(str);
     } catch (final NumberFormatException e) {
@@ -131,16 +132,16 @@ public class ReferenceValue implements SingleValue {
     return this.id.toString();
   }
 
-  public ReferenceValue(final EntityInterface entity, boolean versioned) {
+  public ReferenceValue(final EntityInterface entity, final boolean versioned) {
     this.versioned = versioned;
     this.entity = entity;
   }
 
-  public ReferenceValue(final Integer id) {
+  public ReferenceValue(final EntityID id) {
     this(id, null);
   }
 
-  public ReferenceValue(final Integer id, final String version) {
+  public ReferenceValue(final EntityID id, final String version) {
     this.id = id;
     this.version = version;
     this.versioned = version != null;
@@ -151,11 +152,19 @@ public class ReferenceValue implements SingleValue {
     this.name = name;
   }
 
+  public ReferenceValue(final int id, final String name) {
+    this(new EntityID(id), name);
+  }
+
+  public ReferenceValue(final int id) {
+    this(new EntityID(id));
+  }
+
   public final EntityInterface getEntity() {
     return this.entity;
   }
 
-  public final void setEntity(final EntityInterface entity, boolean versioned) {
+  public final void setEntity(final EntityInterface entity, final boolean versioned) {
     this.versioned = versioned;
     this.entity = entity;
   }
@@ -167,7 +176,7 @@ public class ReferenceValue implements SingleValue {
     return this.name;
   }
 
-  public final Integer getId() {
+  public final EntityID getId() {
     if (this.entity != null && this.entity.hasId()) {
       return this.entity.getId();
     }
@@ -181,7 +190,7 @@ public class ReferenceValue implements SingleValue {
     return this.version;
   }
 
-  public final void setId(final Integer id) {
+  public final void setId(final EntityID id) {
     this.id = id;
   }
 
diff --git a/src/main/java/org/caosdb/server/entity/DeleteEntity.java b/src/main/java/org/caosdb/server/entity/DeleteEntity.java
index 37377534f721a3d93455473b7a8a58fb7d50f287..38e8385ac88146809254ba0e0b39c8b4be55db85 100644
--- a/src/main/java/org/caosdb/server/entity/DeleteEntity.java
+++ b/src/main/java/org/caosdb/server/entity/DeleteEntity.java
@@ -26,11 +26,11 @@ package org.caosdb.server.entity;
 
 public class DeleteEntity extends Entity {
 
-  public DeleteEntity(final int id) {
+  public DeleteEntity(final EntityID id) {
     super(id);
   }
 
-  public DeleteEntity(int id, String version) {
+  public DeleteEntity(final EntityID id, final String version) {
     super(id);
     setVersion(new Version(version));
   }
diff --git a/src/main/java/org/caosdb/server/entity/InsertEntity.java b/src/main/java/org/caosdb/server/entity/InsertEntity.java
index 4f7c33015e6ba70fb3d062ff4b32c27ebd80b8a8..b88b319fc956d9d0ee4f34d99d9abef94819ea86 100644
--- a/src/main/java/org/caosdb/server/entity/InsertEntity.java
+++ b/src/main/java/org/caosdb/server/entity/InsertEntity.java
@@ -26,11 +26,15 @@ import org.jdom2.Element;
 
 public class InsertEntity extends WritableEntity {
 
-  public InsertEntity(final Element element) {
-    super(element);
+  public InsertEntity(final Element element, Role role) {
+    super(element, role);
   }
 
   public InsertEntity(String name, Role role) {
     super(name, role);
   }
+
+  public InsertEntity(Element e) {
+    super(e);
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/MagicTypes.java b/src/main/java/org/caosdb/server/entity/MagicTypes.java
index f17d448ca934901dc491f1d737f9122e2a67862a..289fae6e9164c66a8921b765a7275a0ac6a493e3 100644
--- a/src/main/java/org/caosdb/server/entity/MagicTypes.java
+++ b/src/main/java/org/caosdb/server/entity/MagicTypes.java
@@ -23,6 +23,7 @@
 package org.caosdb.server.entity;
 
 import java.util.HashMap;
+import java.util.Objects;
 import org.caosdb.server.entity.container.RetrieveContainer;
 import org.caosdb.server.transaction.Retrieve;
 
@@ -30,29 +31,39 @@ import org.caosdb.server.transaction.Retrieve;
 public enum MagicTypes {
   UNIT,
   NAME,
-  DESCRIPTION;
+  DESCRIPTION,
+  ROOT_DIRECTORY;
 
-  public int getId() {
+  private static final EntityID UNIT_ID = new EntityID(21);
+  private static final EntityID DESCRIPTION_ID = new EntityID(24);
+  private static final EntityID NAME_ID = new EntityID(20);
+  private static final EntityID ROOT_DIRECTORY_ID = new EntityID(51);
+
+  public EntityID getId() {
     switch (this) {
       case UNIT:
-        return 21;
+        return UNIT_ID;
       case NAME:
-        return 20;
+        return NAME_ID;
       case DESCRIPTION:
-        return 24;
+        return DESCRIPTION_ID;
+      case ROOT_DIRECTORY:
+        return ROOT_DIRECTORY_ID;
       default:
-        return -1;
+        return null;
     }
   }
 
-  public static MagicTypes getType(final int id) {
-    switch (id) {
+  public static MagicTypes getType(final EntityID id) {
+    switch (id.toInteger()) {
       case 21:
         return UNIT;
       case 20:
         return NAME;
       case 24:
         return DESCRIPTION;
+      case 51:
+        return ROOT_DIRECTORY;
       default:
         return null;
     }
@@ -85,7 +96,7 @@ public enum MagicTypes {
     final HashMap<MagicTypes, EntityInterface> ret = new HashMap<MagicTypes, EntityInterface>();
     for (final MagicTypes mt : MagicTypes.values()) {
       for (final EntityInterface e : container) {
-        if (e.getId() == mt.getId()) {
+        if (Objects.equals(e.getId(), mt.getId())) {
           ret.put(mt, e);
         }
       }
diff --git a/src/main/java/org/caosdb/server/entity/RetrieveEntity.java b/src/main/java/org/caosdb/server/entity/RetrieveEntity.java
index 35e34feda25c3ed7087c3c909a49a5833bce3698..2d1ca6f2175ca2377b7f1a73f847a48377cc4694 100644
--- a/src/main/java/org/caosdb/server/entity/RetrieveEntity.java
+++ b/src/main/java/org/caosdb/server/entity/RetrieveEntity.java
@@ -26,21 +26,33 @@ package org.caosdb.server.entity;
 
 public class RetrieveEntity extends Entity {
 
-  public RetrieveEntity(final int id) {
+  public RetrieveEntity() {
+    super();
+  }
+
+  public RetrieveEntity(final EntityID id) {
     super(id);
   }
 
+  public RetrieveEntity(final EntityID id, final Role role) {
+    super(id, role);
+  }
+
   public RetrieveEntity(final String name) {
     super(name);
   }
 
-  public RetrieveEntity(int id, String version) {
+  public RetrieveEntity(final EntityID id, final String version) {
     super(id);
     this.setVersion(new Version(version));
   }
 
-  public RetrieveEntity(String name, String version) {
+  public RetrieveEntity(final String name, final String version) {
     super(name);
     this.setVersion(new Version(version));
   }
+
+  public RetrieveEntity(final String name, final Role role) {
+    super(name, role);
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/Role.java b/src/main/java/org/caosdb/server/entity/Role.java
index 0ce45641b5280bca29a0d61b66a9435b9e3297e6..2c689500b3c1120bf74ae8d37f83718ac2c94d0d 100644
--- a/src/main/java/org/caosdb/server/entity/Role.java
+++ b/src/main/java/org/caosdb/server/entity/Role.java
@@ -36,18 +36,19 @@ public enum Role {
   File,
   Property,
   DataType,
-  QueryTemplate;
-  private static HashMap<Role, Integer> ids = null;
+  QueryTemplate,
+  Directory;
+  private static HashMap<Role, EntityID> ids = null;
 
   public static void init(final Access access) throws Exception {
-    ids = new HashMap<Role, Integer>();
+    ids = new HashMap<>();
 
     for (final Role r : Role.values()) {
       ids.put(r, execute(new GetIDByName(r.name(), "ROLE"), access).getId());
     }
   }
 
-  private static GetIDByName execute(GetIDByName getIDByName, Access access) {
+  private static GetIDByName execute(final GetIDByName getIDByName, final Access access) {
     getIDByName.setAccess(access);
     getIDByName.executeTransaction();
     return getIDByName;
@@ -62,7 +63,7 @@ public enum Role {
     throw new NoSuchRoleException("No such role '" + str + "'.");
   }
 
-  public Integer getId() {
+  public EntityID getId() {
     return ids.get(this);
   }
 
@@ -74,4 +75,8 @@ public enum Role {
         return new EntityToElementStrategy(toString());
     }
   }
+
+  public boolean hasFSODescriptor() {
+    return this == File || this == Directory;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/entity/UpdateEntity.java b/src/main/java/org/caosdb/server/entity/UpdateEntity.java
index c5727e8257e4826b25408f35577eee4bc588e6f5..45df0abac4d742cb024deb7f2327820cb71ebe8a 100644
--- a/src/main/java/org/caosdb/server/entity/UpdateEntity.java
+++ b/src/main/java/org/caosdb/server/entity/UpdateEntity.java
@@ -33,15 +33,27 @@ import org.jdom2.Element;
  */
 public class UpdateEntity extends WritableEntity {
 
+  public UpdateEntity(final Element element, Role role) {
+    super(element, role);
+  }
+
+  public UpdateEntity(Element e) {
+    this(e, Role.parse(e.getName()));
+  }
+
   /** The previous version of this entity. */
   private EntityInterface original = null;
 
-  public UpdateEntity(final Element element) {
-    super(element);
+  public UpdateEntity(final EntityID id, final Role role) {
+    super(id, role);
   }
 
-  public UpdateEntity(final Integer id, final Role role) {
-    super(id, role);
+  public UpdateEntity(final EntityID id) {
+    this(id, null);
+  }
+
+  public UpdateEntity() {
+    this((EntityID) null);
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/entity/WritableEntity.java b/src/main/java/org/caosdb/server/entity/WritableEntity.java
index 147feb0c43de65e9fa204207b29ae27df4251721..6c967cc4e3404c7940066dc123bf805785a6e4c3 100644
--- a/src/main/java/org/caosdb/server/entity/WritableEntity.java
+++ b/src/main/java/org/caosdb/server/entity/WritableEntity.java
@@ -25,15 +25,21 @@ import org.jdom2.Element;
 
 public class WritableEntity extends Entity {
 
-  public WritableEntity(final Element element) {
-    super(element);
+  public WritableEntity(final Element element, Role role) {
+    super();
+    setRole(role);
+    parseFromElement(element);
   }
 
   public WritableEntity(final String name, final Role role) {
     super(name, role);
   }
 
-  public WritableEntity(final Integer id, final Role role) {
+  public WritableEntity(Element e) {
+    super(e);
+  }
+
+  public WritableEntity(final EntityID id, final Role role) {
     super(id, role);
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/container/Container.java b/src/main/java/org/caosdb/server/entity/container/Container.java
index dc38041abe24d5b5d2e55e7ae698e092848b34c2..1618fbed6a1594891ea3ddc615f48869227f2c92 100644
--- a/src/main/java/org/caosdb/server/entity/container/Container.java
+++ b/src/main/java/org/caosdb/server/entity/container/Container.java
@@ -25,6 +25,7 @@
 package org.caosdb.server.entity.container;
 
 import java.util.ArrayList;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 
 public class Container<T extends EntityInterface> extends ArrayList<T> {
@@ -34,7 +35,7 @@ public class Container<T extends EntityInterface> extends ArrayList<T> {
   /**
    * Return the entity with the matching id, if it can be found inside this Container, else null.
    */
-  public T getEntityById(final Integer id) {
+  public T getEntityById(final EntityID id) {
     for (final T e : this) {
       if (e.hasId() && e.getId().equals(id)) {
         return e;
diff --git a/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java b/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java
index 466a93091e1a55d7f9d59c7d3a941058e4204a2e..a8c3e6a832848903884edda270e003a0c0dd6feb 100644
--- a/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java
+++ b/src/main/java/org/caosdb/server/entity/container/EntityByIdContainer.java
@@ -24,6 +24,7 @@ package org.caosdb.server.entity.container;
 
 import java.util.HashMap;
 import org.apache.shiro.subject.Subject;
+import org.caosdb.server.entity.EntityID;
 
 public abstract class EntityByIdContainer extends TransactionContainer {
   private static final long serialVersionUID = 7997517210502207523L;
@@ -36,7 +37,7 @@ public abstract class EntityByIdContainer extends TransactionContainer {
     super(user, timestamp, srid, flags);
   }
 
-  public abstract void add(int id);
+  public abstract void add(EntityID id);
 
-  public abstract void add(int id, String version);
+  public abstract void add(EntityID id, String version);
 }
diff --git a/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java b/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java
index 3b847f1af9d9d642c2606820dc2993f00911ed06..bc0da7c1de2bb876551d29ad7daffb50494f9720 100644
--- a/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java
+++ b/src/main/java/org/caosdb/server/entity/container/RetrieveContainer.java
@@ -24,6 +24,7 @@ package org.caosdb.server.entity.container;
 
 import java.util.HashMap;
 import org.apache.shiro.subject.Subject;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.RetrieveEntity;
 
 public class RetrieveContainer extends EntityByIdContainer {
@@ -39,7 +40,7 @@ public class RetrieveContainer extends EntityByIdContainer {
   }
 
   @Override
-  public void add(final int id) {
+  public void add(final EntityID id) {
     add(new RetrieveEntity(id));
   }
 
@@ -47,12 +48,12 @@ public class RetrieveContainer extends EntityByIdContainer {
     add(new RetrieveEntity(name));
   }
 
-  public void add(final String name, String version) {
+  public void add(final String name, final String version) {
     add(new RetrieveEntity(name, version));
   }
 
   @Override
-  public void add(int id, String version) {
+  public void add(final EntityID id, final String version) {
     add(new RetrieveEntity(id, version));
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/wrapper/Parent.java b/src/main/java/org/caosdb/server/entity/wrapper/Parent.java
index 00336f4a336ed3c7f35408e5996fa7adc936f42a..a2116ac3d0492e8c12487a5e9d6ddafc82b91df8 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/Parent.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/Parent.java
@@ -23,24 +23,13 @@
 package org.caosdb.server.entity.wrapper;
 
 import org.caosdb.server.entity.Affiliation;
-import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.xml.ParentToElementStrategy;
-import org.jdom2.Element;
 
 public class Parent extends EntityWrapper {
 
   private Affiliation affiliation;
 
-  public Parent() {
-    this(new Entity());
-  }
-
-  public Parent(final Element pe) {
-    this();
-    parseFromElement(pe);
-  }
-
   public Parent(final EntityInterface p) {
     super(p);
     setToElementStragegy(new ParentToElementStrategy());
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 064e2bd31fd329477d712c723ecd6462e94d3933..9a959e3528393c12c735ea4f9cb193137501b480 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java
@@ -28,26 +28,15 @@ import org.apache.shiro.subject.Subject;
 import org.caosdb.server.database.proto.FlatProperty;
 import org.caosdb.server.datatype.AbstractCollectionDatatype;
 import org.caosdb.server.datatype.GenericValue;
-import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
-import org.jdom2.Element;
+import org.caosdb.server.entity.xml.PropertyToElementStrategy;
 
 public class Property extends EntityWrapper {
 
-  public Property(final Integer id) {
-    super(new Entity(id));
-  }
-
-  public Property(final Element e) {
-    super(new Entity(e));
-  }
-
   public Property(final EntityInterface prop) {
     super(prop);
-  }
-
-  public Property() {
-    super(new Entity());
+    setToElementStragegy(new PropertyToElementStrategy());
   }
 
   /** Return the Property Index, the index of a property with respect to a containing Entity. */
@@ -70,7 +59,7 @@ public class Property extends EntityWrapper {
   }
 
   @Override
-  public Integer getDomain() {
+  public EntityID getDomain() {
     if (this.domain != null) {
       return this.domain.getId();
     }
diff --git a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java
index a274d269b2281ebed59530728c767cb1bca14f4a..7f6e6dcae9152091b854007149b0793cbff45542 100644
--- a/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java
+++ b/src/main/java/org/caosdb/server/entity/xml/EntityToElementStrategy.java
@@ -59,7 +59,7 @@ public class EntityToElementStrategy implements ToElementStrategy {
    * @param entity
    * @param element
    */
-  public void setDatatype(EntityInterface entity, Element element) {
+  public void setDatatype(final EntityInterface entity, final Element element) {
     if (entity.getDatatype().getName() != null) {
       element.setAttribute("datatype", entity.getDatatype().getName());
     } else {
@@ -89,7 +89,7 @@ public class EntityToElementStrategy implements ToElementStrategy {
       element.addContent(entity.getEntityACL().getPermissionsFor(SecurityUtils.getSubject()));
     }
     if (serializeFieldStrategy.isToBeSet("id") && entity.hasId()) {
-      element.setAttribute("id", Integer.toString(entity.getId()));
+      element.setAttribute("id", entity.getId().toString());
     }
     if (serializeFieldStrategy.isToBeSet("version") && entity.hasVersion()) {
       Element v = new VersionXMLSerializer().toElement(entity.getVersion());
@@ -148,7 +148,9 @@ public class EntityToElementStrategy implements ToElementStrategy {
    * @param serializeFieldStrategy
    */
   public void setValue(
-      EntityInterface entity, Element element, SerializeFieldStrategy serializeFieldStrategy) {
+      final EntityInterface entity,
+      final Element element,
+      final SerializeFieldStrategy serializeFieldStrategy) {
     if (entity.hasValue()) {
       try {
         entity.parseValue();
@@ -161,7 +163,7 @@ public class EntityToElementStrategy implements ToElementStrategy {
       if (entity.isReference() && serializeFieldStrategy.isToBeSet("_referenced")) {
         // Append the complete entity. This needs to be done when we are
         // processing SELECT Queries.
-        EntityInterface ref = ((ReferenceValue) entity.getValue()).getEntity();
+        final EntityInterface ref = ((ReferenceValue) entity.getValue()).getEntity();
         if (ref != null) {
           if (entity.hasDatatype()) {
             setDatatype(entity, element);
@@ -175,22 +177,23 @@ public class EntityToElementStrategy implements ToElementStrategy {
         // Append the all referenced entities. This needs to be done when we are
         // processing SELECT Queries.
         boolean skipValue = false;
-        for (IndexedSingleValue sv : ((CollectionValue) entity.getValue())) {
-          EntityInterface ref = ((ReferenceValue) sv.getWrapped()).getEntity();
+        for (final IndexedSingleValue sv : (CollectionValue) entity.getValue()) {
+          final EntityInterface ref = ((ReferenceValue) sv.getWrapped()).getEntity();
           if (ref != null) {
             if (entity.hasDatatype()) {
               setDatatype(entity, element);
             }
-            Element valueElem = new Element("Value");
+            final Element valueElem = new Element("Value");
             ref.addToElement(valueElem, serializeFieldStrategy);
             element.addContent(valueElem);
             skipValue = true;
           }
         }
-        if (skipValue)
+        if (skipValue) {
           // the referenced entity has been appended. Return here to suppress
           // adding the reference id as well.
           return;
+        }
       }
 
       if (serializeFieldStrategy.isToBeSet("value")) {
diff --git a/src/main/java/org/caosdb/server/jobs/Job.java b/src/main/java/org/caosdb/server/jobs/Job.java
index 675686aa797cd2a00cf7a921a29e81ce144db179..e709d0746eb7d159dece2b5bebe2818615fe072e 100644
--- a/src/main/java/org/caosdb/server/jobs/Job.java
+++ b/src/main/java/org/caosdb/server/jobs/Job.java
@@ -26,6 +26,7 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Objects;
 import java.util.Set;
 import org.apache.shiro.subject.Subject;
 import org.caosdb.server.CaosDBException;
@@ -40,6 +41,7 @@ import org.caosdb.server.database.exceptions.TransactionException;
 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.Message;
 import org.caosdb.server.entity.container.ParentContainer;
@@ -106,7 +108,7 @@ public abstract class Job {
     }
   }
 
-  protected EntityInterface getEntityById(final int id) {
+  protected EntityInterface getEntityById(final EntityID id) {
     return getContainer().getEntityById(id);
   }
 
@@ -133,7 +135,7 @@ public abstract class Job {
   }
 
   /** to be overridden */
-  protected abstract void run();
+  protected abstract void run() throws Message;
 
   protected void runJobFromSchedule(
       final EntityInterface entity, final Class<? extends Job> jobclass) {
@@ -152,7 +154,7 @@ public abstract class Job {
     this.failureSeverity = severiy;
   }
 
-  TransactionContainer getContainer() {
+  protected TransactionContainer getContainer() {
     return getTransaction().getContainer();
   }
 
@@ -177,7 +179,7 @@ public abstract class Job {
    *     names match.
    * @throws Message
    */
-  protected final boolean isSubType(final EntityInterface child, final EntityInterface targetParent)
+  protected final boolean isSubType(final EntityInterface child, EntityInterface targetParent)
       throws EntityWasNotUniqueException {
     if (targetParent.hasId()) {
       if (targetParent.getId().equals(child.getId())) {
@@ -187,6 +189,8 @@ public abstract class Job {
     } else if (targetParent.hasName()) {
       if (targetParent.getName().equals(child.getName())) {
         return true;
+      } else {
+        targetParent = resolve(targetParent);
       }
     }
 
@@ -199,7 +203,10 @@ public abstract class Job {
     }
     for (final Parent directParent : directParents) {
       EntityInterface resolvedDirectParent = null;
-      if (directParent.hasId()) {
+      if (directParent.hasId() && targetParent.hasId()) {
+        if (directParent.getId().equals(targetParent.getId())) {
+          return true;
+        }
         resolvedDirectParent = getEntityById(directParent.getId());
       } else if (directParent.hasName()) {
         resolvedDirectParent = getEntityByName(directParent.getName());
@@ -223,7 +230,7 @@ public abstract class Job {
     return false;
   }
 
-  protected final boolean isValidSubType(final int child, final int parent) {
+  protected final boolean isValidSubType(final EntityID child, final EntityID parent) {
     if (!"false".equals(getContainer().getFlags().get("cache"))) {
       final HashMap<String, Boolean> isSubTypeCache = getCache("isSubType");
       final String key = child + "->" + parent;
@@ -240,8 +247,8 @@ public abstract class Job {
     }
   }
 
-  protected final boolean isValidSubTypeNoCache(final int child, final int parent) {
-    return child == parent || execute(new IsSubType(child, parent)).isSubType();
+  protected final boolean isValidSubTypeNoCache(final EntityID child, final EntityID parent) {
+    return Objects.equals(child, parent) || execute(new IsSubType(child, parent)).isSubType();
   }
 
   protected final EntityInterface retrieveValidSparseEntityByName(final String name)
@@ -250,7 +257,7 @@ public abstract class Job {
   }
 
   protected final EntityInterface retrieveValidSparseEntityById(
-      final Integer id, final String version) throws Message {
+      final EntityID id, final String version) throws Message {
 
     String resulting_version = version;
     if (version == null || version.equals("HEAD")) {
@@ -285,11 +292,11 @@ public abstract class Job {
     return ret;
   }
 
-  protected final EntityInterface retrieveValidEntity(final Integer id) {
+  protected final EntityInterface retrieveValidEntity(final EntityID id) {
     return execute(new RetrieveFullEntityTransaction(id)).getContainer().get(0);
   }
 
-  protected final Integer retrieveValidIDByName(final String name) {
+  protected final EntityID retrieveValidIDByName(final String name) {
     return execute(new GetIDByName(name)).getId();
   }
 
@@ -379,12 +386,13 @@ public abstract class Job {
       return new ArrayList<Job>();
     }
     if (dt instanceof ReferenceDatatype2) {
-      return jobConfig.getConfiguredJobs(0, 17, entity, transaction);
+      return jobConfig.getConfiguredJobs(
+          EntityID.DEFAULT_DOMAIN, new EntityID(17), entity, transaction);
     } else if (dt instanceof AbstractCollectionDatatype) {
       final AbstractDatatype datatype = ((AbstractCollectionDatatype) dt).getDatatype();
       return loadDataTypeSpecificJobs(datatype, entity, transaction);
     } else if (dt.getId() != null) {
-      return jobConfig.getConfiguredJobs(0, dt.getId(), entity, transaction);
+      return jobConfig.getConfiguredJobs(EntityID.DEFAULT_DOMAIN, dt.getId(), entity, transaction);
     } else {
       return null;
     }
@@ -403,7 +411,8 @@ public abstract class Job {
     }
 
     // load general rules
-    final List<Job> generalRules = jobConfig.getConfiguredJobs(0, 0, entity, transaction);
+    final List<Job> generalRules =
+        jobConfig.getConfiguredJobs(EntityID.DEFAULT_DOMAIN, new EntityID(0), entity, transaction);
     if (generalRules != null) {
       jobs.addAll(generalRules);
     }
@@ -411,7 +420,8 @@ public abstract class Job {
     // load Role specific rules
     if (entity.hasRole()) {
       final List<Job> roleRules =
-          jobConfig.getConfiguredJobs(0, entity.getRole().getId(), entity, transaction);
+          jobConfig.getConfiguredJobs(
+              EntityID.DEFAULT_DOMAIN, entity.getRole().getId(), entity, transaction);
       if (roleRules != null) {
         jobs.addAll(roleRules);
       }
@@ -457,19 +467,21 @@ public abstract class Job {
     // general rules, role rules, data type rules
     jobs.addAll(loadStandardJobs(entity, transaction));
 
+    // TODO move to job
     // load flag jobs
     if (!entity.getFlags().isEmpty()) {
       for (final String key : entity.getFlags().keySet()) {
         final Job j = getJob(key, JobFailureSeverity.ERROR, entity, transaction);
         if (j != null) {
-          if (j instanceof FlagJob) {
-            ((FlagJob) j).setValue(entity.getFlag(key));
+          if (j instanceof EntityFlagJob) {
+            ((EntityFlagJob) j).setValue(entity.getFlag(key));
           }
           jobs.add(j);
         }
       }
     }
 
+    // TODO move to job
     // load parent flag jobs
     if (entity.hasParents()) {
       for (final EntityInterface p : entity.getParents()) {
@@ -477,8 +489,8 @@ public abstract class Job {
           for (final String key : p.getFlags().keySet()) {
             final Job j = getJob(key, JobFailureSeverity.ERROR, entity, transaction);
             if (j != null) {
-              if (j instanceof FlagJob) {
-                ((FlagJob) j).setValue(p.getFlag(key));
+              if (j instanceof EntityFlagJob) {
+                ((EntityFlagJob) j).setValue(p.getFlag(key));
               }
               jobs.add(j);
             }
@@ -553,7 +565,7 @@ public abstract class Job {
     if (!entity.hasId() && entity.hasName()) {
       resolvedEntity = getEntityByName(entity.getName());
       if (resolvedEntity == null) {
-        final Integer eid = retrieveValidIDByName(entity.getName());
+        final EntityID eid = retrieveValidIDByName(entity.getName());
         entity.setId(eid);
       }
     }
@@ -561,7 +573,7 @@ public abstract class Job {
     if (entity.hasId()) {
       // get entity from container
       resolvedEntity = getEntityById(entity.getId());
-      if (resolvedEntity == null && entity.getId() > 0) {
+      if (resolvedEntity == null && !entity.getId().isTemporary()) {
         resolvedEntity = retrieveValidEntity(entity.getId());
       }
     }
diff --git a/src/main/java/org/caosdb/server/jobs/JobConfig.java b/src/main/java/org/caosdb/server/jobs/JobConfig.java
index 732a985a78b5f67c88d1c01dff1565e887aab13c..40917b36714ee95ef491a266580068a06f51703a 100644
--- a/src/main/java/org/caosdb/server/jobs/JobConfig.java
+++ b/src/main/java/org/caosdb/server/jobs/JobConfig.java
@@ -32,6 +32,7 @@ import java.util.List;
 import java.util.Map;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.ServerProperties;
+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;
@@ -116,7 +117,7 @@ public class JobConfig {
   }
 
   /** Generate a unique key (for class-internal use only). */
-  private String getKey(final Integer domain, final Integer entity, final String transaction) {
+  private String getKey(final EntityID domain, final EntityID entity, final String transaction) {
     final StringBuilder sb = new StringBuilder();
     sb.append("<");
     sb.append(domain);
@@ -145,7 +146,7 @@ public class JobConfig {
       final String transaction = row[2];
       final String job = row[3];
       final JobFailureSeverity severity = JobFailureSeverity.valueOf(row[4]);
-      final String key = getKey(domain, entity, transaction);
+      final String key = getKey(new EntityID(domain), new EntityID(entity), transaction);
       if (!result.containsKey(key)) {
         result.put(key, new ArrayList<>());
       }
@@ -167,8 +168,8 @@ public class JobConfig {
    * @return Fresh job instances, one for each matching job rule.
    */
   public List<Job> getConfiguredJobs(
-      final Integer domain,
-      final Integer entity,
+      final EntityID domain,
+      final EntityID entity,
       final EntityInterface target,
       final Transaction<? extends TransactionContainer> transaction) {
     String transactionType;
diff --git a/src/main/java/org/caosdb/server/jobs/JobTarget.java b/src/main/java/org/caosdb/server/jobs/JobTarget.java
index 764c70250fd050bc5a1962db8bd5bc4006ae0a70..27aa0d9184575d87283989f18f144683668c4b45 100644
--- a/src/main/java/org/caosdb/server/jobs/JobTarget.java
+++ b/src/main/java/org/caosdb/server/jobs/JobTarget.java
@@ -22,7 +22,11 @@
  */
 package org.caosdb.server.jobs;
 
+import org.caosdb.server.entity.Message;
+
 public interface JobTarget {
 
   public boolean skipJob();
+
+  public void addError(Message m);
 }
diff --git a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
index 0ef0ac143428eaddaf857f063b7953a620f47ee6..2122b34de5f0b60db4c2b6d4c1c2358d3df02851 100644
--- a/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
+++ b/src/main/java/org/caosdb/server/jobs/ScheduledJob.java
@@ -20,6 +20,8 @@
 
 package org.caosdb.server.jobs;
 
+import org.caosdb.server.entity.Message;
+
 /**
  * ScheduledJob is a wrapper class for jobs held by the Scheduler.
  *
@@ -41,10 +43,14 @@ public class ScheduledJob {
     this.job = job;
   }
 
-  void run() {
+  public void run() {
     if (!hasStarted()) {
       start();
-      this.job.run();
+      try {
+        this.job.run();
+      } catch (final Message m) {
+        this.job.getTarget().addError(m);
+      }
       finish();
     }
   }
@@ -86,7 +92,11 @@ public class ScheduledJob {
   }
 
   public boolean skip() {
-    return this.job.getTarget().skipJob();
+    try {
+      return this.job.getTarget().skipJob();
+    } catch (final NullPointerException e) {
+      throw e;
+    }
   }
 
   public Job getJob() {
diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
index 724dd89844097dad5bd1a6fbf2102c8f2c4ceb8c..4217c55e1153dafc302630823873fc75640ca9be 100644
--- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
+++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java
@@ -102,7 +102,7 @@ public class AccessControl extends ContainerJob {
       // special annotations permission
       if (e.hasParents() && e.getParents().size() == 1) {
         final Parent par1 = e.getParents().get(0);
-        if (par1.hasId() && par1.getId() > 0) {
+        if (par1.hasId() && !par1.getId().isTemporary()) {
           execute(new RetrieveSparseEntity(par1));
         }
         if (par1.hasName()
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java b/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java
index 01d5a2de394180ff474600b4597e28e5356d9b3d..d60db5a3ea2f58caefe240894920318e01efc8a6 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckChildDependencyExistent.java
@@ -23,7 +23,9 @@
 package org.caosdb.server.jobs.core;
 
 import java.util.List;
+import java.util.Objects;
 import org.caosdb.server.database.backend.transaction.GetChildren;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.utils.EntityStatus;
@@ -39,12 +41,13 @@ public class CheckChildDependencyExistent extends EntityJob {
 
   @Override
   public final void run() {
-    if (getEntity().getDomain() == null || getEntity().getDomain() == 0) {
+    if (getEntity().getDomain() == null
+        || Objects.equals(getEntity().getDomain(), EntityID.DEFAULT_DOMAIN)) {
 
-      final List<Integer> children = execute(new GetChildren(getEntity().getId())).getList();
+      final List<EntityID> children = execute(new GetChildren(getEntity().getId())).getList();
 
       // loop:
-      for (final Integer id : children) {
+      for (final EntityID id : children) {
         final EntityInterface foreign = getEntityById(id);
         if (foreign == null) {
           // if the child is not in the container, the test fails.
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 dd87d5298365a4b95abc52c66c17823c5c52687a..40e01d2636509774555f1514c75bb0bf16870539 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckDatatypePresent.java
@@ -134,7 +134,7 @@ public final class CheckDatatypePresent extends EntityJob {
         assertAllowedToUse(validDatatypeEntity);
         datatype.setId(validDatatypeEntity.getId());
       }
-    } else if (datatype.getId() < 0) {
+    } else if (datatype.getId().isTemporary()) {
       final EntityInterface datatypeEntity = getEntityById(datatype.getId());
 
       // if the container carried a corresponding entity
@@ -160,7 +160,7 @@ public final class CheckDatatypePresent extends EntityJob {
   }
 
   private void checkIfOverride() throws Message {
-    if (getEntity().hasId() && getEntity().getId() > 0) {
+    if (getEntity().hasId() && !getEntity().getId().isTemporary()) {
       // get data type from database
       final EntityInterface foreign = retrieveValidSparseEntityById(getEntity().getId(), null);
 
@@ -188,11 +188,11 @@ public final class CheckDatatypePresent extends EntityJob {
   private void inheritDatatypeFromAbstractEntity() throws Message {
     // if this is a record type property or a concrete property, assign
     // the data type of the corresponding abstract property.
-    if (getEntity().hasId() && getEntity().getId() > 0) {
+    if (getEntity().hasId() && !getEntity().getId().isTemporary()) {
       // get from data base
       final EntityInterface foreign = retrieveValidSparseEntityById(getEntity().getId(), null);
       inheritDatatypeFromForeignEntity(foreign);
-    } else if (getEntity().hasId() && getEntity().getId() < 0) {
+    } else if (getEntity().hasId() && getEntity().getId().isTemporary()) {
       // get from container
       final EntityInterface foreign = getEntityById(getEntity().getId());
       inheritDatatypeFromForeignEntity(foreign);
@@ -228,7 +228,7 @@ public final class CheckDatatypePresent extends EntityJob {
     AbstractDatatype datatype = null;
     for (final EntityInterface parent : getEntity().getParents()) {
       EntityInterface parentEntity = null;
-      if (parent.getId() > 0) {
+      if (!parent.getId().isTemporary()) {
         parentEntity = retrieveValidSparseEntityById(parent.getId(), null);
       } else {
         parentEntity = getEntityById(parent.getId());
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
index d3b28bd5f158b767469e6d7fcc3cebe9fa75edb8..7045c7df43d0831a99e7acea5e6dc8c7d4abee9e 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckParValid.java
@@ -66,7 +66,7 @@ public class CheckParValid extends EntityJob {
 
           if (parent.hasId()) {
             // check parent by id
-            if (parent.getId() >= 0) {
+            if (!parent.getId().isTemporary()) {
               // id >= 0 (parent is yet in the database)
               // retrieve parent by id
               final EntityInterface foreign = retrieveValidSparseEntityById(parent.getId(), null);
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
index eeea52b85b9c1629b426660020c7e65f0e4b96ef..23a92340f5befbfbe7ded2fe95d3244b5ff78594 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckPropValid.java
@@ -56,7 +56,7 @@ public class CheckPropValid extends EntityJob {
 
           // does this property have an id at all?
           if (property.hasId()) {
-            if (property.getId() >= 0) {
+            if (!property.getId().isTemporary()) {
 
               final EntityInterface abstractProperty =
                   retrieveValidSparseEntityById(property.getId(), null);
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java b/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java
index c59eededd391645737b614f5f2e97699160c8cf7..2edbc5a270db93312c73b8c960c615a161e8907b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckReferenceDependencyExistent.java
@@ -23,7 +23,9 @@
 package org.caosdb.server.jobs.core;
 
 import java.util.List;
+import java.util.Objects;
 import org.caosdb.server.database.backend.transaction.GetDependentEntities;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.EntityJob;
 import org.caosdb.server.utils.EntityStatus;
@@ -39,15 +41,16 @@ import org.caosdb.server.utils.ServerMessages;
 public class CheckReferenceDependencyExistent extends EntityJob {
   @Override
   public final void run() {
-    if (getEntity().getDomain() == null || getEntity().getDomain() == 0) {
+    if (getEntity().getDomain() == null
+        || Objects.equals(getEntity().getDomain(), EntityID.DEFAULT_DOMAIN)) {
       // if (getContainer().contains(getEntity())) {
 
       // retrieve dependent entities
-      final List<Integer> depends =
+      final List<EntityID> depends =
           execute(new GetDependentEntities(getEntity().getId())).getList();
 
       // loop:
-      for (final Integer id : depends) {
+      for (final EntityID id : depends) {
         final EntityInterface foreign = getEntityById(id);
         if (foreign == null) {
           // dependent entity is not in the container and will not be
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
index e739ffde01a38fb1539c97166014350e9f9c61d7..0b8ba45b1cae19812641ed733be7aacc2fb78575 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidIsaParRefid.java
@@ -29,6 +29,7 @@ import org.caosdb.server.datatype.IndexedSingleValue;
 import org.caosdb.server.datatype.ReferenceDatatype2;
 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.entity.Role;
@@ -85,7 +86,7 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer {
                   && rv.getEntity().hasRole()
                   && rv.getEntity().getRole() == Role.File) {
               } else if (rv.getId() != null
-                  && rv.getId() < 0
+                  && rv.getId().isTemporary()
                   && getEntityById(rv.getId()) != null
                   && getEntityById(rv.getId()).getRole() == Role.File) {
               } else if (rv.getId() == null
@@ -93,7 +94,7 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer {
                   && getEntityByName(rv.getName()) != null
                   && getEntityByName(rv.getName()).getRole() == Role.File) {
               } else if (rv.getId() != null
-                  && rv.getId() > 0
+                  && !rv.getId().isTemporary()
                   && retrieveValidSparseEntityById(rv.getId(), rv.getVersion()).getRole()
                       == Role.File) {
               } else if (rv.getName() != null
@@ -125,13 +126,13 @@ public class CheckRefidIsaParRefid extends EntityJob implements Observer {
     }
   }
 
-  private boolean isSubType(final Integer child, final Integer parent) throws Message {
+  private boolean isSubType(final EntityID child, final EntityID parent) throws Message {
     if (child.equals(parent)) {
       return true;
-    } else if (child > 0 && parent > 0) {
+    } else if (!child.isTemporary() && !parent.isTemporary()) {
       // check with database
       return isValidSubType(child, parent);
-    } else if (child < 0) {
+    } else if (child.isTemporary()) {
       // get parent of ref from container
       final EntityInterface refEntity = getEntityById(child);
       for (final Parent par : refEntity.getParents()) {
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 645f87d0b2eb0bfc045eb3d4237a40b702c044a3..12b545b8e6fd608e20851d37f34e809acfcd1544 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckRefidValid.java
@@ -84,7 +84,7 @@ public class CheckRefidValid extends EntityJob implements Observer {
 
   private void checkRefValue(final ReferenceValue ref) throws Message {
     if (ref.getId() != null) {
-      if (ref.getId() >= 0) {
+      if (!ref.getId().isTemporary()) {
         final EntityInterface referencedValidEntity =
             retrieveValidSparseEntityById(ref.getId(), ref.getVersion());
         assertAllowedToUse(referencedValidEntity);
diff --git a/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java b/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java
index 16fe593654aad760edc2b8efc2e6889222bfa78e..a4c50f8893935d7bbd6091b970b32a8811a08d93 100644
--- a/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java
+++ b/src/main/java/org/caosdb/server/jobs/core/EntityStateJob.java
@@ -44,6 +44,7 @@ import org.caosdb.server.datatype.ReferenceValue;
 import org.caosdb.server.datatype.TextDatatype;
 import org.caosdb.server.entity.ClientMessage;
 import org.caosdb.server.entity.DeleteEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
@@ -148,17 +149,17 @@ public abstract class EntityStateJob extends EntityJob {
    */
   public class Transition {
 
-    private String name;
-    private String description;
-    private State fromState;
-    private State toState;
-    private Map<String, String> transitionProperties;
+    private final String name;
+    private final String description;
+    private final State fromState;
+    private final State toState;
+    private final Map<String, String> transitionProperties;
 
     /**
      * @param transition The transition Entity, from which the Transition is created. Relevant
      *     Properties are "to" and "from"
      */
-    public Transition(EntityInterface transition) throws Message {
+    public Transition(final EntityInterface transition) throws Message {
       this.name = transition.getName();
       this.description = transition.getDescription();
       this.fromState = getFromState(transition);
@@ -166,9 +167,9 @@ public abstract class EntityStateJob extends EntityJob {
       this.transitionProperties = getTransitionProperties(transition);
     }
 
-    private Map<String, String> getTransitionProperties(EntityInterface transition) {
-      Map<String, String> result = new LinkedHashMap<>();
-      for (Property p : transition.getProperties()) {
+    private Map<String, String> getTransitionProperties(final EntityInterface transition) {
+      final Map<String, String> result = new LinkedHashMap<>();
+      for (final Property p : transition.getProperties()) {
         if (p.getDatatype() instanceof TextDatatype) {
           result.put(p.getName(), p.getValue().toString());
         }
@@ -176,8 +177,8 @@ public abstract class EntityStateJob extends EntityJob {
       return result;
     }
 
-    private State getToState(EntityInterface transition) throws Message {
-      for (Property p : transition.getProperties()) {
+    private State getToState(final EntityInterface transition) throws Message {
+      for (final Property p : transition.getProperties()) {
         if (p.getName().equals(TO_STATE_PROPERTY_NAME)) {
           return createState(p);
         }
@@ -185,8 +186,8 @@ public abstract class EntityStateJob extends EntityJob {
       return null;
     }
 
-    private State getFromState(EntityInterface transition) throws Message {
-      for (Property p : transition.getProperties()) {
+    private State getFromState(final EntityInterface transition) throws Message {
+      for (final Property p : transition.getProperties()) {
         if (p.getName().equals(FROM_STATE_PROPERTY_NAME)) {
           return createState(p);
         }
@@ -198,7 +199,7 @@ public abstract class EntityStateJob extends EntityJob {
      * @param previousState
      * @return true iff the previous state is a fromState of this transition.
      */
-    public boolean isFromState(State previousState) {
+    public boolean isFromState(final State previousState) {
       return this.fromState.equals(previousState);
     }
 
@@ -206,7 +207,7 @@ public abstract class EntityStateJob extends EntityJob {
      * @param nextState
      * @return true iff the next state is a toState of this transition.
      */
-    public boolean isToState(State nextState) {
+    public boolean isToState(final State nextState) {
       return this.toState.equals(nextState);
     }
 
@@ -219,9 +220,9 @@ public abstract class EntityStateJob extends EntityJob {
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
       if (obj instanceof Transition) {
-        Transition that = (Transition) obj;
+        final Transition that = (Transition) obj;
         return Objects.equals(this.getName(), that.getName())
             && Objects.equals(this.getFromState(), that.getFromState())
             && Objects.equals(this.getToState(), that.getToState());
@@ -249,10 +250,10 @@ public abstract class EntityStateJob extends EntityJob {
     }
 
     public Element toElement() {
-      Element result = new Element(TRANSITION_XML_TAG);
+      final Element result = new Element(TRANSITION_XML_TAG);
       if (this.transitionProperties != null) {
         this.transitionProperties.forEach(
-            (String key, String value) -> {
+            (final String key, final String value) -> {
               result.setAttribute(key, value);
             });
       }
@@ -262,17 +263,17 @@ public abstract class EntityStateJob extends EntityJob {
       if (this.description != null) {
         result.setAttribute(TRANSITION_ATTRIBUTE_DESCRIPTION, this.description);
       }
-      Element to = new Element(TO_XML_TAG);
+      final Element to = new Element(TO_XML_TAG);
       to.setAttribute(STATE_ATTRIBUTE_NAME, this.toState.stateName);
       if (this.toState.stateDescription != null) {
         to.setAttribute(STATE_ATTRIBUTE_DESCRIPTION, this.toState.stateDescription);
       }
-      Element from = new Element(FROM_XML_TAG);
+      final Element from = new Element(FROM_XML_TAG);
       from.setAttribute(STATE_ATTRIBUTE_NAME, this.fromState.stateName);
       return result.addContent(from).addContent(to);
     }
 
-    public boolean isPermitted(Subject user) {
+    public boolean isPermitted(final Subject user) {
       return user.isPermitted(PERMISSION_STATE_TRANSION.toString(this.name));
     }
   }
@@ -304,11 +305,12 @@ public abstract class EntityStateJob extends EntityJob {
     private EntityInterface stateModelEntity = null;
     private StateModel stateModel;
     private String stateDescription = null;
-    private Integer stateId = null;
+    private EntityID stateId = null;
     private EntityACL stateACL = null;
-    private Map<String, String> stateProperties;
+    private final Map<String, String> stateProperties;
 
-    public State(EntityInterface stateEntity, EntityInterface stateModelEntity) throws Message {
+    public State(final EntityInterface stateEntity, final EntityInterface stateModelEntity)
+        throws Message {
       this.stateEntity = stateEntity;
       this.stateDescription = stateEntity.getDescription();
       this.stateId = stateEntity.getId();
@@ -319,9 +321,9 @@ public abstract class EntityStateJob extends EntityJob {
       this.stateProperties = createStateProperties(stateEntity);
     }
 
-    private Map<String, String> createStateProperties(EntityInterface stateEntity) {
-      Map<String, String> result = new LinkedHashMap<>();
-      for (Property p : stateEntity.getProperties()) {
+    private Map<String, String> createStateProperties(final EntityInterface stateEntity) {
+      final Map<String, String> result = new LinkedHashMap<>();
+      for (final Property p : stateEntity.getProperties()) {
         if (p.getDatatype() instanceof TextDatatype) {
           result.put(p.getName(), p.getValue().toString());
         }
@@ -329,12 +331,12 @@ public abstract class EntityStateJob extends EntityJob {
       return result;
     }
 
-    private EntityACL createStateACL(EntityACL entityACL) {
-      LinkedList<EntityACI> rules = new LinkedList<>();
-      for (EntityACI aci : entityACL.getRules()) {
+    private EntityACL createStateACL(final EntityACL entityACL) {
+      final LinkedList<EntityACI> rules = new LinkedList<>();
+      for (final EntityACI aci : entityACL.getRules()) {
         if (aci.getResponsibleAgent().toString().startsWith(ENTITY_STATE_ROLE_MARKER)) {
-          int end = aci.getResponsibleAgent().toString().length() - 1;
-          String role = aci.getResponsibleAgent().toString().substring(7, end);
+          final int end = aci.getResponsibleAgent().toString().length() - 1;
+          final String role = aci.getResponsibleAgent().toString().substring(7, end);
           rules.add(
               new EntityACI(org.caosdb.server.permissions.Role.create(role), aci.getBitSet()));
         }
@@ -350,14 +352,14 @@ public abstract class EntityStateJob extends EntityJob {
       return this.stateDescription;
     }
 
-    public Integer getStateId() throws Message {
+    public EntityID getStateId() throws Message {
       return this.stateId;
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
       if (obj instanceof State) {
-        State that = (State) obj;
+        final State that = (State) obj;
         return Objects.equals(that.getStateName(), this.getStateName())
             && Objects.equals(that.getStateModelName(), this.getStateModelName());
       }
@@ -376,11 +378,11 @@ public abstract class EntityStateJob extends EntityJob {
      * name"/>}
      */
     @Override
-    public void addToElement(Element ret) {
-      Element e = new Element(STATE_XML_TAG);
+    public void addToElement(final Element ret) {
+      final Element e = new Element(STATE_XML_TAG);
       if (this.stateProperties != null) {
         this.stateProperties.forEach(
-            (String key, String value) -> {
+            (final String key, final String value) -> {
               e.setAttribute(key, value);
             });
       }
@@ -394,11 +396,11 @@ public abstract class EntityStateJob extends EntityJob {
         e.setAttribute(STATE_ATTRIBUTE_DESCRIPTION, this.stateDescription);
       }
       if (this.stateId != null) {
-        e.setAttribute(STATE_ATTRIBUTE_ID, Integer.toString(this.stateId));
+        e.setAttribute(STATE_ATTRIBUTE_ID, this.stateId.toString());
       }
       if (this.stateModel != null) {
         this.stateModel.transitions.forEach(
-            (Transition t) -> {
+            (final Transition t) -> {
               if (t.isFromState(this) && t.isPermitted(getUser())) {
                 e.addContent(t.toElement());
               }
@@ -445,8 +447,8 @@ public abstract class EntityStateJob extends EntityJob {
      * @throws Message
      */
     public Property createStateProperty() throws Message {
-      EntityInterface stateRecordType = getStateRecordType();
-      Property stateProperty = new Property(stateRecordType);
+      final EntityInterface stateRecordType = getStateRecordType();
+      final Property stateProperty = new Property(stateRecordType);
       stateProperty.setDatatype(new ReferenceDatatype2(stateRecordType));
       stateProperty.setValue(new ReferenceValue(getStateEntity(), false));
       stateProperty.setStatementStatus(StatementStatus.FIX);
@@ -467,12 +469,12 @@ public abstract class EntityStateJob extends EntityJob {
       String isFinal = null;
       try {
         isInitial = String.valueOf(isInitial());
-      } catch (Message e) {
+      } catch (final Message e) {
         isInitial = "null";
       }
       try {
         isFinal = String.valueOf(isFinal());
-      } catch (Message e) {
+      } catch (final Message e) {
         isFinal = "null";
       }
       return "State (name="
@@ -503,13 +505,13 @@ public abstract class EntityStateJob extends EntityJob {
    */
   public class StateModel {
 
-    private String name;
-    private Set<State> states;
-    private Set<Transition> transitions;
-    private State initialState;
-    private State finalState;
+    private final String name;
+    private final Set<State> states;
+    private final Set<Transition> transitions;
+    private final State initialState;
+    private final State finalState;
 
-    public StateModel(EntityInterface stateModelEntity) throws Message {
+    public StateModel(final EntityInterface stateModelEntity) throws Message {
       this.name = stateModelEntity.getName();
       this.transitions = getTransitions(stateModelEntity);
       this.states = getStates(transitions, this);
@@ -517,9 +519,9 @@ public abstract class EntityStateJob extends EntityJob {
       this.initialState = getInitialState(stateModelEntity);
     }
 
-    private State getInitialState(EntityInterface stateModelEntity) throws Message {
+    private State getInitialState(final EntityInterface stateModelEntity) throws Message {
       // TODO maybe check if there is more than one "initial" Property?
-      for (Property p : stateModelEntity.getProperties()) {
+      for (final Property p : stateModelEntity.getProperties()) {
         if (p.getName().equals(INITIAL_STATE_PROPERTY_NAME)) {
           return createState(p);
         }
@@ -527,9 +529,9 @@ public abstract class EntityStateJob extends EntityJob {
       return null;
     }
 
-    private State getFinalState(EntityInterface stateModelEntity) throws Message {
+    private State getFinalState(final EntityInterface stateModelEntity) throws Message {
       // TODO maybe check if there is more than one "final" Property?
-      for (Property p : stateModelEntity.getProperties()) {
+      for (final Property p : stateModelEntity.getProperties()) {
         if (p.getName().equals(FINAL_STATE_PROPERTY_NAME)) {
           return createState(p);
         }
@@ -538,8 +540,8 @@ public abstract class EntityStateJob extends EntityJob {
     }
 
     /** Transitions are taken from list Property with name="Transition". */
-    private Set<Transition> getTransitions(EntityInterface stateModelEntity) throws Message {
-      for (Property p : stateModelEntity.getProperties()) {
+    private Set<Transition> getTransitions(final EntityInterface stateModelEntity) throws Message {
+      for (final Property p : stateModelEntity.getProperties()) {
         if (p.getName().equals(TRANSITION_RECORD_TYPE_NAME)) {
           return createTransitions(p);
         }
@@ -554,20 +556,20 @@ public abstract class EntityStateJob extends EntityJob {
      * @return a set of transitions
      * @throws Message if the transitions could ne be created.
      */
-    private Set<Transition> createTransitions(Property p) throws Message {
-      Set<Transition> result = new LinkedHashSet<>();
+    private Set<Transition> createTransitions(final Property p) throws Message {
+      final Set<Transition> result = new LinkedHashSet<>();
       try {
         if (!(p.getDatatype() instanceof AbstractCollectionDatatype)) {
           // FIXME raise an exception instead?
           return result;
         }
         p.parseValue();
-        CollectionValue vals = (CollectionValue) p.getValue();
-        for (IndexedSingleValue val : vals) {
+        final CollectionValue vals = (CollectionValue) p.getValue();
+        for (final IndexedSingleValue val : vals) {
           if (val.getWrapped() instanceof ReferenceValue) {
-            Integer refid = ((ReferenceValue) val.getWrapped()).getId();
+            final EntityID refid = ((ReferenceValue) val.getWrapped()).getId();
 
-            String key = "transition" + Integer.toString(refid);
+            final String key = "transition" + refid.toString();
             EntityInterface transition = getCached(key);
             if (transition == null) {
               transition = retrieveValidEntity(refid);
@@ -576,7 +578,7 @@ public abstract class EntityStateJob extends EntityJob {
             result.add(new Transition(transition));
           }
         }
-      } catch (Exception e) {
+      } catch (final Exception e) {
         throw COULD_NOT_CONSTRUCT_TRANSITIONS;
       }
       return result;
@@ -593,13 +595,13 @@ public abstract class EntityStateJob extends EntityJob {
      * @return set of states.
      * @throws Message
      */
-    private Set<State> getStates(Set<Transition> transitions, StateModel stateModel)
+    private Set<State> getStates(final Set<Transition> transitions, final StateModel stateModel)
         throws Message {
       // TODO Move outside of this class
-      Iterator<Transition> it = transitions.iterator();
-      Set<State> result = new LinkedHashSet<>();
+      final Iterator<Transition> it = transitions.iterator();
+      final Set<State> result = new LinkedHashSet<>();
       while (it.hasNext()) {
-        Transition t = it.next();
+        final Transition t = it.next();
         result.add(t.getFromState());
         result.add(t.getToState());
       }
@@ -627,7 +629,7 @@ public abstract class EntityStateJob extends EntityJob {
     }
 
     @Override
-    public boolean equals(Object obj) {
+    public boolean equals(final Object obj) {
       if (obj instanceof StateModel) {
         return ((StateModel) obj).getName().equals(this.getName());
       }
@@ -636,14 +638,14 @@ public abstract class EntityStateJob extends EntityJob {
 
     @Override
     public String toString() {
-      StringBuilder sb = new StringBuilder("StateModel (name=");
+      final StringBuilder sb = new StringBuilder("StateModel (name=");
       sb.append(this.getName());
       sb.append(", initial=");
       sb.append(this.getInitialState().stateName);
       sb.append(", final=");
       sb.append(this.getFinalState().stateName);
       sb.append(", transitions=[");
-      Iterator<Transition> iterator = this.transitions.iterator();
+      final Iterator<Transition> iterator = this.transitions.iterator();
       while (iterator.hasNext()) {
         sb.append(iterator.next().name);
         sb.append(" -> ");
@@ -655,18 +657,18 @@ public abstract class EntityStateJob extends EntityJob {
     }
   }
 
-  private EntityInterface retrieveStateEntity(String stateName) throws Message {
+  private EntityInterface retrieveStateEntity(final String stateName) throws Message {
     try {
       return retrieveValidEntity(retrieveValidIDByName(stateName));
-    } catch (EntityDoesNotExistException e) {
+    } catch (final EntityDoesNotExistException e) {
       throw STATE_NOT_IN_STATE_MODEL;
     }
   }
 
-  private EntityInterface retrieveStateModelEntity(String stateModel) throws Message {
+  private EntityInterface retrieveStateModelEntity(final String stateModel) throws Message {
     try {
       return retrieveValidEntity(retrieveValidIDByName(stateModel));
-    } catch (EntityDoesNotExistException e) {
+    } catch (final EntityDoesNotExistException e) {
       throw STATE_MODEL_NOT_FOUND;
     }
   }
@@ -684,14 +686,14 @@ public abstract class EntityStateJob extends EntityJob {
     return getState(false);
   }
 
-  protected State getState(EntityInterface entity) {
+  protected State getState(final EntityInterface entity) {
     return getState(entity, false);
   }
 
-  protected State getState(EntityInterface entity, boolean remove) {
-    Iterator<ToElementable> messages = entity.getMessages().iterator();
+  protected State getState(final EntityInterface entity, final boolean remove) {
+    final Iterator<ToElementable> messages = entity.getMessages().iterator();
     while (messages.hasNext()) {
-      ToElementable s = messages.next();
+      final ToElementable s = messages.next();
       if (s instanceof State) {
         if (remove) {
           messages.remove();
@@ -702,16 +704,16 @@ public abstract class EntityStateJob extends EntityJob {
     return null;
   }
 
-  protected State getState(boolean remove) {
+  protected State getState(final boolean remove) {
     return getState(getEntity(), remove);
   }
 
   /** Return (and possibly remove) the States Properties of `entity`. */
-  protected List<Property> getStateProperties(EntityInterface entity, boolean remove) {
-    Iterator<Property> it = entity.getProperties().iterator();
-    List<Property> result = new ArrayList<>();
+  protected List<Property> getStateProperties(final EntityInterface entity, final boolean remove) {
+    final Iterator<Property> it = entity.getProperties().iterator();
+    final List<Property> result = new ArrayList<>();
     while (it.hasNext()) {
-      Property p = it.next();
+      final Property p = it.next();
       if (Objects.equals(p.getName(), STATE_RECORD_TYPE_NAME)) {
         if (!(p.getDatatype() instanceof ReferenceDatatype)) {
           continue;
@@ -725,16 +727,17 @@ public abstract class EntityStateJob extends EntityJob {
     return result;
   }
 
-  protected List<Property> getStateProperties(boolean remove) {
+  protected List<Property> getStateProperties(final boolean remove) {
     return getStateProperties(getEntity(), remove);
   }
 
   /** Get the {@code ClientMessage}s which denote a state. */
-  protected List<ClientMessage> getStateClientMessages(EntityInterface entity, boolean remove) {
-    Iterator<ToElementable> stateMessages = entity.getMessages().iterator();
-    List<ClientMessage> result = new ArrayList<>();
+  protected List<ClientMessage> getStateClientMessages(
+      final EntityInterface entity, final boolean remove) {
+    final Iterator<ToElementable> stateMessages = entity.getMessages().iterator();
+    final List<ClientMessage> result = new ArrayList<>();
     while (stateMessages.hasNext()) {
-      ToElementable s = stateMessages.next();
+      final ToElementable s = stateMessages.next();
       if (s instanceof ClientMessage && STATE_XML_TAG.equals(((ClientMessage) s).getType())) {
         if (remove) {
           stateMessages.remove();
@@ -745,20 +748,20 @@ public abstract class EntityStateJob extends EntityJob {
     return result;
   }
 
-  protected List<ClientMessage> getStateClientMessages(boolean remove) {
+  protected List<ClientMessage> getStateClientMessages(final boolean remove) {
     return getStateClientMessages(getEntity(), remove);
   }
 
-  protected State createState(ClientMessage s) throws Message {
-    String stateModel = s.getProperty(STATE_ATTRIBUTE_MODEL);
+  protected State createState(final ClientMessage s) throws Message {
+    final String stateModel = s.getProperty(STATE_ATTRIBUTE_MODEL);
     if (stateModel == null) {
       throw STATE_MODEL_NOT_SPECIFIED;
     }
-    String stateName = s.getProperty(STATE_ATTRIBUTE_NAME);
+    final String stateName = s.getProperty(STATE_ATTRIBUTE_NAME);
     if (stateName == null) {
       throw STATE_NOT_SPECIFIED;
     }
-    String stateModelKey = "statemodel:" + stateModel;
+    final String stateModelKey = "statemodel:" + stateModel;
 
     EntityInterface stateModelEntity = getCached(stateModelKey);
     if (stateModelEntity == null) {
@@ -766,7 +769,7 @@ public abstract class EntityStateJob extends EntityJob {
       putCache(stateModelKey, stateModelEntity);
     }
 
-    String stateKey = "namestate:" + stateName;
+    final String stateKey = "namestate:" + stateName;
 
     EntityInterface stateEntity = getCached(stateKey);
     if (stateEntity == null) {
@@ -786,11 +789,11 @@ public abstract class EntityStateJob extends EntityJob {
    * @return The state of the entity
    * @throws Message
    */
-  protected State createState(Property p) throws Message {
+  protected State createState(final Property p) throws Message {
     try {
       p.parseValue();
-      ReferenceValue refid = (ReferenceValue) p.getValue();
-      String key = "idstate" + Integer.toString(refid.getId());
+      final ReferenceValue refid = (ReferenceValue) p.getValue();
+      final String key = "idstate" + refid.getId().toString();
 
       EntityInterface stateEntity = getCached(key);
       if (stateEntity == null) {
@@ -798,36 +801,36 @@ public abstract class EntityStateJob extends EntityJob {
         putCache(key, stateEntity);
       }
 
-      EntityInterface stateModelEntity = findStateModel(stateEntity);
+      final EntityInterface stateModelEntity = findStateModel(stateEntity);
       return new State(stateEntity, stateModelEntity);
-    } catch (Message e) {
+    } catch (final Message e) {
       throw e;
-    } catch (Exception e) {
+    } catch (final Exception e) {
       throw COULD_NOT_CONSTRUCT_STATE_MESSAGE;
     }
   }
 
   private static final Map<String, EntityInterface> cache = new HashMap<>();
-  private static final Set<Integer> id_in_cache = new HashSet<>();
+  private static final Set<EntityID> id_in_cache = new HashSet<>();
 
-  EntityInterface findStateModel(EntityInterface stateEntity) throws Exception {
-    boolean cached = true;
-    String key = "modelof" + Integer.toString(stateEntity.getId());
+  EntityInterface findStateModel(final EntityInterface stateEntity) throws Exception {
+    final boolean cached = true;
+    final String key = "modelof" + stateEntity.getId().toString();
 
     EntityInterface result = getCached(key);
     if (result != null && cached) {
       return result;
     }
     // TODO This should throw a meaningful Exception if no matching StateModel can be found.
-    TransactionContainer c = new TransactionContainer();
-    Query query =
+    final TransactionContainer c = new TransactionContainer();
+    final Query query =
         new Query(
             "FIND RECORD "
                 + STATE_MODEL_RECORD_TYPE_NAME
                 + " WHICH REFERENCES "
                 + TRANSITION_RECORD_TYPE_NAME
                 + " WHICH REFERENCES "
-                + Integer.toString(stateEntity.getId()),
+                + stateEntity.getId().toString(),
             getUser(),
             c);
     query.execute(getTransaction().getAccess());
@@ -836,7 +839,7 @@ public abstract class EntityStateJob extends EntityJob {
     return result;
   }
 
-  private EntityInterface getCached(String key) {
+  private EntityInterface getCached(final String key) {
     EntityInterface result;
     synchronized (cache) {
       result = cache.get(key);
@@ -844,7 +847,7 @@ public abstract class EntityStateJob extends EntityJob {
     return result;
   }
 
-  private void putCache(String key, EntityInterface value) {
+  private void putCache(final String key, final EntityInterface value) {
     synchronized (cache) {
       if (value instanceof DeleteEntity) {
         throw new RuntimeException("Delete entity in cache. This is an implementation error.");
@@ -854,18 +857,18 @@ public abstract class EntityStateJob extends EntityJob {
     }
   }
 
-  protected void removeCached(EntityInterface entity) {
+  protected void removeCached(final EntityInterface entity) {
     synchronized (cache) {
       if (id_in_cache.contains(entity.getId())) {
         id_in_cache.remove(entity.getId());
 
-        List<String> remove = new LinkedList<>();
-        for (Entry<String, EntityInterface> entry : cache.entrySet()) {
+        final List<String> remove = new LinkedList<>();
+        for (final Entry<String, EntityInterface> entry : cache.entrySet()) {
           if (entry.getValue().getId().equals(entity.getId())) {
             remove.add(entry.getKey());
           }
         }
-        for (String key : remove) {
+        for (final String key : remove) {
           cache.remove(key);
         }
       }
diff --git a/src/main/java/org/caosdb/server/jobs/core/History.java b/src/main/java/org/caosdb/server/jobs/core/History.java
index d39a6e1f570400194b3a530c3c323a92d0374b7c..c1215db5c9e99b0dbdf43a3dc5ce8bf54bfbeb19 100644
--- a/src/main/java/org/caosdb/server/jobs/core/History.java
+++ b/src/main/java/org/caosdb/server/jobs/core/History.java
@@ -44,7 +44,7 @@ public class History extends FlagJob {
   protected void job(final String value) {
     if (value == null || value.equals("1")) {
       for (final EntityInterface entity : getContainer()) {
-        if (entity.getId() != null && entity.getId() > 0) {
+        if (entity.getId() != null && !entity.getId().isTemporary()) {
           try {
             entity.checkPermission(EntityPermission.RETRIEVE_HISTORY);
             final RetrieveVersionHistory t = new RetrieveVersionHistory(entity);
diff --git a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
index 78e89a53593e3f112650ed81e292d0c62f071e24..33c7772811d36a5b9430556fc8926e88e2cd302c 100644
--- a/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
+++ b/src/main/java/org/caosdb/server/jobs/core/Inheritance.java
@@ -28,11 +28,11 @@ import java.util.ArrayList;
 import java.util.List;
 import org.caosdb.api.entity.v1.MessageCode;
 import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction;
-import org.caosdb.server.entity.Entity;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
+import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.StatementStatus;
 import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.entity.wrapper.Property;
@@ -136,7 +136,7 @@ public class Inheritance extends EntityJob {
               break propertyLoop;
             }
 
-            EntityInterface validProperty = new Entity(property.getId());
+            EntityInterface validProperty = new RetrieveEntity(property.getId());
             if (getEntity().hasParents()) {
               outer:
               for (EntityInterface par : getEntity().getParents()) {
@@ -165,7 +165,7 @@ public class Inheritance extends EntityJob {
           outerLoop:
           for (final Property prop : transfer) {
             for (final Property eprop : property.getProperties()) {
-              if (prop.hasId() && eprop.hasId() && prop.getId() == eprop.getId()) {
+              if (prop.hasId() && eprop.hasId() && prop.getId().equals(eprop.getId())) {
                 continue outerLoop;
               }
             }
diff --git a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
index c04fd21d588c9a9a2f6e59ce7c1fff445a225c67..a07862c0a8ced52a8caa1af2e845497eb64badd7 100644
--- a/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
+++ b/src/main/java/org/caosdb/server/jobs/core/LoadContainerFlagJobs.java
@@ -37,7 +37,7 @@ public class LoadContainerFlagJobs extends ContainerJob {
     if (getContainer().getFlags() != null) {
       for (final Entry<String, String> flag : getContainer().getFlags().entrySet()) {
         final Job j = Job.getJob(flag.getKey(), JobFailureSeverity.ERROR, null, getTransaction());
-        if (j != null) {
+        if (j != null && j instanceof ContainerJob) {
           if (j instanceof FlagJob) {
             ((FlagJob) j).setValue(flag.getValue());
           }
diff --git a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
index 1cc12c6102f66dda224360554e4ac5c515ae418d..7196f04edc99cf1269603e820975a96703639965 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ProcessNameProperties.java
@@ -29,6 +29,7 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.Set;
 import org.caosdb.server.datatype.AbstractDatatype;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.wrapper.Parent;
@@ -80,9 +81,9 @@ public class ProcessNameProperties extends EntityJob {
   }
 
   private boolean isValidAndSubTypeOfName(final Object par) {
-    if (par != null && par instanceof Integer && (Integer) par > 0) {
+    if (par != null && par instanceof EntityID && !((EntityID) par).isTemporary()) {
       final boolean isName = par.equals(NAME.getId());
-      return isName || isValidSubType((Integer) par, NAME.getId());
+      return isName || isValidSubType((EntityID) par, NAME.getId());
     }
     return false;
   }
@@ -105,7 +106,7 @@ public class ProcessNameProperties extends EntityJob {
         if (set.add(par.getName())) {
           getNearestValidParents(par, set);
         }
-      } else if (par.hasId() && par.getId() > 0) {
+      } else if (par.hasId() && !par.getId().isTemporary()) {
         // parent is valid
         set.add(par.getId());
       } else if (par.hasId()) {
@@ -132,7 +133,7 @@ public class ProcessNameProperties extends EntityJob {
   }
 
   private Collection<Object> getNearestValidParents(final Property prop) {
-    if (prop.hasId() && prop.getId() > 0) {
+    if (prop.hasId() && !prop.getId().isTemporary()) {
       final ArrayList<Object> ret = new ArrayList<Object>();
       if (prop.hasParents()) {
         for (final Parent par : prop.getParents()) {
diff --git a/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java b/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java
index d0a1f0768b77fa7bd110019dd95220f65ad256f2..5ab722c7176e89485e2bd40dfd515a77bc09e38b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java
+++ b/src/main/java/org/caosdb/server/jobs/core/ResolveNames.java
@@ -27,7 +27,9 @@ import java.util.List;
 import org.caosdb.server.database.backend.transaction.GetIDByName;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.entity.Entity;
+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.jobs.ContainerJob;
 import org.caosdb.server.utils.EntityStatus;
@@ -45,12 +47,12 @@ public class ResolveNames extends ContainerJob {
     for (final EntityInterface e : container) {
       if (e.hasName() && !e.hasId()) {
         try {
-          final List<Integer> c = execute(new GetIDByName(e.getName(), false)).getList();
+          final List<EntityID> c = execute(new GetIDByName(e.getName(), false)).getList();
 
           e.setId(c.get(0));
           e.setEntityStatus(EntityStatus.QUALIFIED);
           for (int i = 1; i < c.size(); i++) {
-            final Entity e2 = new Entity(c.get(i), e.getRole());
+            final Entity e2 = new RetrieveEntity(c.get(i), e.getRole());
             e2.setEntityStatus(EntityStatus.QUALIFIED);
             add.add(e2);
           }
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
index 4664c01b88d361485c342a8fcddca2ab082f0dee..0f25071818ff7de041016942e51705a66c9b7cb5 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveACL.java
@@ -24,7 +24,6 @@ package org.caosdb.server.jobs.core;
 
 import org.apache.shiro.authz.AuthorizationException;
 import org.caosdb.server.entity.EntityInterface;
-import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
@@ -32,7 +31,6 @@ import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.transaction.Retrieve;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
-import org.jdom2.Element;
 
 @JobAnnotation(
     stage = TransactionStage.POST_TRANSACTION,
@@ -44,19 +42,14 @@ public class RetrieveACL extends FlagJob {
   protected void job(final String value) {
 
     for (final EntityInterface entity : getContainer()) {
-      if (entity.getId() != null && entity.getId() > 0 && entity.getEntityACL() != null) {
+      if (entity.getId() != null
+          && !entity.getId().isTemporary()
+          && entity.getEntityACL() != null) {
         try {
           if (getTransaction() instanceof Retrieve) {
             entity.checkPermission(EntityPermission.RETRIEVE_ACL);
           }
-          entity.addMessage(
-              new ToElementable() {
-
-                @Override
-                public void addToElement(final Element ret) {
-                  ret.addContent(entity.getEntityACL().toElement());
-                }
-              });
+          entity.addMessage(ret -> ret.addContent(entity.getEntityACL().toElement()));
         } catch (final AuthorizationException e) {
           entity.setEntityStatus(EntityStatus.UNQUALIFIED);
           entity.addError(ServerMessages.AUTHORIZATION_ERROR);
diff --git a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
index 8b6412cee5d6e800a78509741d4f3680403008ce..fa094b28ba9a6ed1387710a751be160fa6f53d47 100644
--- a/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
+++ b/src/main/java/org/caosdb/server/jobs/core/RetrieveOwner.java
@@ -25,7 +25,6 @@ package org.caosdb.server.jobs.core;
 import java.util.List;
 import org.apache.shiro.authz.AuthorizationException;
 import org.caosdb.server.entity.EntityInterface;
-import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
 import org.caosdb.server.jobs.TransactionStage;
@@ -46,23 +45,19 @@ public class RetrieveOwner extends FlagJob {
   protected void job(final String value) {
 
     for (final EntityInterface entity : getContainer()) {
-      if (entity.getId() != null && entity.getId() > 0) {
+      if (entity.getId() != null && !entity.getId().isTemporary()) {
         try {
           if (getTransaction() instanceof Retrieve) {
             entity.checkPermission(EntityPermission.RETRIEVE_OWNER);
           }
           entity.addMessage(
-              new ToElementable() {
-
-                @Override
-                public void addToElement(final Element ret) {
-                  if (entity.getEntityACL() != null) {
-                    final List<ResponsibleAgent> owners = entity.getEntityACL().getOwners();
-                    for (final ResponsibleAgent o : owners) {
-                      final Element e = new Element("Owner");
-                      o.addToElement(e);
-                      ret.addContent(e);
-                    }
+              ret -> {
+                if (entity.getEntityACL() != null) {
+                  final List<ResponsibleAgent> owners = entity.getEntityACL().getOwners();
+                  for (final ResponsibleAgent o : owners) {
+                    final Element e = new Element("Owner");
+                    o.addToElement(e);
+                    ret.addContent(e);
                   }
                 }
               });
diff --git a/src/main/java/org/caosdb/server/jobs/core/UniqueName.java b/src/main/java/org/caosdb/server/jobs/core/UniqueName.java
index 0ef9792556e2b8b6e3981f66cb697ced5659c7a1..86e6c37e35ec91db647e14e30896abb6b884555b 100644
--- a/src/main/java/org/caosdb/server/jobs/core/UniqueName.java
+++ b/src/main/java/org/caosdb/server/jobs/core/UniqueName.java
@@ -24,6 +24,7 @@ package org.caosdb.server.jobs.core;
 
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.exceptions.EntityWasNotUniqueException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.jobs.FlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
@@ -39,7 +40,7 @@ public class UniqueName extends FlagJob {
 
       // check against data base
       try {
-        final Integer foreign = retrieveValidIDByName(entity.getName());
+        final EntityID foreign = retrieveValidIDByName(entity.getName());
         if (entity.hasId() && !foreign.equals(entity.getId())) {
           throw new EntityWasNotUniqueException();
         }
diff --git a/src/main/java/org/caosdb/server/query/Query.java b/src/main/java/org/caosdb/server/query/Query.java
index 81a08a9dbecbd28195172df55dfdd600ae24e53b..7da810c3d8f50ab739dd72a65551b45449b4d183 100644
--- a/src/main/java/org/caosdb/server/query/Query.java
+++ b/src/main/java/org/caosdb/server/query/Query.java
@@ -59,6 +59,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
 import org.caosdb.server.database.misc.DBHelper;
 import org.caosdb.server.database.misc.TransactionBenchmark;
 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.entity.Message.MessageType;
@@ -406,15 +407,15 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
   public void applyQueryTemplates(final QueryInterface query, final String resultSet)
       throws QueryException {
     try {
-      final Map<Integer, String> queryTemplates = getQueryTemplates(query, resultSet);
+      final Map<EntityID, String> queryTemplates = getQueryTemplates(query, resultSet);
 
       final PreparedStatement removeQTStmt =
           query.getConnection().prepareStatement("DELETE FROM `" + resultSet + "` WHERE id=?");
 
       // Run thru all QTs found...
-      for (final Entry<Integer, String> q : queryTemplates.entrySet()) {
+      for (final Entry<EntityID, String> q : queryTemplates.entrySet()) {
         // ... remove the QT from resultSet...
-        removeQTStmt.setInt(1, q.getKey());
+        removeQTStmt.setInt(1, q.getKey().toInteger());
         removeQTStmt.execute();
 
         // ... check for RETRIEVE:ENTITY permission...
@@ -456,11 +457,11 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
    * @return A list of query strings.
    * @throws SQLException
    */
-  private static Map<Integer, String> getQueryTemplates(
+  private static Map<EntityID, String> getQueryTemplates(
       final QueryInterface query, final String resultSet) throws SQLException {
     ResultSet rs = null;
     try {
-      final HashMap<Integer, String> ret = new HashMap<Integer, String>();
+      final Map<EntityID, String> ret = new HashMap<>();
       final CallableStatement stmt =
           query
               .getConnection()
@@ -470,7 +471,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
                       + "` AS r ON (r.id=q.id);");
       rs = stmt.executeQuery();
       while (rs.next()) {
-        ret.put(rs.getInt("id"), rs.getString("definition"));
+        ret.put(new EntityID(rs.getInt("id")), rs.getString("definition"));
       }
       return ret;
     } finally {
@@ -724,7 +725,7 @@ public class Query implements QueryInterface, ToElementable, TransactionInterfac
     if (this.container != null && this.type == Type.FIND) {
       for (final IdVersionAclTriplet t : this.resultSet) {
 
-        final Entity e = new RetrieveEntity(t.id, t.version);
+        final Entity e = new RetrieveEntity(new EntityID(t.id), t.version);
 
         // if query has select-clause:
         if (this.selections != null && !this.selections.isEmpty()) {
diff --git a/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java b/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java
index 578eca4c855ed067aae7a9f2e18463808558b94d..6527376d71ba31718394f887b7335615d80db5c6 100644
--- a/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java
+++ b/src/main/java/org/caosdb/server/resource/transaction/RetrieveEntityResource.java
@@ -26,6 +26,7 @@ import java.security.NoSuchAlgorithmException;
 import java.sql.SQLException;
 import org.caosdb.server.CaosDBException;
 import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.container.RetrieveContainer;
 import org.caosdb.server.resource.AbstractCaosDBServerResource;
 import org.caosdb.server.transaction.Retrieve;
@@ -46,16 +47,16 @@ public abstract class RetrieveEntityResource extends AbstractCaosDBServerResourc
    *
    * @param container
    */
-  protected void handleRetrieveContainer(RetrieveContainer container) {
+  protected void handleRetrieveContainer(final RetrieveContainer container) {
 
     for (final String item : getRequestedItems()) {
-      String[] elem = item.split("@", 2);
+      final String[] elem = item.split("@", 2);
       Integer id = null;
       String name = null;
       String version = null;
       try {
         id = Integer.parseInt(elem[0]);
-      } catch (NumberFormatException e) {
+      } catch (final NumberFormatException e) {
         name = elem[0];
       }
       if (elem.length > 1) {
@@ -63,7 +64,7 @@ public abstract class RetrieveEntityResource extends AbstractCaosDBServerResourc
       }
 
       if (id != null) {
-        container.add(id, version);
+        container.add(new EntityID(id), version);
       } else {
         container.add(name);
       }
diff --git a/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java b/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java
index 8abc2ede52375158c006d0108e9fea2523526006..f3f4c7f5fd583ff0ff16d4fd1ce583394258f35b 100644
--- a/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/InsertUserTransaction.java
@@ -34,6 +34,7 @@ import org.caosdb.server.database.backend.transaction.SetPassword;
 import org.caosdb.server.database.backend.transaction.UpdateUser;
 import org.caosdb.server.database.backend.transaction.UpdateUserRoles;
 import org.caosdb.server.database.proto.ProtoUser;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.utils.ServerMessages;
 import org.caosdb.server.utils.Utils;
@@ -75,7 +76,7 @@ public class InsertUserTransaction extends AccessControlTransaction {
     }
 
     if (this.user.entity != null) {
-      UpdateUserTransaction.checkEntityExists(this.user.entity);
+      UpdateUserTransaction.checkEntityExists(new EntityID(this.user.entity));
     }
 
     if (this.password != null) {
diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java
index cd9c5c0841557da579c3581f876a1180ecd06f8d..ac0a2896451a43ca10985bd38787ad4f847a05cc 100644
--- a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java
+++ b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java
@@ -26,8 +26,9 @@ import java.util.UUID;
 import org.apache.shiro.SecurityUtils;
 import org.apache.shiro.authz.AuthorizationException;
 import org.caosdb.server.database.backend.transaction.RetrieveEntityACLTransaction;
-import org.caosdb.server.entity.Entity;
+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.permissions.EntityACL;
 import org.caosdb.server.permissions.EntityPermission;
@@ -39,7 +40,7 @@ public class RetrieveACL extends Transaction<TransactionContainer> {
         new TransactionContainer(
             SecurityUtils.getSubject(), System.currentTimeMillis(), UUID.randomUUID().toString()));
     for (String strId : idList) {
-      getContainer().add(new Entity(Integer.parseInt(strId)));
+      getContainer().add(new RetrieveEntity(new EntityID(Integer.parseInt(strId))));
     }
   }
 
diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
index 520787105388d8f1408c2d3b05090c761c8f687c..6784ae65bcbb9e6af7c5de4db2b9409f7a1d742c 100644
--- a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
+++ b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
@@ -22,15 +22,19 @@
  */
 package org.caosdb.server.transaction;
 
-import org.caosdb.server.database.backend.transaction.GetFileRecordByPath;
-import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
+import org.caosdb.server.database.backend.transaction.GetFileEntityByPath;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.container.TransactionContainer;
+import org.caosdb.server.filesystem.Path;
 
 public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer> {
 
-  public RetrieveSparseEntityByPath(final TransactionContainer container) {
-    super(container);
+  private final Path path;
+  private EntityInterface entity;
+
+  public RetrieveSparseEntityByPath(final Path path) {
+    super(new TransactionContainer());
+    this.path = path;
   }
 
   @Override
@@ -55,12 +59,8 @@ public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer
 
   @Override
   protected void transaction() throws Exception {
-    for (final EntityInterface e : getContainer()) {
-      final GetFileRecordByPath r =
-          execute(new GetFileRecordByPath(e.getFileProperties().getPath()), getAccess());
-      e.setId(r.getId());
-      execute(new RetrieveSparseEntity(e), getAccess());
-    }
+    final GetFileEntityByPath r = execute(new GetFileEntityByPath(path), getAccess());
+    entity = r.getEntity();
   }
 
   @Override
@@ -71,4 +71,8 @@ public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer
     // release weak access
     getAccess().release();
   }
+
+  public EntityInterface getEntity() {
+    return entity;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java b/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java
index 6e945118c9b0eef7460f41b5062ccb308b0fd956..6808968f20574242cfdaa9b87793d7a4ad4b6914 100644
--- a/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/UpdateUserTransaction.java
@@ -39,6 +39,7 @@ import org.caosdb.server.database.backend.transaction.UpdateUserRoles;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.ProtoUser;
 import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.container.RetrieveContainer;
@@ -66,9 +67,9 @@ public class UpdateUserTransaction extends AccessControlTransaction {
       final String password) {
     this.user = new ProtoUser();
     this.user.realm =
-        (realm == null
+        realm == null
             ? UserSources.guessRealm(username, UserSources.getInternalRealm().getName())
-            : realm);
+            : realm;
     this.user.name = username;
     this.user.status = status;
     this.user.email = email;
@@ -180,7 +181,7 @@ public class UpdateUserTransaction extends AccessControlTransaction {
         // this means that the entity is to be reset.
         this.user.entity = null;
       } else {
-        checkEntityExists(this.user.entity);
+        checkEntityExists(new EntityID(this.user.entity));
       }
     } else if (validUser != null) {
       this.user.entity = validUser.entity;
@@ -189,7 +190,7 @@ public class UpdateUserTransaction extends AccessControlTransaction {
     return isToBeUpdated;
   }
 
-  public static void checkEntityExists(final int entity) throws Exception {
+  public static void checkEntityExists(final EntityID entity) throws Exception {
     final RetrieveContainer c = new RetrieveContainer(null, null, null, null);
     final Entity e = new RetrieveEntity(entity);
     c.add(e);
diff --git a/src/test/java/org/caosdb/server/database/InsertTest.java b/src/test/java/org/caosdb/server/database/InsertTest.java
index d5aa4480a961b849c2cb2ce4b1f395826b563f28..524e7addd20581db349082f91206605a97bdee8e 100644
--- a/src/test/java/org/caosdb/server/database/InsertTest.java
+++ b/src/test/java/org/caosdb/server/database/InsertTest.java
@@ -33,7 +33,10 @@ import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.GenericValue;
 import org.caosdb.server.datatype.SingleValue;
 import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
+import org.caosdb.server.entity.InsertEntity;
+import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.StatementStatus;
 import org.caosdb.server.entity.wrapper.Property;
@@ -48,71 +51,71 @@ public class InsertTest {
    */
   @Test
   public void testTransformation1() throws Exception {
-    final Entity r = new Entity(-1, Role.Record);
-    final Property p1 = new Property(1);
+    final Entity r = new InsertEntity("Test", Role.Record);
+    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
     p1.setRole("Property");
     p1.setValue(new GenericValue("V1"));
     p1.setDatatype("TEXT");
     p1.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p1);
 
-    final Property p2 = new Property(2);
+    final Property p2 = new Property(new RetrieveEntity(new EntityID(2)));
     p2.setRole("Property");
     p2.setValue(new GenericValue("V2"));
     p2.setDatatype("TEXT");
     p2.setStatementStatus(StatementStatus.RECOMMENDED);
     r.addProperty(p2);
 
-    final Property p3 = new Property(3);
+    final Property p3 = new Property(new RetrieveEntity(new EntityID(3)));
     p3.setRole("Property");
     p3.setValue(new GenericValue("V3"));
     p3.setDatatype("TEXT");
     p3.setStatementStatus(StatementStatus.OBLIGATORY);
     p2.addProperty(p3);
 
-    final Property p4 = new Property(4);
+    final Property p4 = new Property(new RetrieveEntity(new EntityID(4)));
     p4.setRole("Property");
     p4.setValue(new GenericValue("V4"));
     p4.setDatatype("TEXT");
     p4.setStatementStatus(StatementStatus.OBLIGATORY);
     r.addProperty(p4);
 
-    final Property p5 = new Property(5);
+    final Property p5 = new Property(new RetrieveEntity(new EntityID(5)));
     p5.setRole("Property");
     p5.setValue(new GenericValue("V5"));
     p5.setDatatype("TEXT");
     p5.setStatementStatus(StatementStatus.OBLIGATORY);
     p4.addProperty(p5);
 
-    final Property p6 = new Property(6);
+    final Property p6 = new Property(new RetrieveEntity(new EntityID(6)));
     p6.setRole("Property");
     p6.setValue(new GenericValue("V6"));
     p6.setDatatype("TEXT");
     p6.setStatementStatus(StatementStatus.OBLIGATORY);
     p5.addProperty(p6);
 
-    final Property p7 = new Property(7);
+    final Property p7 = new Property(new RetrieveEntity(new EntityID(7)));
     p7.setRole("Property");
     p7.setValue(new GenericValue("V7"));
     p7.setDatatype("TEXT");
     p7.setStatementStatus(StatementStatus.OBLIGATORY);
     r.addProperty(p7);
 
-    final Property p8 = new Property(8);
+    final Property p8 = new Property(new RetrieveEntity(new EntityID(8)));
     p8.setRole("Property");
     p8.setValue(new GenericValue("V8"));
     p8.setDatatype("TEXT");
     p8.setStatementStatus(StatementStatus.OBLIGATORY);
     p7.addProperty(p8);
 
-    final Property p9 = new Property(9);
+    final Property p9 = new Property(new RetrieveEntity(new EntityID(9)));
     p9.setRole("Property");
     p9.setValue(new GenericValue("V9"));
     p9.setDatatype("TEXT");
     p9.setStatementStatus(StatementStatus.OBLIGATORY);
     p8.addProperty(p9);
 
-    final Property p10 = new Property(10);
+    final Property p10 = new Property(new RetrieveEntity(new EntityID(10)));
     p10.setRole("Property");
     p10.setValue(new GenericValue("V10"));
     p10.setDatatype("TEXT");
@@ -126,17 +129,17 @@ public class InsertTest {
 
     assertEquals(7, stage1Inserts.size());
     assertEquals(Role.Property, stage1Inserts.get(0).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(0).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
     assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString());
     assertFalse(stage1Inserts.get(0).hasReplacement());
 
     assertEquals(Role.Property, stage1Inserts.get(1).getRole());
-    assertEquals((Integer) 2, stage1Inserts.get(1).getId());
+    assertEquals(new EntityID(2), stage1Inserts.get(1).getId());
     assertEquals("V2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString());
     assertFalse(stage1Inserts.get(1).hasReplacement());
 
     assertEquals(Role.Property, stage1Inserts.get(2).getRole());
-    assertEquals((Integer) 4, stage1Inserts.get(2).getId());
+    assertEquals(new EntityID(4), stage1Inserts.get(2).getId());
     assertEquals("V4", ((SingleValue) stage1Inserts.get(2).getValue()).toDatabaseString());
     assertFalse(stage1Inserts.get(2).hasReplacement());
 
@@ -145,7 +148,7 @@ public class InsertTest {
     assertFalse(stage1Inserts.get(3).hasReplacement());
 
     assertEquals(Role.Property, stage1Inserts.get(4).getRole());
-    assertEquals((Integer) 7, stage1Inserts.get(4).getId());
+    assertEquals(new EntityID(7), stage1Inserts.get(4).getId());
     assertEquals("V7", ((SingleValue) stage1Inserts.get(4).getValue()).toDatabaseString());
     assertFalse(stage1Inserts.get(4).hasReplacement());
 
@@ -161,35 +164,35 @@ public class InsertTest {
 
     assertEquals(6, stage2Inserts.size());
     assertEquals(Role.Property, stage2Inserts.get(0).getRole());
-    assertEquals((Integer) 3, stage2Inserts.get(0).getId());
+    assertEquals(new EntityID(3), stage2Inserts.get(0).getId());
     assertEquals("V3", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString());
     assertFalse(stage2Inserts.get(0).hasReplacement());
 
     assertEquals(Role.Property, stage2Inserts.get(1).getRole());
-    assertEquals((Integer) 5, stage2Inserts.get(1).getId());
+    assertEquals(new EntityID(5), stage2Inserts.get(1).getId());
     assertEquals("V5", ((SingleValue) stage2Inserts.get(1).getValue()).toDatabaseString());
     assertTrue(stage2Inserts.get(1).hasReplacement());
     assertEquals(stage1Inserts.get(3), stage2Inserts.get(1).getReplacement());
 
     assertEquals(Role.Property, stage2Inserts.get(2).getRole());
-    assertEquals((Integer) 6, stage2Inserts.get(2).getId());
+    assertEquals(new EntityID(6), stage2Inserts.get(2).getId());
     assertEquals("V6", ((SingleValue) stage2Inserts.get(2).getValue()).toDatabaseString());
     assertFalse(stage2Inserts.get(2).hasReplacement());
 
     assertEquals(Role.Property, stage2Inserts.get(3).getRole());
-    assertEquals((Integer) 8, stage2Inserts.get(3).getId());
+    assertEquals(new EntityID(8), stage2Inserts.get(3).getId());
     assertEquals("V8", ((SingleValue) stage2Inserts.get(3).getValue()).toDatabaseString());
     assertTrue(stage2Inserts.get(3).hasReplacement());
     assertEquals(stage1Inserts.get(5), stage2Inserts.get(3).getReplacement());
 
     assertEquals(Role.Property, stage2Inserts.get(4).getRole());
-    assertEquals((Integer) 9, stage2Inserts.get(4).getId());
+    assertEquals(new EntityID(9), stage2Inserts.get(4).getId());
     assertEquals("V9", ((SingleValue) stage2Inserts.get(4).getValue()).toDatabaseString());
     assertTrue(stage2Inserts.get(4).hasReplacement());
     assertEquals(stage1Inserts.get(6), stage2Inserts.get(4).getReplacement());
 
     assertEquals(Role.Property, stage2Inserts.get(5).getRole());
-    assertEquals((Integer) 10, stage2Inserts.get(5).getId());
+    assertEquals(new EntityID(10), stage2Inserts.get(5).getId());
     assertEquals("V10", ((SingleValue) stage2Inserts.get(5).getValue()).toDatabaseString());
     assertFalse(stage2Inserts.get(5).hasReplacement());
   }
@@ -202,22 +205,22 @@ public class InsertTest {
    */
   @Test
   public void testTransformation2() throws Exception {
-    final Entity r = new Entity(-1, Role.Record);
-    final Property p1 = new Property(1);
+    final Entity r = new InsertEntity("Test", Role.Record);
+    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
     p1.setRole("Property");
     p1.setValue(new GenericValue("V1-1"));
     p1.setDatatype("TEXT");
     p1.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p1);
 
-    final Property p2 = new Property(1);
+    final Property p2 = new Property(new RetrieveEntity(new EntityID(1)));
     p2.setRole("Property");
     p2.setValue(new GenericValue("V1-2"));
     p2.setDatatype("TEXT");
     p2.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p2);
 
-    final Property subp = new Property(2);
+    final Property subp = new Property(new RetrieveEntity(new EntityID(2)));
     subp.setRole("Property");
     subp.setValue(new GenericValue("V2"));
     subp.setDatatype("TEXT");
@@ -231,13 +234,13 @@ public class InsertTest {
 
     assertEquals(3, stage1Inserts.size());
     assertEquals(Role.Property, stage1Inserts.get(0).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(0).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
     assertEquals("V1-1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString());
     assertFalse(stage1Inserts.get(0).hasReplacement());
 
     assertEquals(Role.Property, stage1Inserts.get(1).getRole());
     assertEquals("V1-2", ((SingleValue) stage1Inserts.get(1).getValue()).toDatabaseString());
-    assertEquals((Integer) 1, stage1Inserts.get(1).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(1).getId());
     assertTrue(stage1Inserts.get(1).hasReplacement());
     assertEquals(stage1Inserts.get(2), stage1Inserts.get(1).getReplacement());
 
@@ -249,7 +252,7 @@ public class InsertTest {
 
     assertEquals(1, stage2Inserts.size());
     assertEquals(Role.Property, stage2Inserts.get(0).getRole());
-    assertEquals((Integer) 2, stage2Inserts.get(0).getId());
+    assertEquals(new EntityID(2), stage2Inserts.get(0).getId());
     assertEquals("V2", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString());
     assertFalse(stage2Inserts.get(0).hasReplacement());
   }
@@ -262,26 +265,26 @@ public class InsertTest {
    */
   @Test
   public void testTransformation3() throws Exception {
-    final Entity r = new Entity(-1, Role.Record);
-    final Property p1 = new Property(1);
+    final Entity r = new InsertEntity("Test", Role.Record);
+    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
     p1.setRole("Property");
     p1.setDatatype("TEXT");
     p1.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p1);
 
-    final Property p2 = new Property(1);
+    final Property p2 = new Property(new RetrieveEntity(new EntityID(1)));
     p2.setRole("Property");
     p2.setDatatype("TEXT");
     p2.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p2);
 
-    final Property p3 = new Property(1);
+    final Property p3 = new Property(new RetrieveEntity(new EntityID(1)));
     p3.setRole("Property");
     p3.setDatatype("TEXT");
     p3.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p3);
 
-    final Property sub1 = new Property(2);
+    final Property sub1 = new Property(new RetrieveEntity(new EntityID(2)));
     sub1.setRole("Property");
     sub1.setDatatype("TEXT");
     sub1.setValue(new GenericValue("V1"));
@@ -295,7 +298,7 @@ public class InsertTest {
 
     assertEquals(4, stage1Inserts.size());
     assertEquals(Role.Property, stage1Inserts.get(0).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(0).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
     assertTrue(stage1Inserts.get(0).hasReplacement());
     assertEquals(stage1Inserts.get(1), stage1Inserts.get(0).getReplacement());
     assertEquals(null, stage1Inserts.get(0).getValue());
@@ -305,12 +308,12 @@ public class InsertTest {
     assertEquals(null, stage1Inserts.get(1).getValue());
 
     assertEquals(Role.Property, stage1Inserts.get(2).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(2).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(2).getId());
     assertFalse(stage1Inserts.get(2).hasReplacement());
     assertEquals(null, stage1Inserts.get(2).getValue());
 
     assertEquals(Role.Property, stage1Inserts.get(3).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(3).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(3).getId());
     assertFalse(stage1Inserts.get(3).hasReplacement());
     assertEquals(null, stage1Inserts.get(3).getValue());
 
@@ -318,7 +321,7 @@ public class InsertTest {
 
     assertEquals(1, stage2Inserts.size());
     assertEquals(Role.Property, stage2Inserts.get(0).getRole());
-    assertEquals((Integer) 2, stage2Inserts.get(0).getId());
+    assertEquals(new EntityID(2), stage2Inserts.get(0).getId());
     assertEquals("V1", ((SingleValue) stage2Inserts.get(0).getValue()).toDatabaseString());
     assertFalse(stage2Inserts.get(0).hasReplacement());
   }
@@ -331,15 +334,15 @@ public class InsertTest {
   @Test
   public void testTransformation4() throws Exception {
 
-    final Entity r = new Entity(-1, Role.Record);
-    final Property p1 = new Property(1);
+    final Entity r = new InsertEntity("Test", Role.Record);
+    final Property p1 = new Property(new RetrieveEntity(new EntityID(1)));
     p1.setRole("Property");
     p1.setDatatype("TEXT");
     p1.setValue(new GenericValue("V1"));
     p1.setStatementStatus(StatementStatus.FIX);
     r.addProperty(p1);
 
-    final Property p2 = new Property(2);
+    final Property p2 = new Property(new RetrieveEntity(new EntityID(2)));
     p2.setRole("Property");
     p2.setDatatype("LIST<TEXT>");
     p2.setStatementStatus(StatementStatus.FIX);
@@ -350,7 +353,7 @@ public class InsertTest {
     p2.setValue(vals);
     r.addProperty(p2);
 
-    final Property p3 = new Property(3);
+    final Property p3 = new Property(new RetrieveEntity(new EntityID(3)));
     p3.setRole("Property");
     p3.setDatatype("TEXT");
     p3.setValue(new GenericValue("V3"));
@@ -364,12 +367,12 @@ public class InsertTest {
 
     assertEquals(4, stage1Inserts.size());
     assertEquals(Role.Property, stage1Inserts.get(0).getRole());
-    assertEquals((Integer) 1, stage1Inserts.get(0).getId());
+    assertEquals(new EntityID(1), stage1Inserts.get(0).getId());
     assertFalse(stage1Inserts.get(0).hasReplacement());
     assertEquals("V1", ((SingleValue) stage1Inserts.get(0).getValue()).toDatabaseString());
 
     assertEquals(Role.Property, stage1Inserts.get(1).getRole());
-    assertEquals((Integer) 2, stage1Inserts.get(1).getId());
+    assertEquals(new EntityID(2), stage1Inserts.get(1).getId());
     assertTrue(stage1Inserts.get(1).hasReplacement());
     assertEquals(stage1Inserts.get(2), stage1Inserts.get(1).getReplacement());
     assertTrue(stage1Inserts.get(1).getValue() instanceof CollectionValue);
@@ -379,7 +382,7 @@ public class InsertTest {
     assertTrue(stage1Inserts.get(2).getValue() instanceof CollectionValue);
 
     assertEquals(Role.Property, stage1Inserts.get(3).getRole());
-    assertEquals((Integer) 3, stage1Inserts.get(3).getId());
+    assertEquals(new EntityID(3), stage1Inserts.get(3).getId());
     assertFalse(stage1Inserts.get(3).hasReplacement());
     assertEquals("V3", ((SingleValue) stage1Inserts.get(3).getValue()).toDatabaseString());
 
diff --git a/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java b/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java
index f995f0806ed5c94c9e0ff7c22172c8d4893aed35..72c84d1f7b262a854a257c8ae764d4e3da9b8e80 100644
--- a/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java
+++ b/src/test/java/org/caosdb/server/database/backend/transaction/RetrieveFullEntityTest.java
@@ -30,7 +30,9 @@ import java.util.ArrayList;
 import java.util.List;
 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.RetrieveEntity;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.PropertyToElementStrategyTest;
 import org.caosdb.server.query.Query.Selection;
@@ -40,14 +42,15 @@ public class RetrieveFullEntityTest {
 
   @Test
   public void testRetrieveSubEntities() {
-    RetrieveFullEntityTransaction r =
-        new RetrieveFullEntityTransaction(0) {
+    final RetrieveFullEntityTransaction r =
+        new RetrieveFullEntityTransaction(new EntityID(0)) {
 
           /** Mock-up */
           @Override
-          public void retrieveFullEntity(EntityInterface e, List<Selection> selections) {
+          public void retrieveFullEntity(
+              final EntityInterface e, final List<Selection> selections) {
             // The id of the referenced window
-            assertEquals(1234, (int) e.getId());
+            assertEquals(new EntityID(1234), e.getId());
 
             // The level of selectors has been reduced by 1
             assertEquals("description", selections.get(0).getSelector());
@@ -56,23 +59,24 @@ public class RetrieveFullEntityTest {
           };
         };
 
-    Property window = new Property(2345);
+    final Property window = new Property(new RetrieveEntity(new EntityID(2345)));
     window.setName("Window");
     window.setDatatype("Window");
     window.setValue(new ReferenceValue(1234));
 
-    Entity house = new Entity();
+    final Entity house = new RetrieveEntity(new EntityID(3456));
     house.addProperty(window);
-    ReferenceValue value = (ReferenceValue) house.getProperties().getEntityById(2345).getValue();
-    assertEquals(1234, (int) value.getId());
+    final ReferenceValue value =
+        (ReferenceValue) house.getProperties().getEntityById(new EntityID(2345)).getValue();
+    assertEquals(new EntityID(1234), value.getId());
     assertNull(value.getEntity());
 
-    List<Selection> selections = new ArrayList<>();
+    final List<Selection> selections = new ArrayList<>();
     selections.add(PropertyToElementStrategyTest.parse("window.description"));
 
     r.retrieveSubEntities(house, selections);
 
-    assertEquals(1234, (int) value.getId());
+    assertEquals(new EntityID(1234), value.getId());
     assertNotNull(value.getEntity());
     assertEquals("A heart-shaped window.", value.getEntity().getDescription());
   }
diff --git a/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java b/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java
index 836ca13f3422e429d1f516a75f7aaf4ebcc373da..a8ccdbdc9f7a9522020332e01cba96a1667d70b6 100644
--- a/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java
+++ b/src/test/java/org/caosdb/server/entity/container/PropertyContainerTest.java
@@ -27,6 +27,8 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import org.caosdb.server.datatype.GenericValue;
 import org.caosdb.server.datatype.ReferenceValue;
 import org.caosdb.server.entity.Entity;
+import org.caosdb.server.entity.EntityID;
+import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.PropertyToElementStrategyTest;
@@ -46,31 +48,31 @@ public class PropertyContainerTest {
 
   @BeforeAll
   public static void setup() {
-    window = new Entity(1234);
-    windowHeight = new Property(new Entity("window.height", Role.Property));
+    window = new RetrieveEntity(new EntityID(1234));
+    windowHeight = new Property(new RetrieveEntity("window.height", Role.Property));
     window.addProperty(windowHeight);
     windowHeight.setValue(new GenericValue("windowHeight"));
 
-    houseOwner = new Entity("The Queen", Role.Record);
+    houseOwner = new RetrieveEntity("The Queen", Role.Record);
 
-    house = new Entity("Buckingham Palace", Role.Record);
-    houseHeight = new Property(new Entity("height", Role.Property));
+    house = new RetrieveEntity("Buckingham Palace", Role.Record);
+    houseHeight = new Property(new RetrieveEntity("height", Role.Property));
     houseHeight.setValue(new GenericValue("houseHeight"));
     house.addProperty(houseHeight);
-    windowProperty = new Property(2345);
+    windowProperty = new Property(new RetrieveEntity(new EntityID(2345)));
     windowProperty.setName("window");
     windowProperty.setValue(new ReferenceValue(window.getId()));
     house.addProperty(windowProperty);
 
-    house.addProperty(new Property());
+    house.addProperty(new Property(new RetrieveEntity()));
     house.addProperty(new Property(houseHeight));
   }
 
   @Test
   public void test() {
-    PropertyContainer container = new PropertyContainer(new Entity());
-    Element element = new Element("Record");
-    SerializeFieldStrategy setFieldStrategy =
+    final PropertyContainer container = new PropertyContainer(new RetrieveEntity());
+    final Element element = new Element("Record");
+    final SerializeFieldStrategy setFieldStrategy =
         new SerializeFieldStrategy()
             .addSelection(PropertyToElementStrategyTest.parse("window.height"));
 
diff --git a/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java b/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java
index 7f534892f8e84fae4f2a5e5013852a8a86698cf3..a2c9676b9759fc55fb0d1e089808ab50d016288e 100644
--- a/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java
+++ b/src/test/java/org/caosdb/server/entity/xml/PropertyToElementStrategyTest.java
@@ -27,7 +27,9 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import org.caosdb.server.datatype.GenericValue;
 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.RetrieveEntity;
 import org.caosdb.server.entity.Role;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.query.Query.Selection;
@@ -50,9 +52,9 @@ public class PropertyToElementStrategyTest {
    * <p>The returned Selection has nested subselections, so that each subselection corresponds to
    * the next part and the remainder of the initial <code>select</code> String.
    */
-  public static Selection parse(String select) {
-    String[] split = select.split("\\.");
-    Selection result = new Selection(split[0]);
+  public static Selection parse(final String select) {
+    final String[] split = select.split("\\.");
+    final Selection result = new Selection(split[0]);
     Selection next = result;
 
     for (int i = 1; i < split.length; i++) {
@@ -64,42 +66,42 @@ public class PropertyToElementStrategyTest {
 
   @BeforeEach
   public void setup() {
-    window = new Entity(1234, Role.Record);
-    windowHeight = new Property(new Entity("height", Role.Property));
+    window = new RetrieveEntity(new EntityID(1234), Role.Record);
+    windowHeight = new Property(new RetrieveEntity("height", Role.Property));
     window.addProperty(windowHeight);
     windowHeight.setValue(new GenericValue("windowHeight"));
 
-    houseOwner = new Entity("The Queen", Role.Record);
+    houseOwner = new RetrieveEntity("The Queen", Role.Record);
 
-    house = new Entity("Buckingham Palace", Role.Record);
-    houseHeight = new Property(new Entity("height", Role.Property));
+    house = new RetrieveEntity("Buckingham Palace", Role.Record);
+    houseHeight = new Property(new RetrieveEntity("height", Role.Property));
     houseHeight.setValue(new GenericValue("houseHeight"));
     house.addProperty(houseHeight);
-    windowProperty = new Property(2345);
+    windowProperty = new Property(new RetrieveEntity(new EntityID(2345)));
     windowProperty.setName("window");
     windowProperty.setDatatype("window");
     windowProperty.setValue(new ReferenceValue(window.getId()));
     house.addProperty(windowProperty);
 
-    house.addProperty(new Property());
+    house.addProperty(new Property(new RetrieveEntity()));
     house.addProperty(new Property(houseHeight));
   }
 
   @Test
   public void test() {
-    PropertyToElementStrategy strategy = new PropertyToElementStrategy();
-    SerializeFieldStrategy setFieldStrategy =
+    final PropertyToElementStrategy strategy = new PropertyToElementStrategy();
+    final SerializeFieldStrategy setFieldStrategy =
         new SerializeFieldStrategy().addSelection(parse("height"));
-    EntityInterface property = windowProperty;
+    final EntityInterface property = windowProperty;
     ((ReferenceValue) property.getValue()).setEntity(window, true);
-    Element element = strategy.toElement(property, setFieldStrategy);
+    final Element element = strategy.toElement(property, setFieldStrategy);
     assertEquals("Property", element.getName());
     assertEquals("2345", element.getAttributeValue("id"));
     assertEquals("window", element.getAttributeValue("name"));
     assertEquals(1, element.getChildren().size());
     assertEquals("Record", element.getChildren().get(0).getName());
 
-    Element recordElement = element.getChild("Record");
+    final Element recordElement = element.getChild("Record");
     assertEquals("1234", recordElement.getAttributeValue("id"));
     assertEquals(1, recordElement.getChildren().size());
     assertEquals("windowHeight", recordElement.getChild("Property").getText());
diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
index 8a078e8b9f8d7e3590ddeecff762f8fd52fe1df7..9814a9be62fde2a466acb290a71ad00881e5d81a 100644
--- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
+++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
@@ -8,7 +8,6 @@ import java.util.TimeZone;
 import org.caosdb.datetime.DateTimeFactory2;
 import org.caosdb.server.datatype.GenericValue;
 import org.caosdb.server.datatype.Value;
-import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
@@ -16,6 +15,10 @@ import org.caosdb.server.entity.StatementStatus;
 import org.caosdb.server.entity.wrapper.Parent;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.entity.xml.IdAndServerMessagesOnlyStrategy;
+import org.caosdb.server.filesystem.FSODescriptor;
+import org.caosdb.server.filesystem.FSODescriptorInterface;
+import org.caosdb.server.filesystem.Hash;
+import org.caosdb.server.filesystem.Path;
 import org.junit.jupiter.api.Test;
 
 public class CaosDBToGrpcConvertersTest {
@@ -53,10 +56,13 @@ public class CaosDBToGrpcConvertersTest {
 
   @Test
   public void testConvertEntity_FileDescriptor() {
-    RetrieveEntity entity = new RetrieveEntity(null);
+    RetrieveEntity entity = new RetrieveEntity();
     CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(null);
     assertEquals(converters.convert(entity).toString(), "entity {\n}\n");
-    entity.setFileProperties(new FileProperties("checksum1234", "the/path", 1024L));
+    FSODescriptorInterface fsoDescriptor = new FSODescriptor(new Path("the/path"));
+    fsoDescriptor.setSize(1024L);
+    fsoDescriptor.setHash(Hash.create("checksum1234", 0, "SHA-512"));
+    entity.setFSODescriptor(fsoDescriptor);
     assertEquals(
         converters.convert(entity).toString(),
         "entity {\n  file_descriptor {\n    path: \"the/path\"\n    size: 1024\n  }\n}\n");
@@ -65,7 +71,7 @@ public class CaosDBToGrpcConvertersTest {
   @Test
   public void testIdServerMessagesOnlyStrategy() {
     // @review Florian Spreckelsen 2022-03-22
-    RetrieveEntity entity = new RetrieveEntity(null);
+    RetrieveEntity entity = new RetrieveEntity();
 
     // must be printed
     entity.setId(1234);
@@ -74,14 +80,15 @@ public class CaosDBToGrpcConvertersTest {
     entity.addError(new Message("error"));
 
     // must not be printed
-    Parent par = new Parent();
+    Parent par = new Parent(new RetrieveEntity());
     par.setName("dont print parent");
     entity.addParent(par);
     entity.setName("dont print");
     entity.setDescription("dont print");
     entity.setRole(Role.File);
-    entity.setFileProperties(new FileProperties("dont print checksum", "dont print path", 1234L));
-    Property p = new Property();
+    entity.setFSODescriptor(
+        new FSODescriptor(null, new Path("dont print path"), 0L, "tmpid", false));
+    Property p = new Property(new RetrieveEntity());
     p.setStatementStatus(StatementStatus.FIX);
     p.setName("dont print property");
     p.setDatatype("TEXT");
diff --git a/src/test/java/org/caosdb/server/jobs/JobConfigTest.java b/src/test/java/org/caosdb/server/jobs/JobConfigTest.java
index d182cafaa0db347ea5f0953d5d56f6413bdd381d..e176c2111189fb52ca9946e10ae5ec705549b6c8 100644
--- a/src/test/java/org/caosdb/server/jobs/JobConfigTest.java
+++ b/src/test/java/org/caosdb/server/jobs/JobConfigTest.java
@@ -5,6 +5,7 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.io.IOException;
 import org.caosdb.server.CaosDBServer;
 import org.caosdb.server.entity.DeleteEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
@@ -25,7 +26,7 @@ public class JobConfigTest {
     final JobConfig jobConfig = JobConfig.getInstance();
     assertEquals("Retrieve", jobConfig.getTransactionType(new RetrieveEntity("test")));
     assertEquals("Insert", jobConfig.getTransactionType(new InsertEntity("test", Role.Record)));
-    assertEquals("Delete", jobConfig.getTransactionType(new DeleteEntity(1234)));
+    assertEquals("Delete", jobConfig.getTransactionType(new DeleteEntity(new EntityID(1234))));
     assertEquals("Update", jobConfig.getTransactionType(new UpdateEntity(new Element("Record"))));
   }
 }
diff --git a/src/test/java/org/caosdb/server/transaction/RetrieveTest.java b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java
index d4fab9e1203ce1f45e3d8c027a6107ca42ceea31..a3ac40e1bf1e0fe6489a74f45d6c253b903b4478 100644
--- a/src/test/java/org/caosdb/server/transaction/RetrieveTest.java
+++ b/src/test/java/org/caosdb/server/transaction/RetrieveTest.java
@@ -16,6 +16,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RetrieveRoleImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.misc.TransactionBenchmark;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.container.RetrieveContainer;
@@ -61,7 +62,7 @@ public class RetrieveTest {
   public void testMissingRetrievePermission() {
     Subject subject = SecurityUtils.getSubject();
     subject.login(AnonymousAuthenticationToken.getInstance());
-    EntityInterface entity = new RetrieveEntity(1234);
+    EntityInterface entity = new RetrieveEntity(new EntityID(1234));
     EntityACLFactory fac = new EntityACLFactory();
     fac.deny(AnonymousAuthenticationToken.PRINCIPAL, "RETRIEVE:ENTITY");
     entity.setEntityACL(fac.create());
diff --git a/src/test/java/org/caosdb/server/transaction/UpdateTest.java b/src/test/java/org/caosdb/server/transaction/UpdateTest.java
index 860e06b2bf0d9ee41ac2f1ff7be421b6a696f9d8..710b218b9c57ff6fbf201015d6caf9be4493d7b3 100644
--- a/src/test/java/org/caosdb/server/transaction/UpdateTest.java
+++ b/src/test/java/org/caosdb/server/transaction/UpdateTest.java
@@ -35,8 +35,11 @@ import org.caosdb.server.datatype.CollectionValue;
 import org.caosdb.server.datatype.GenericValue;
 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.RetrieveEntity;
 import org.caosdb.server.entity.StatementStatus;
+import org.caosdb.server.entity.UpdateEntity;
 import org.caosdb.server.entity.wrapper.Property;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.permissions.Permission;
@@ -54,8 +57,8 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_SameName()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final Entity newEntity = new Entity("Name");
-    final Entity oldEntity = new Entity("Name");
+    final Entity newEntity = new RetrieveEntity("Name");
+    final Entity oldEntity = new RetrieveEntity("Name");
     new WriteTransaction(null).deriveUpdate(newEntity, oldEntity);
     assertEquals(newEntity.getEntityStatus(), EntityStatus.VALID);
   }
@@ -63,8 +66,8 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_DifferentName()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final Entity newEntity = new Entity("NewName");
-    final Entity oldEntity = new Entity("OldName");
+    final Entity newEntity = new RetrieveEntity("NewName");
+    final Entity oldEntity = new RetrieveEntity("OldName");
     new WriteTransaction(null).deriveUpdate(newEntity, oldEntity);
     assertEquals(newEntity.getEntityStatus(), EntityStatus.QUALIFIED);
   }
@@ -72,11 +75,11 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_SameProperty()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final Entity newEntity = new Entity();
-    final Property newProperty = new Property(1);
+    final Entity newEntity = new RetrieveEntity(new EntityID(1234));
+    final Property newProperty = new Property(new RetrieveEntity(new EntityID(1)));
     newEntity.addProperty(newProperty);
-    final Property oldProperty = new Property(1);
-    final Entity oldEntity = new Entity();
+    final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1)));
+    final Entity oldEntity = new RetrieveEntity(new EntityID(1234));
     oldEntity.addProperty(oldProperty);
 
     new WriteTransaction(null).deriveUpdate(newEntity, oldEntity);
@@ -86,13 +89,13 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_AnotherProperty()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final Entity newEntity = new Entity();
-    final Property newProperty = new Property(1);
-    final Property newProperty2 = new Property(2);
+    final Entity newEntity = new RetrieveEntity(new EntityID(1234));
+    final Property newProperty = new Property(new RetrieveEntity(new EntityID(1)));
+    final Property newProperty2 = new Property(new RetrieveEntity(new EntityID(2)));
     newEntity.addProperty(newProperty);
     newEntity.addProperty(newProperty2);
-    final Property oldProperty = new Property(1);
-    final Entity oldEntity = new Entity();
+    final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1)));
+    final Entity oldEntity = new RetrieveEntity(new EntityID(1234));
     oldEntity.addProperty(oldProperty);
 
     new WriteTransaction(null).deriveUpdate(newEntity, oldEntity);
@@ -104,14 +107,15 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_SameUnit()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final EntityInterface magicUnit = new Entity("Unit");
+    final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234));
+    magicUnit.setName("Unit");
     magicUnit.setId(24);
     magicUnit.setDatatype("TEXT");
 
-    final Entity newEntity = new Entity();
-    final Property newProperty = new Property(1);
+    final Entity newEntity = new RetrieveEntity(new EntityID(1234));
+    final Property newProperty = new Property(new RetrieveEntity(new EntityID(1)));
 
-    final Property newUnit = new Property();
+    final Property newUnit = new Property(new RetrieveEntity(new EntityID(5)));
     newUnit.setName(magicUnit.getName());
     newUnit.setId(magicUnit.getId());
     newUnit.setDatatype(magicUnit.getDatatype());
@@ -122,10 +126,10 @@ public class UpdateTest {
 
     newEntity.addProperty(newProperty);
 
-    final Entity oldEntity = new Entity();
-    final Property oldProperty = new Property(1);
+    final Entity oldEntity = new RetrieveEntity(new EntityID(1234));
+    final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1)));
 
-    final Property oldUnit = new Property();
+    final Property oldUnit = new Property(new RetrieveEntity(new EntityID(5)));
     oldUnit.setName(magicUnit.getName());
     oldUnit.setId(magicUnit.getId());
     oldUnit.setDatatype(magicUnit.getDatatype());
@@ -145,14 +149,15 @@ public class UpdateTest {
   @Test
   public void testDeriveUpdate_DifferentUnit()
       throws NoSuchAlgorithmException, IOException, CaosDBException {
-    final EntityInterface magicUnit = new Entity("Unit");
+    final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234));
+    magicUnit.setName("Unit");
     magicUnit.setId(24);
     magicUnit.setDatatype("TEXT");
 
-    final Entity newEntity = new Entity();
-    final Property newProperty = new Property(1);
+    final Entity newEntity = new RetrieveEntity(new EntityID(1234));
+    final Property newProperty = new Property(new RetrieveEntity(new EntityID(1)));
 
-    final Property newUnit = new Property();
+    final Property newUnit = new Property(new RetrieveEntity(new EntityID(5)));
     newUnit.setName(magicUnit.getName());
     newUnit.setId(magicUnit.getId());
     newUnit.setDatatype(magicUnit.getDatatype());
@@ -163,10 +168,10 @@ public class UpdateTest {
 
     newEntity.addProperty(newProperty);
 
-    final Entity oldEntity = new Entity();
-    final Property oldProperty = new Property(1);
+    final Entity oldEntity = new RetrieveEntity(new EntityID(1234));
+    final Property oldProperty = new Property(new RetrieveEntity(new EntityID(1)));
 
-    final Property oldUnit = new Property();
+    final Property oldUnit = new Property(new RetrieveEntity(new EntityID(5)));
     oldUnit.setName(magicUnit.getName());
     oldUnit.setId(magicUnit.getId());
     oldUnit.setDatatype(magicUnit.getDatatype());
@@ -186,8 +191,8 @@ public class UpdateTest {
   public void testDeriveUpdate_Collections()
       throws NoSuchAlgorithmException, CaosDBException, IOException {
 
-    final Entity newEntity = new Entity();
-    final Property newProperty = new Property(1);
+    final Entity newEntity = new UpdateEntity();
+    final Property newProperty = new Property(new UpdateEntity(new EntityID(1)));
     newProperty.setDatatype("List<Person>");
     CollectionValue newValue = new CollectionValue();
     newValue.add(new ReferenceValue(1234));
@@ -200,8 +205,8 @@ public class UpdateTest {
     newProperty.setEntityStatus(QUALIFIED);
 
     // old entity represents the stored entity.
-    final Entity oldEntity = new Entity();
-    final Property oldProperty = new Property(1);
+    final Entity oldEntity = new UpdateEntity();
+    final Property oldProperty = new Property(new UpdateEntity(new EntityID(1)));
     oldProperty.setDatatype("List<Person>");
     CollectionValue oldValue = new CollectionValue();
     // Values are shuffled but have the correct index
@@ -261,12 +266,12 @@ public class UpdateTest {
   public void testDeriveUpdate_UpdateList()
       throws NoSuchAlgorithmException, CaosDBException, IOException {
     // @review Florian Spreckelsen 2022-03-15
-    final Property oldProperty = new Property(1);
-    final Property newProperty = new Property(1);
+    final Property oldProperty = new Property(new UpdateEntity(new EntityID(1)));
+    final Property newProperty = new Property(new UpdateEntity(new EntityID(1)));
     oldProperty.setDatatype("List<Person>");
     newProperty.setDatatype("List<Person>");
-    final Entity oldEntity = new Entity();
-    final Entity newEntity = new Entity();
+    final Entity oldEntity = new UpdateEntity();
+    final Entity newEntity = new UpdateEntity();
 
     oldProperty.setRole("Record");
     newProperty.setRole("Property");