diff --git a/src/main/java/org/caosdb/server/database/backend/transaction/CheckTargetPath.java b/src/main/java/org/caosdb/server/database/backend/transaction/CheckTargetPath.java
index 5e714ec33f023bbe65fa91cfbba4ff6f9ec5486b..e72b4556c16b1e5411d71763f95674e080f189c9 100644
--- a/src/main/java/org/caosdb/server/database/backend/transaction/CheckTargetPath.java
+++ b/src/main/java/org/caosdb/server/database/backend/transaction/CheckTargetPath.java
@@ -4,6 +4,7 @@ import org.caosdb.server.database.BackendTransaction;
 import org.caosdb.server.database.exceptions.EntityDoesNotExistException;
 import org.caosdb.server.entity.EntityInterface;
 import org.caosdb.server.entity.Message;
+import org.caosdb.server.entity.container.TransactionContainer;
 import org.caosdb.server.filesystem.Path;
 import org.caosdb.server.filesystem.VirtualFSODescriptorInterface;
 import org.caosdb.server.utils.ServerMessages;
@@ -19,33 +20,58 @@ import org.caosdb.server.utils.ServerMessages;
 public class CheckTargetPath extends BackendTransaction {
 
   private final EntityInterface entity;
+  private TransactionContainer container;
 
-  public CheckTargetPath(final EntityInterface entity) {
+  public CheckTargetPath(final EntityInterface entity, TransactionContainer container) {
+    this.container = container;
     this.entity = entity;
   }
 
   @Override
   protected void execute() {
     try {
-      checkTarget(entity);
+      checkTarget(entity, container);
     } catch (final Message e) {
       entity.addError(e);
     }
   }
 
-  public void checkTarget(final EntityInterface entity) throws Message {
-    // TODO move to transaction
-    final VirtualFSODescriptorInterface fd = entity.getFSODescriptor();
-    final Path targetPath = fd.getPath();
+  public void checkTarget(final EntityInterface entity, TransactionContainer container)
+      throws Message {
 
-    // TODO move to FileSystem or Path
-    for (final String segment : targetPath.getSegments()) {
-      if (segment.matches("^\\.{1,3}$")) {
-        throw ServerMessages.TARGET_PATH_NOT_ALLOWED;
+    checkNastyPath(entity.getFSODescriptor().getPath());
+    checkOwner(entity);
+    checkParentExists(entity, container);
+  }
+
+  private void checkParentExists(EntityInterface entity, TransactionContainer container)
+      throws Message {
+    Path path = entity.getFSODescriptor().getPath().getParent();
+    if (path == null) {
+      // root is parent
+      return;
+    }
+    for (EntityInterface e : container) {
+      if (e.getFSODescriptor() != null && e.getFSODescriptor().getPath() != null) {
+        if (e.getFSODescriptor().getPath().equals(path)) {
+          // found the parent in the current container
+          return;
+        }
       }
     }
 
-    final GetFileEntityByPath t = new GetFileEntityByPath(targetPath, true);
+    GetFileEntityByPath t = new GetFileEntityByPath(path, false);
+    try {
+      execute(t);
+    } catch (final EntityDoesNotExistException e) {
+      throw ServerMessages.TARGET_PARENT_DIRECTORY_DOES_NOT_EXIST;
+    }
+  }
+
+  private void checkOwner(EntityInterface entity) throws Message {
+    final VirtualFSODescriptorInterface fd = entity.getFSODescriptor();
+    final Path path = fd.getPath();
+    final GetFileEntityByPath t = new GetFileEntityByPath(path, false);
     try {
       execute(t);
     } catch (final EntityDoesNotExistException e) {
@@ -60,4 +86,12 @@ public class CheckTargetPath extends BackendTransaction {
       throw ServerMessages.TARGET_PATH_EXISTS;
     }
   }
+
+  private void checkNastyPath(Path path) throws Message {
+    for (final String segment : path.getSegments()) {
+      if (segment.matches("^\\.{1,3}$")) {
+        throw ServerMessages.TARGET_PATH_NOT_ALLOWED;
+      }
+    }
+  }
 }
diff --git a/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java b/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java
index 374de7b1f17f99d27a620350e37199cdc2087c0c..286b5453775c22015b7675e81b698a1603724026 100644
--- a/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java
+++ b/src/main/java/org/caosdb/server/jobs/EntityFlagJob.java
@@ -38,7 +38,15 @@ public abstract class EntityFlagJob extends EntityJob {
   @Override
   protected void run() {
     if (this.value == null) {
-      this.value = this.getClass().getAnnotation(JobAnnotation.class).defaultValue();
+      JobAnnotation annotation = getClass().getAnnotation(JobAnnotation.class);
+      if (getContainer().getFlags() != null) {
+        this.value =
+            this.getContainer()
+                .getFlags()
+                .getOrDefault(annotation.flag(), annotation.defaultValue());
+      } else {
+        this.value = annotation.defaultValue();
+      }
     }
     job(this.value);
   }
diff --git a/src/main/java/org/caosdb/server/jobs/core/AutoCreateDirs.java b/src/main/java/org/caosdb/server/jobs/core/AutoCreateDirs.java
index afbadcbedac4c9f1c0a79f81a7e88b0eddf13678..a2644c63e7b75dbc7e4ae442ed07d987a52d4fb1 100644
--- a/src/main/java/org/caosdb/server/jobs/core/AutoCreateDirs.java
+++ b/src/main/java/org/caosdb/server/jobs/core/AutoCreateDirs.java
@@ -12,9 +12,14 @@ import org.caosdb.server.filesystem.Path;
 import org.caosdb.server.filesystem.VirtualFSODescriptorInterface;
 import org.caosdb.server.jobs.EntityFlagJob;
 import org.caosdb.server.jobs.JobAnnotation;
+import org.caosdb.server.jobs.TransactionStage;
 import org.caosdb.server.permissions.EntityACL;
 
-@JobAnnotation(flag = "autoCreateDirs", defaultValue = "true", loadAlways = true)
+@JobAnnotation(
+    flag = "autoCreateDirs",
+    defaultValue = "true",
+    loadAlways = true,
+    stage = TransactionStage.PRE_CHECK)
 public class AutoCreateDirs extends EntityFlagJob {
 
   @Override
diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java b/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java
index 257558763693ba0359b008187374eb01e0cfb2ef..6d3815537f8420109a2207ada1e8f115b11aa6cc 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java
@@ -48,7 +48,8 @@ public class CheckTargetPathValid extends FilesJob {
         return;
       }
 
-      final CheckTargetPath t = new CheckTargetPath(getEntity());
+      // check that target path is not owned by another entity.
+      final CheckTargetPath t = new CheckTargetPath(getEntity(), getContainer());
       execute(t);
     }
   }
diff --git a/src/main/java/org/caosdb/server/utils/ServerMessages.java b/src/main/java/org/caosdb/server/utils/ServerMessages.java
index 58e8fde934619cafff04f194ad3e57bb4848f026..ed048f3c658841547a2ccad523d584d6b1cf5d5d 100644
--- a/src/main/java/org/caosdb/server/utils/ServerMessages.java
+++ b/src/main/java/org/caosdb/server/utils/ServerMessages.java
@@ -126,6 +126,12 @@ public class ServerMessages {
           MessageCode.MESSAGE_CODE_TARGET_PATH_EXISTS,
           "This target path does already exist.");
 
+  public static final Message TARGET_PARENT_DIRECTORY_DOES_NOT_EXIST =
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "The parent directory of the target path does not exist.");
+
   public static final Message PROPERTY_HAS_NO_UNIT =
       new Message(
           MessageType.Error,