diff --git a/src/main/java/org/caosdb/server/entity/Entity.java b/src/main/java/org/caosdb/server/entity/Entity.java
index 04237c31cef8e319a4a6207ee24d919836f2bd86..61a287e6c96a93e36409dc6ea77304c44f0516b8 100644
--- a/src/main/java/org/caosdb/server/entity/Entity.java
+++ b/src/main/java/org/caosdb/server/entity/Entity.java
@@ -816,21 +816,31 @@ public abstract class Entity extends AbstractObservable implements EntityInterfa
       linkTarget = Integer.parseInt(element.getAttributeValue("linktarget"));
     }
 
+    // Parse IMPORT
+    boolean isImport = false;
+    if (element.getAttribute("import") != null
+        && element.getAttributeValue("import").equals("true")) {
+      isImport = true;
+    }
+
     // Store PATH, HASH, SIZE, TMPIDENTIFYER
     if (tmpIdentifier != null || checksum != null || path != null || size != null) {
       // legacy clients (which use this api) always use sha512.
       Hash hash = Hash.create(checksum, 0, Hasher.Default);
+      FSODescriptor fso;
       if (getRole() == Role.Directory) {
-        setFSODescriptor(FSODescriptor.createDir(FileSystem.DEFAULT_BACKEND, new Path(path)));
+        fso = FSODescriptor.createDir(FileSystem.DEFAULT_BACKEND, new Path(path));
       } else if (getRole() == Role.Link) {
-        setFSODescriptor(
+        fso =
             FSODescriptor.createLink(
-                FileSystem.DEFAULT_BACKEND, new Path(path), new EntityID(linkTarget)));
+                FileSystem.DEFAULT_BACKEND, new Path(path), new EntityID(linkTarget));
       } else {
-        setFSODescriptor(
+        fso =
             new FSODescriptor(
-                FileSystem.DEFAULT_BACKEND, null, hash, new Path(path), size, tmpIdentifier));
+                FileSystem.DEFAULT_BACKEND, null, hash, new Path(path), size, tmpIdentifier);
       }
+      fso.setImport(isImport);
+      setFSODescriptor(fso);
     }
 
     // Parse flags
diff --git a/src/main/java/org/caosdb/server/filesystem/FSODescriptor.java b/src/main/java/org/caosdb/server/filesystem/FSODescriptor.java
index 19b1c829accfc0a4fd881024f437a5ac9e3af4eb..ee99d816bcd9585d642ea5ba3e5fe9c684cf2c06 100644
--- a/src/main/java/org/caosdb/server/filesystem/FSODescriptor.java
+++ b/src/main/java/org/caosdb/server/filesystem/FSODescriptor.java
@@ -43,6 +43,7 @@ public class FSODescriptor implements VirtualFSODescriptorInterface {
   protected List<VirtualFSODescriptorInterface> children;
   private RealFSODescriptorInterface twin;
   private EntityID linkTarget = null;
+  private boolean isImport = false;
 
   public FSODescriptor(
       final String fileStorageId,
@@ -283,4 +284,13 @@ public class FSODescriptor implements VirtualFSODescriptorInterface {
     result.type = ObjectType.LINK;
     return result;
   }
+
+  @Override
+  public boolean isImport() {
+    return isImport;
+  }
+
+  public void setImport(boolean isImport) {
+    this.isImport = isImport;
+  }
 }
diff --git a/src/main/java/org/caosdb/server/filesystem/FileStorageInterface.java b/src/main/java/org/caosdb/server/filesystem/FileStorageInterface.java
index e2bca5afea193b9727534bdc153c4f4aa825468b..90f49e9a380ccd2a30404f22531b47c0c8ff8486 100644
--- a/src/main/java/org/caosdb/server/filesystem/FileStorageInterface.java
+++ b/src/main/java/org/caosdb/server/filesystem/FileStorageInterface.java
@@ -48,8 +48,10 @@ public interface FileStorageInterface {
 
   public abstract Hash getHash(FSODescriptorInterface fso, String algorithm);
 
-  /** Return true iff an object with this key exists. */
-  public abstract boolean exists(String key);
+  /** Return true if this object exists. */
+  public abstract boolean exists(VirtualFSODescriptorInterface fso);
 
   public abstract Iterable<? extends RealFSODescriptorInterface> list(String prefix);
+
+  public abstract RealFSODescriptorInterface resolve(VirtualFSODescriptorInterface fso);
 }
diff --git a/src/main/java/org/caosdb/server/filesystem/FileSystem.java b/src/main/java/org/caosdb/server/filesystem/FileSystem.java
index 800a003bf58de1c92d86e636e54a6434136b8d0f..dcd685fd95724d6b636ec7556c52b9f37eb5e474 100644
--- a/src/main/java/org/caosdb/server/filesystem/FileSystem.java
+++ b/src/main/java/org/caosdb/server/filesystem/FileSystem.java
@@ -84,10 +84,10 @@ public class FileSystem implements FileSystemInterface {
   //    return false;
   //  }
 
-  public static Boolean exists(FSODescriptorInterface fso) {
+  public static Boolean exists(VirtualFSODescriptorInterface fso) {
     FileStorageInterface fileStorage = getInstance().getFileStorage(fso);
     if (fileStorage.getCapabilities().existence) {
-      return fileStorage.exists(fso.getKey());
+      return fileStorage.exists(fso);
     }
     return null;
   }
@@ -98,6 +98,11 @@ public class FileSystem implements FileSystemInterface {
     return fileStorage.move(fso, target);
   }
 
+  public RealFSODescriptorInterface resolve(VirtualFSODescriptorInterface fso) {
+    FileStorageInterface fileStorage = getInstance().getFileStorage(fso);
+    return fileStorage.resolve(fso);
+  }
+
   //  public static boolean resolve(FSODescriptorInterface fso) {
   //    FileStorageInterface fileStorage = getInstance().getFileStorage(fso);
   //    return fileStorage.resolve(fso);
diff --git a/src/main/java/org/caosdb/server/filesystem/LocalFileStorage.java b/src/main/java/org/caosdb/server/filesystem/LocalFileStorage.java
index 40836edbf5fd8ac9cd310a28385f3300801f1196..bfc8fe12f8987c16231f58571860990e689bd793 100644
--- a/src/main/java/org/caosdb/server/filesystem/LocalFileStorage.java
+++ b/src/main/java/org/caosdb/server/filesystem/LocalFileStorage.java
@@ -284,6 +284,16 @@ public abstract class LocalFileStorage implements FileStorageInterface {
     return new LocalFSODescriptor(this, key);
   }
 
+  @Override
+  public RealFSODescriptorInterface resolve(VirtualFSODescriptorInterface fso) {
+    String key = fso.getKey();
+    if (key == null) {
+      key = fso.getPath().toString();
+      fso.setKey(key);
+    }
+    return resolve(key);
+  }
+
   @Override
   public Undoable move(final RealFSODescriptorInterface file, VirtualFSODescriptorInterface target)
       throws Message {
@@ -698,7 +708,12 @@ public abstract class LocalFileStorage implements FileStorageInterface {
   }
 
   @Override
-  public boolean exists(String key) {
+  public boolean exists(VirtualFSODescriptorInterface fso) {
+    String key = fso.getKey();
+    if (key == null) {
+      key = fso.getPath().toString();
+      fso.setKey(key);
+    }
     return !isFree(key);
   }
 
diff --git a/src/main/java/org/caosdb/server/filesystem/SharedFileStorage.java b/src/main/java/org/caosdb/server/filesystem/SharedFileStorage.java
index e66bf2b9f1562e915f4bcaa35359e8fcca9af732..ac47dbd8494c11f87949f257afe0b31f413edd6a 100644
--- a/src/main/java/org/caosdb/server/filesystem/SharedFileStorage.java
+++ b/src/main/java/org/caosdb/server/filesystem/SharedFileStorage.java
@@ -64,7 +64,7 @@ public class SharedFileStorage extends LocalFileStorage {
     }
 
     // known to this fs?
-    if (!exists(path)) {
+    if (!exists(getFile(path))) {
       return null;
     }
 
diff --git a/src/main/java/org/caosdb/server/filesystem/VirtualFSODescriptorInterface.java b/src/main/java/org/caosdb/server/filesystem/VirtualFSODescriptorInterface.java
index f76c997ae1ee1396f99b5815000177851071548c..4e65b45ba964062ce6d7a7afc37eae98ce699f3a 100644
--- a/src/main/java/org/caosdb/server/filesystem/VirtualFSODescriptorInterface.java
+++ b/src/main/java/org/caosdb/server/filesystem/VirtualFSODescriptorInterface.java
@@ -126,4 +126,6 @@ public interface VirtualFSODescriptorInterface extends FSODescriptorInterface {
   public abstract Path getLinkTargetPath();
 
   public abstract void setLinkTargetPath(Path target);
+
+  public abstract boolean isImport();
 }
diff --git a/src/main/java/org/caosdb/server/filesystem/consistency/ConsistencyCheck.java b/src/main/java/org/caosdb/server/filesystem/consistency/ConsistencyCheck.java
index b5dd679f36ba83eabf6fb9a264af2d712330fbd3..71e1a2cd7dea2573d8bb0b10382b4362171aafdd 100644
--- a/src/main/java/org/caosdb/server/filesystem/consistency/ConsistencyCheck.java
+++ b/src/main/java/org/caosdb/server/filesystem/consistency/ConsistencyCheck.java
@@ -244,7 +244,7 @@ class RunThroughInternalFileSystem extends ConsistencyCheckStrategy {
     return null;
   }
 
-  private RealFSODescriptorInterface resolve(FSODescriptorInterface fso) {
+  private RealFSODescriptorInterface resolve(VirtualFSODescriptorInterface fso) {
     RealFSODescriptorInterface result = null;
     result = FileSystem.getInstance().resolve(fso.getFileStorageId(), fso.getKey());
     Boolean exists = FileSystem.exists(fso);
diff --git a/src/main/java/org/caosdb/server/jobs/FilesJob.java b/src/main/java/org/caosdb/server/jobs/FilesJob.java
index f769481c9f52326274fb1261bcb1631860689d48..70b099ea7e8d77fb88f66a570bc679b7e4656a9b 100644
--- a/src/main/java/org/caosdb/server/jobs/FilesJob.java
+++ b/src/main/java/org/caosdb/server/jobs/FilesJob.java
@@ -22,8 +22,11 @@
  */
 package org.caosdb.server.jobs;
 
+import org.caosdb.server.entity.Message;
+import org.caosdb.server.filesystem.FileSystem;
 import org.caosdb.server.filesystem.RealFSODescriptorInterface;
 import org.caosdb.server.filesystem.VirtualFSODescriptorInterface;
+import org.caosdb.server.utils.ServerMessages;
 
 public abstract class FilesJob extends EntityJob {
 
@@ -32,11 +35,23 @@ public abstract class FilesJob extends EntityJob {
    *
    * @param tmpFileId
    * @return
+   * @throws Message
    */
-  protected RealFSODescriptorInterface getRealFSODescriptor(VirtualFSODescriptorInterface fso) {
+  protected RealFSODescriptorInterface getRealFSODescriptor(VirtualFSODescriptorInterface fso)
+      throws Message {
     if (fso.getTwin() != null) {
       return fso.getTwin();
     }
+    if (fso.isImport()) {
+      if (FileSystem.exists(getEntity().getFSODescriptor())) {
+        RealFSODescriptorInterface twin =
+            FileSystem.getInstance().resolve(getEntity().getFSODescriptor());
+        getEntity().getFSODescriptor().setTwin(twin);
+        return twin;
+      } else if (getEntity().getFSODescriptor().isImport()) {
+        throw ServerMessages.FILE_IMPORT_FAILED_FILE_DOES_NOT_EXIST;
+      }
+    }
     return getContainer().getFiles().get(fso.getTmpIdentifier());
   }
 }
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 6d3815537f8420109a2207ada1e8f115b11aa6cc..60e5ddd5f60fcfea75c39637bd9a72aa134c8d13 100644
--- a/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java
+++ b/src/main/java/org/caosdb/server/jobs/core/CheckTargetPathValid.java
@@ -23,6 +23,7 @@
 package org.caosdb.server.jobs.core;
 
 import org.caosdb.server.database.backend.transaction.CheckTargetPath;
+import org.caosdb.server.filesystem.FileSystem;
 import org.caosdb.server.filesystem.VirtualFSODescriptorInterface;
 import org.caosdb.server.jobs.FilesJob;
 import org.caosdb.server.utils.EntityStatus;
@@ -51,6 +52,15 @@ public class CheckTargetPathValid extends FilesJob {
       // check that target path is not owned by another entity.
       final CheckTargetPath t = new CheckTargetPath(getEntity(), getContainer());
       execute(t);
+
+      // check if the fso exists in the file storage
+      if (FileSystem.exists(getEntity().getFSODescriptor())) {
+        if (getEntity().getFSODescriptor().isImport()) {
+          // ok?
+        } else {
+          // is update?
+        }
+      }
     }
   }
 }
diff --git a/src/main/java/org/caosdb/server/utils/ServerMessages.java b/src/main/java/org/caosdb/server/utils/ServerMessages.java
index ed048f3c658841547a2ccad523d584d6b1cf5d5d..25d52bc01a9c21c1a1c3fc799222052e1863ec2d 100644
--- a/src/main/java/org/caosdb/server/utils/ServerMessages.java
+++ b/src/main/java/org/caosdb/server/utils/ServerMessages.java
@@ -168,6 +168,12 @@ public class ServerMessages {
           MessageCode.MESSAGE_CODE_FILE_HAS_NOT_BEEN_UPLOAED,
           "File has not been uploaded.");
 
+  public static final Message FILE_IMPORT_FAILED_FILE_DOES_NOT_EXIST =
+      new Message(
+          MessageType.Error,
+          MessageCode.MESSAGE_CODE_UNKNOWN,
+          "This file does not exist. It cannot be imported.");
+
   public static final Message CANNOT_MOVE_FILE_TO_TARGET_PATH =
       new Message(
           MessageType.Error,