diff --git a/src/main/java/org/caosdb/server/FileSystem.java b/src/main/java/org/caosdb/server/FileSystem.java
index 67587f3da7930dd2cbf3e76d3ed06f19508efef7..c05314655b8e1112e60576cc8c96b9f6b30ce2fa 100644
--- a/src/main/java/org/caosdb/server/FileSystem.java
+++ b/src/main/java/org/caosdb/server/FileSystem.java
@@ -39,6 +39,7 @@ import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.transaction.GetFileRecordByPath;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.misc.TransactionBenchmark;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
@@ -332,7 +333,7 @@ public class FileSystem {
           // this is usually the case when target is a directory
         }
         if (t.getEntity() != null) {
-          final Integer foreign = t.getId();
+          final EntityID foreign = t.getId();
           if (foreign != null && foreign.equals(entity.getId())) {
             // entity already owns this path
             return true;
diff --git a/src/main/java/org/caosdb/server/database/DatabaseUtils.java b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
index 8cc4aa8904a9143cbfdce871e435e5b49d9780f7..47e8a9afe4fb2d81d40e71aff01c81ea314a26ca 100644
--- a/src/main/java/org/caosdb/server/database/DatabaseUtils.java
+++ b/src/main/java/org/caosdb/server/database/DatabaseUtils.java
@@ -28,6 +28,7 @@ import java.sql.SQLException;
 import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
+import java.util.Map;
 import org.caosdb.server.database.proto.FlatProperty;
 import org.caosdb.server.database.proto.ProtoProperty;
 import org.caosdb.server.database.proto.SparseEntity;
@@ -238,7 +239,7 @@ public class DatabaseUtils {
 
   public static <K extends EntityInterface> K parseEntityFromVerySparseEntity(
       final K entity, final VerySparseEntity vse) {
-    entity.setId(vse.id);
+    entity.setId(new EntityID(vse.id));
     entity.setName(vse.name);
     entity.setRole(vse.role);
     entity.setDescription(vse.description);
diff --git a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java
index ca4997281c76ec18e54dd1c165ca082eee5e0893..1e14600e71023dff544a09910fabe0dc8b17ca42 100644
--- a/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java
+++ b/src/main/java/org/caosdb/server/database/backend/implementation/MySQL/MySQLRegisterSubDomain.java
@@ -30,6 +30,7 @@ import java.util.Deque;
 import org.caosdb.server.database.access.Access;
 import org.caosdb.server.database.backend.interfaces.RegisterSubDomainImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class MySQLRegisterSubDomain extends MySQLTransaction implements RegisterSubDomainImpl {
 
@@ -40,15 +41,15 @@ public class MySQLRegisterSubDomain extends MySQLTransaction implements Register
   public static final String STMT_REGISTER_SUBDOMAIN = "call registerSubdomain(?)";
 
   @Override
-  public Deque<Integer> execute(final int domainCount) throws TransactionException {
+  public Deque<EntityID> execute(final int domainCount) throws TransactionException {
     try {
       final PreparedStatement stmt = prepareStatement(STMT_REGISTER_SUBDOMAIN);
       stmt.setInt(1, domainCount);
       final ResultSet rs = stmt.executeQuery();
       try {
-        final ArrayDeque<Integer> ret = new ArrayDeque<Integer>();
+        final Deque<EntityID> ret = new ArrayDeque<>();
         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/interfaces/RegisterSubDomainImpl.java b/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java
index e9df6f8897b4753a273be9877c8a5fa49b106932..87ea0c85db6a698f49c103506b520342deff2fb0 100644
--- a/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java
+++ b/src/main/java/org/caosdb/server/database/backend/interfaces/RegisterSubDomainImpl.java
@@ -24,8 +24,9 @@ package org.caosdb.server.database.backend.interfaces;
 
 import java.util.Deque;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public interface RegisterSubDomainImpl extends BackendTransactionImpl {
 
-  public abstract Deque<Integer> execute(int domainCount) throws TransactionException;
+  public abstract Deque<EntityID> execute(int domainCount) 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 fdda7c542c644ccefe6fb83f8b30a043a74d6b54..26cb7ce19ce6d946c34c784a9849c29d4f8f4888 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,7 +1,6 @@
 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.
@@ -17,7 +16,6 @@ public interface SetFileChecksumImpl extends BackendTransactionImpl {
    *
    * @param id
    * @param checksum
-   * @param timestamp
    */
-  void execute(EntityID id, Hash hash);
+  void execute(EntityID id, String checksum);
 }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java b/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java
index 1a7fa8635366cce858c35f54378090ebad72fb8f..dde055049a76b2d45ca7fb66ae3396cec2b5f89c 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/GetFileRecordByPath.java
@@ -31,6 +31,7 @@ import org.caosdb.server.database.backend.interfaces.GetFileRecordByPathImpl;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 
 public class GetFileRecordByPath extends CacheableBackendTransaction<String, SparseEntity> {
 
@@ -70,8 +71,8 @@ public class GetFileRecordByPath extends CacheableBackendTransaction<String, Spa
     return result;
   }
 
-  public Integer getId() {
-    return this.entity.id;
+  public EntityID getId() {
+    return new EntityID(this.entity.id);
   }
 
   public Long getSize() {
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
index aa139e7db565ae82073d6983915c0c53e9cd8b51..382dde551c3e8ec53e51d0668bdd45f3b7e12184 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertEntityDatatype.java
@@ -4,6 +4,7 @@ import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.InsertEntityDatatypeImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.utils.ServerMessages;
 
@@ -28,6 +29,6 @@ public class InsertEntityDatatype extends BackendTransaction {
       throw exc;
     }
 
-    this.entity.setId(e.id);
+    this.entity.setId(new EntityID(e.id));
   }
 }
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 f16e5f6b664f366917a42e387c112c8b4705297c..f9af6a482efaccf896a1a85fc65d0e1217bd6a53 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
@@ -62,7 +62,7 @@ public class InsertEntityProperties extends BackendTransaction {
 
     final int domainCount = DatabaseUtils.deriveStage2Inserts(stage2Inserts, stage1Inserts);
 
-    final Deque<Integer> domainIds = execute(new RegisterSubDomain(domainCount)).getDomains();
+    final Deque<EntityID> domainIds = execute(new RegisterSubDomain(domainCount)).getDomains();
 
     insertStages(t, domainIds, stage1Inserts, this.entity.getDomain(), this.entity.getId());
     insertStages(t, domainIds, stage2Inserts, this.entity.getId(), null);
@@ -70,7 +70,7 @@ public class InsertEntityProperties extends BackendTransaction {
 
   private void insertStages(
       final InsertEntityPropertiesImpl t,
-      final Deque<Integer> domainIds,
+      final Deque<EntityID> domainIds,
       final List<EntityInterface> stage1Inserts,
       final EntityID domain,
       final EntityID entity)
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
index 213c7529766dcac4cc002f81380bf8d141cd8065..9c9c1902019077735445295a61dfed70ce98f9fa 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/InsertSparseEntity.java
@@ -27,10 +27,10 @@ import org.caosdb.server.database.backend.interfaces.InsertSparseEntityImpl;
 import org.caosdb.server.database.exceptions.IntegrityException;
 import org.caosdb.server.database.exceptions.TransactionException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Version;
 import org.caosdb.server.utils.ServerMessages;
-import org.caosdb.server.utils.Undoable;
 
 public class InsertSparseEntity extends BackendTransaction {
 
@@ -40,8 +40,6 @@ public class InsertSparseEntity extends BackendTransaction {
     this.entity = entity;
   }
 
-  private Integer oldId;
-
   @Override
   public void execute() throws TransactionException {
     final InsertSparseEntityImpl t = getImplementation(InsertSparseEntityImpl.class);
@@ -55,19 +53,7 @@ public class InsertSparseEntity extends BackendTransaction {
       throw exc;
     }
 
-    getUndoHandler()
-        .append(
-            new Undoable() {
-
-              @Override
-              public void undo() {
-                InsertSparseEntity.this.entity.setId(InsertSparseEntity.this.oldId);
-              }
-
-              @Override
-              public void cleanUp() {}
-            });
-    this.entity.setId(e.id);
+    this.entity.setId(new EntityID(e.id));
     this.entity.setVersion(new Version(e.versionId));
     this.entity.getVersion().setHead(true);
   }
diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java b/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java
index ecae501d40d4e6ed9ae54e44e12d37a7628699fd..0321a621a82a9ae2841d31b55b05a46743f963bd 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/RegisterSubDomain.java
@@ -26,11 +26,12 @@ import java.util.Deque;
 import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.backend.interfaces.RegisterSubDomainImpl;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 
 public class RegisterSubDomain extends BackendTransaction {
 
   private final int domainCount;
-  private Deque<Integer> list;
+  private Deque<EntityID> list;
 
   public RegisterSubDomain(final int domainCount) {
     this.domainCount = domainCount;
@@ -42,7 +43,7 @@ public class RegisterSubDomain extends BackendTransaction {
     this.list = t.execute(this.domainCount);
   }
 
-  public Deque<Integer> getDomains() {
+  public Deque<EntityID> getDomains() {
     return this.list;
   }
 }
diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index b86789fba7c7d6aac37faed9d9efb2425bc625aa..2668e770d6f779e0b3121f30aa1778dccf6c9d93 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -206,11 +206,6 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     return this.id;
   }
 
-  @Override
-  public final void setId(final Integer id) {
-    this.id.setId(id);
-  }
-
   @Override
   public final boolean hasId() {
     return this.id.hasId();
@@ -303,6 +298,11 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     notifyObservers(ENTITY_STATUS_CHANGED_EVENT);
   }
 
+  @Override
+  public final boolean hasEntityStatus() {
+    return this.entityStatus != null;
+  }
+
   @Override
   public final Role getRole() {
     return this.role;
@@ -380,15 +380,8 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
 
   public Entity() {}
 
-  public Entity(final Element e) {
-    try {
-      setRole(e.getName().toUpperCase());
-      parseFromElement(e);
-    } catch (final NoSuchRoleException exc) {
-      parseFromElement(e);
-      setEntityStatus(EntityStatus.UNQUALIFIED);
-      addError(ServerMessages.NO_SUCH_ENTITY_ROLE(e.getName()));
-    }
+  public Entity(EntityID id) {
+    setId(id);
   }
 
   public Entity(final EntityID id, final Role role) {
@@ -654,7 +647,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
     // Parse ID. Generate error if it isn't an integer.
     if (element.getAttribute("id") != null && !element.getAttributeValue("id").equals("")) {
       try {
-        setId(Integer.parseInt(element.getAttributeValue("id")));
+        setId(new EntityID(Integer.parseInt(element.getAttributeValue("id"))));
       } catch (final NumberFormatException e) {
         addInfo("Id was " + element.getAttributeValue("id") + ".");
         addError(ServerMessages.PARSING_FAILED);
@@ -959,7 +952,7 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
 
   @Override
   public final EntityInterface parseSparseEntity(final SparseEntity spe) {
-    setId(spe.id);
+    setId(new EntityID(spe.id));
     this.setRole(spe.role);
     setEntityACL(spe.acl);
     if (spe.versionId != null) {
diff --git a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
index 754c6e3f8faad9fca9cf44b96f499be01aa3a4dd..7da945738ac966114a020098171c049a6fa387a3 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/EntityWrapper.java
@@ -101,11 +101,6 @@ public abstract class EntityWrapper implements EntityInterface {
     return this.entity.getId();
   }
 
-  @Override
-  public void setId(final Integer id) {
-    this.entity.setId(id);
-  }
-
   @Override
   public void setId(final EntityID id) {
     this.entity.setId(id);
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 9a959e3528393c12c735ea4f9cb193137501b480..efa1a6857a8dec0b3d7dcc45ec689d5b3bc0f745 100644
--- a/src/main/java/org/caosdb/server/entity/wrapper/Property.java
+++ b/src/main/java/org/caosdb/server/entity/wrapper/Property.java
@@ -73,7 +73,7 @@ public class Property extends EntityWrapper {
   }
 
   public Property parseFlatProperty(final FlatProperty fp) {
-    setId(fp.id);
+    setId(new EntityID(fp.id));
     setStatementStatus(fp.status);
     setPIdx(fp.idx);
     if (fp.name != null) {
diff --git a/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java b/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java
new file mode 100644
index 0000000000000000000000000000000000000000..e00b7aee7fa68471acd4375251e2bc55efeef0af
--- /dev/null
+++ b/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java
@@ -0,0 +1,42 @@
+/*
+ * ** header v3.0
+ * This file is a part of the CaosDB Project.
+ *
+ * Copyright (C) 2018 Research Group Biomedical Physics,
+ * Max-Planck-Institute for Dynamics and Self-Organization Göttingen
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
+ *
+ * ** end header
+ */
+package org.caosdb.server.jobs;
+
+public abstract class EntityFlagJob extends EntityJob {
+
+  protected String value = null;
+
+  public void setValue(final String value) {
+    this.value = value;
+  }
+
+  @Override
+  protected void run() {
+    if (this.value == null) {
+      this.value = this.getClass().getAnnotation(JobAnnotation.class).defaultValue();
+    }
+    job(this.value);
+  }
+
+  protected abstract void job(final String value);
+}
diff --git a/src/main/java/org/caosdb/server/resource/FileSystemResource.java b/src/main/java/org/caosdb/server/resource/FileSystemResource.java
index f09f97eab5fbb1ea49930bc8cae227cb2b5fba05..9b1baa5b9e02d2ce87d7b603b624a475a0472435 100644
--- a/src/main/java/org/caosdb/server/resource/FileSystemResource.java
+++ b/src/main/java/org/caosdb/server/resource/FileSystemResource.java
@@ -35,7 +35,6 @@ import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.Message.MessageType;
 import org.caosdb.server.entity.RetrieveEntity;
-import org.caosdb.server.entity.container.TransactionContainer;
 import org.caosdb.server.permissions.EntityPermission;
 import org.caosdb.server.transaction.RetrieveSparseEntityByPath;
 import org.caosdb.server.transaction.Transaction;
@@ -200,12 +199,10 @@ public class FileSystemResource extends AbstractCaosDBServerResource {
    */
   private Entity getEntity(final String path) throws Exception {
     final long t1 = System.currentTimeMillis();
-    final TransactionContainer c = new TransactionContainer();
-    final Entity e = new RetrieveEntity(0);
+    final Entity e = new RetrieveEntity();
     final FileProperties fp = new FileProperties(null, path, null);
     e.setFileProperties(fp);
-    c.add(e);
-    final Transaction<?> t = new RetrieveSparseEntityByPath(c);
+    final Transaction<?> t = new RetrieveSparseEntityByPath(e);
     t.execute();
     final long t2 = System.currentTimeMillis();
     getBenchmark().addMeasurement(this.getClass().getSimpleName() + ".getEntity", t2 - t1);
diff --git a/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java b/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java
index ee247210a80d30d5c2dad0848971ddcecb200f3c..4cd7b2fcbd4ae9e9dd3d047555194172c4224d38 100644
--- a/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java
+++ b/src/main/java/org/caosdb/server/resource/transaction/EntityResource.java
@@ -32,8 +32,8 @@ import org.caosdb.server.CaosDBException;
 import org.caosdb.server.FileSystem;
 import org.caosdb.server.database.backend.implementation.MySQL.ConnectionException;
 import org.caosdb.server.entity.DeleteEntity;
-import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.EntityID;
+import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.InsertEntity;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.UpdateEntity;
diff --git a/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java b/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java
index 56fc07da22d9fac5bfbe713d1a9cd36b2d25a9ba..1f52ca8d8d19abd16848e6506eaa5d3ada32cb6a 100644
--- a/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java
+++ b/src/main/java/org/caosdb/server/transaction/ChecksumUpdater.java
@@ -31,6 +31,7 @@ import org.caosdb.server.database.backend.transaction.GetUpdateableChecksums;
 import org.caosdb.server.database.backend.transaction.RetrieveSparseEntity;
 import org.caosdb.server.database.backend.transaction.SetFileChecksum;
 import org.caosdb.server.database.exceptions.TransactionException;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
@@ -137,7 +138,7 @@ public class ChecksumUpdater extends WriteTransaction
       synchronized (instance.running) {
 
         // test for updatable checksums
-        final Integer id = execute(new GetUpdateableChecksums(), weakAccess).getID();
+        final EntityID id = execute(new GetUpdateableChecksums(), weakAccess).getID();
         if (id == null) {
           // nothing to be updated...
           instance.running = false;
diff --git a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
index 1ce1aa566ad28d048a36f91d50bb297b1a709d14..59d12c73ccdcf620f0e7c2f2f3bbb51233f51d84 100644
--- a/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
+++ b/src/main/java/org/caosdb/server/transaction/FileStorageConsistencyCheck.java
@@ -39,6 +39,7 @@ import org.caosdb.server.database.backend.transaction.RetrieveAllUncheckedFiles;
 import org.caosdb.server.database.backend.transaction.SetFileCheckedTimestamp;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.database.proto.SparseEntity;
+import org.caosdb.server.entity.EntityID;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.xml.ToElementable;
 import org.caosdb.server.utils.SHA512;
@@ -135,7 +136,7 @@ public class FileStorageConsistencyCheck extends Thread
           this.results.put(entity.filePath, result);
         }
 
-        execute(new SetFileCheckedTimestamp(entity.id, this.ts), this.access);
+        execute(new SetFileCheckedTimestamp(new EntityID(entity.id), this.ts), this.access);
       }
 
     } catch (final Exception e) {
diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
index 6784ae65bcbb9e6af7c5de4db2b9409f7a1d742c..1c8c6778100539b3f6eb8076bf06e346bbbe856d 100644
--- a/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
+++ b/src/main/java/org/caosdb/server/transaction/RetrieveSparseEntityByPath.java
@@ -22,19 +22,17 @@
  */
 package org.caosdb.server.transaction;
 
-import org.caosdb.server.database.backend.transaction.GetFileEntityByPath;
+import org.caosdb.server.database.backend.transaction.GetFileRecordByPath;
 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> {
 
-  private final Path path;
   private EntityInterface entity;
 
-  public RetrieveSparseEntityByPath(final Path path) {
+  public RetrieveSparseEntityByPath(final EntityInterface entity) {
     super(new TransactionContainer());
-    this.path = path;
+    this.entity = entity;
   }
 
   @Override
@@ -59,8 +57,9 @@ public class RetrieveSparseEntityByPath extends Transaction<TransactionContainer
 
   @Override
   protected void transaction() throws Exception {
-    final GetFileEntityByPath r = execute(new GetFileEntityByPath(path), getAccess());
-    entity = r.getEntity();
+    String path = entity.getFileProperties().getPath();
+    final GetFileRecordByPath r = execute(new GetFileRecordByPath(path), getAccess());
+    entity.parseSparseEntity(r.getEntity());
   }
 
   @Override
diff --git a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
index 67a461aa4a9fbb90ee66181fbe20907d61b5dcfc..47b7a53c71ddebb7c1b062c2c8599cf44eabe039 100644
--- a/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
+++ b/src/main/java/org/caosdb/server/transaction/WriteTransaction.java
@@ -58,7 +58,6 @@ import org.caosdb.server.permissions.Permission;
 import org.caosdb.server.query.Query;
 import org.caosdb.server.utils.EntityStatus;
 import org.caosdb.server.utils.ServerMessages;
-import org.caosdb.server.utils.Undoable;
 
 /**
  * This class is responsible for inserting, updating and deleting entities which are held in the
diff --git a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
index 9814a9be62fde2a466acb290a71ad00881e5d81a..d39a803f9cfe3ce0a4cf23265683d121b3bc688d 100644
--- a/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
+++ b/src/test/java/org/caosdb/server/grpc/CaosDBToGrpcConvertersTest.java
@@ -8,6 +8,8 @@ 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.EntityID;
+import org.caosdb.server.entity.FileProperties;
 import org.caosdb.server.entity.Message;
 import org.caosdb.server.entity.RetrieveEntity;
 import org.caosdb.server.entity.Role;
@@ -15,10 +17,6 @@ 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 {
@@ -59,10 +57,7 @@ public class CaosDBToGrpcConvertersTest {
     RetrieveEntity entity = new RetrieveEntity();
     CaosDBToGrpcConverters converters = new CaosDBToGrpcConverters(null);
     assertEquals(converters.convert(entity).toString(), "entity {\n}\n");
-    FSODescriptorInterface fsoDescriptor = new FSODescriptor(new Path("the/path"));
-    fsoDescriptor.setSize(1024L);
-    fsoDescriptor.setHash(Hash.create("checksum1234", 0, "SHA-512"));
-    entity.setFSODescriptor(fsoDescriptor);
+    entity.setFileProperties(new FileProperties("checksum1234", "the/path", 1024L));
     assertEquals(
         converters.convert(entity).toString(),
         "entity {\n  file_descriptor {\n    path: \"the/path\"\n    size: 1024\n  }\n}\n");
@@ -74,7 +69,7 @@ public class CaosDBToGrpcConvertersTest {
     RetrieveEntity entity = new RetrieveEntity();
 
     // must be printed
-    entity.setId(1234);
+    entity.setId(new EntityID(1234));
     entity.addInfo("info");
     entity.addWarning(new Message("warning"));
     entity.addError(new Message("error"));
@@ -86,8 +81,7 @@ public class CaosDBToGrpcConvertersTest {
     entity.setName("dont print");
     entity.setDescription("dont print");
     entity.setRole(Role.File);
-    entity.setFSODescriptor(
-        new FSODescriptor(null, new Path("dont print path"), 0L, "tmpid", false));
+    entity.setFileProperties(new FileProperties("dont print checksum", "dont print path", 1234L));
     Property p = new Property(new RetrieveEntity());
     p.setStatementStatus(StatementStatus.FIX);
     p.setName("dont print property");
diff --git a/src/test/java/org/caosdb/server/transaction/UpdateTest.java b/src/test/java/org/caosdb/server/transaction/UpdateTest.java
index 710b218b9c57ff6fbf201015d6caf9be4493d7b3..a0891a3eb34e1759100c78916d0fb250de149ef8 100644
--- a/src/test/java/org/caosdb/server/transaction/UpdateTest.java
+++ b/src/test/java/org/caosdb/server/transaction/UpdateTest.java
@@ -109,7 +109,7 @@ public class UpdateTest {
       throws NoSuchAlgorithmException, IOException, CaosDBException {
     final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234));
     magicUnit.setName("Unit");
-    magicUnit.setId(24);
+    magicUnit.setId(new EntityID(24));
     magicUnit.setDatatype("TEXT");
 
     final Entity newEntity = new RetrieveEntity(new EntityID(1234));
@@ -151,7 +151,7 @@ public class UpdateTest {
       throws NoSuchAlgorithmException, IOException, CaosDBException {
     final EntityInterface magicUnit = new RetrieveEntity(new EntityID(1234));
     magicUnit.setName("Unit");
-    magicUnit.setId(24);
+    magicUnit.setId(new EntityID(24));
     magicUnit.setDatatype("TEXT");
 
     final Entity newEntity = new RetrieveEntity(new EntityID(1234));