diff --git a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
index c4f42f17cb6f9f015cda576d2473c54c82210d7c..723e51c55b43945509f79d7d98d67e2f9b44c591 100644
--- a/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
+++ b/datastore_server/source/java/ch/systemsx/cisd/etlserver/api/v1/PutDataSetService.java
@@ -273,6 +273,11 @@ public class PutDataSetService implements IPutDataSetService
     public List<DataSetInformation> putDataSet(String sessionToken, NewDataSetDTO newDataSet, String uploadId)
             throws IOExceptionUnchecked, IllegalArgumentException
     {
+        if (newDataSet == null)
+        {
+            throw new UserFailureException("New data set cannot be null");
+        }
+
         if (false == isInitialized)
         {
             doInitialization();
@@ -280,37 +285,59 @@ public class PutDataSetService implements IPutDataSetService
 
         validateSessionToken(sessionToken);
         validateUploadId(uploadId);
-        if (newDataSet == null)
+
+        ServiceProvider.getOpenBISService().checkSession(sessionToken);
+
+        File sessionWorkspaceUploadDir = new File(new File(sessionWorkspace, sessionToken), uploadId);
+
+        List<DataSetInformation> result = null;
+        if (sessionWorkspaceUploadDir.exists())
         {
-            throw new UserFailureException("New data set cannot be null");
+            result = putDataSetFromSessionWorkspaceFileUpload(sessionToken, newDataSet, uploadId);
+        } else {
+            result = putDataSetFromStoreShareFileUpload(sessionToken, newDataSet, uploadId);
         }
+        return result;
+    }
 
-        ServiceProvider.getOpenBISService().checkSession(sessionToken);
+    private List<DataSetInformation> putDataSetFromSessionWorkspaceFileUpload(String sessionToken, NewDataSetDTO newDataSet, String uploadId)
+            throws IOExceptionUnchecked, IllegalArgumentException {
+        String dataSetType = newDataSet.tryDataSetType();
+        ITopLevelDataSetRegistrator registrator = registratorMap.getRegistratorForType(dataSetType);
+
+        File tempIncomingDir = new File(new File(sessionWorkspace, sessionToken), uploadId);
+
+        File[] filesInIncomingDir = tempIncomingDir.listFiles();
+        if (filesInIncomingDir.length != 1) {
+            throw new UserFailureException("Unexpected state, incoming directory should contain just one file or folder but found: " + filesInIncomingDir.length);
+        }
+
+        if (registrator instanceof PutDataSetServerPluginHolder)
+        {
+            return new PutDataSetExecutor(this, ((PutDataSetServerPluginHolder) registrator).getPlugin(), sessionToken, newDataSet, tempIncomingDir,
+                    filesInIncomingDir[0]).executeWithoutWriting();
+        } else
+        {
+            return new PutDataSetTopLevelDataSetHandler(this, registrator, sessionToken, newDataSet, tempIncomingDir, filesInIncomingDir[0]).executeWithoutWriting();
+        }
+    }
+
+    private List<DataSetInformation> putDataSetFromStoreShareFileUpload(String sessionToken, NewDataSetDTO newDataSet, String uploadId)
+            throws IOExceptionUnchecked, IllegalArgumentException {
 
         String dataSetType = newDataSet.tryDataSetType();
         ITopLevelDataSetRegistrator registrator = registratorMap.getRegistratorForType(dataSetType);
 
-        // TODO: here look in the session workspace.
         File sessionUploadDir = new File(getTemporaryIncomingRoot(dataSetType), sessionToken);
         File uploadIdDir = new File(sessionUploadDir, uploadId);
-        System.out.println("uploadIdDir = " + uploadIdDir);
-
         File multipleFilesUploadDir = new File(uploadIdDir, MULTIPLE_FILES_UPLOAD_DIR);
-        System.out.println("multipleFilesUploadDir = " + multipleFilesUploadDir);
-
-        File sessionWorkspaceUploadDir = new File(sessionWorkspace, sessionToken);
-        System.out.println("multipleFilesUploadDir = " + multipleFilesUploadDir);
 
         File[] uploadedFiles = null;
         File dataSet = null;
 
-        if (multipleFilesUploadDir.isDirectory())
+        if (multipleFilesUploadDir.exists() && multipleFilesUploadDir.isDirectory())
         {
             uploadedFiles = multipleFilesUploadDir.listFiles();
-        } else if (sessionWorkspaceUploadDir.isDirectory())
-        {
-            // TODO: use atomic move in this case.
-            uploadedFiles = sessionWorkspaceUploadDir.listFiles();
         }
 
         if (uploadedFiles == null || uploadedFiles.length == 0)
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/OpenBISAPI.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/OpenBISAPI.java
index eda8306e40f685d07c8faf30e0f70cf6fc0aaf62..68126e7015efeccb51e97c993302d9d8925cf504 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/OpenBISAPI.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/OpenBISAPI.java
@@ -5,6 +5,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
 import ch.ethz.sis.openbis.generic.dssapi.v3.IDataStoreServerApi;
 import ch.ethz.sis.openbis.generic.dssapi.v3.dto.dataset.create.UploadedDataSetCreation;
 import ch.systemsx.cisd.common.exceptions.UserFailureException;
@@ -95,7 +96,9 @@ public class OpenBISAPI {
 
     public String uploadFileWorkspaceDSS(final Path fileOrFolder)
     {
-        return uploadFileWorkspaceDSS(fileOrFolder.toFile(), null);
+        String uploadId = uploadFileWorkspaceDSSEmptyDir(UUID.randomUUID().toString());
+        uploadFileWorkspaceDSS(fileOrFolder.toFile(), uploadId);
+        return uploadId;
     }
 
     //