diff --git a/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java b/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java
index 7a8fa6c6c8595c001500e1b61aeeaddacc1da417..26cedb8d3367d84c6f137f8efdf37e3ce675afd8 100644
--- a/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java
+++ b/api-data-store-server-java/src/main/java/ch/ethz/sis/afsclient/client/AfsClient.java
@@ -172,8 +172,8 @@ public final class AfsClient implements PublicAPI, ClientAPI
     {
         validateSessionToken();
         return request("POST", "write", Boolean.class, Map.of("owner", owner, "source", source,
-                "offset", offset.toString(), "data", Base64.getEncoder().encodeToString(data),
-                "md5Hash", Base64.getEncoder().encodeToString(md5Hash)));
+                "offset", offset.toString(), "data", Base64.getUrlEncoder().encodeToString(data),
+                "md5Hash", Base64.getUrlEncoder().encodeToString(md5Hash)));
     }
 
     @Override
diff --git a/api-data-store-server-javascript/src/js/api/server-data-store-facade.js b/api-data-store-server-javascript/src/js/api/server-data-store-facade.js
index a57cbb8f8862901d27623cc9921ec1fd5ba9d35e..b7eb79b49eebc81b7560559df4dd33227de37aab 100644
--- a/api-data-store-server-javascript/src/js/api/server-data-store-facade.js
+++ b/api-data-store-server-javascript/src/js/api/server-data-store-facade.js
@@ -1,5 +1,5 @@
-// ;(function(global){
-//   'use strict'
+;(function(global){
+  'use strict'
 
 /**
  * ======================================================
@@ -465,8 +465,9 @@ DataStoreServer.prototype.write = function(owner, source, offset, data){
 		"owner" : owner,
 		"source": source,
 		"offset": offset,
-		"data":  base64URLencode(data),
-		"md5Hash":  base64URLencode(hex2a(md5(data))),
+		// use base64 url version of encoding that produces url safe characters only (default version of base64 produces "+" and "/" which need to be further converted by encodeURIComponent to "%2B" and "%2F" and therefore they unnecessarily increase the request size)
+		"data":  base64URLEncode(data),
+		"md5Hash":  base64URLEncode(hex2a(md5(data))),
 	});
 
 	return this._internal.sendHttpRequest(
@@ -643,11 +644,6 @@ DataStoreServer.prototype.recover = function(){
 	);
 }
 
-function base64URLencode(str) {
-	const base64Encoded = btoa(str);
-	return base64Encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
-}
-
 /**
  * ==================================================================================
  * DTO
@@ -719,6 +715,11 @@ var hex2a = function(hexx) {
     return str;
 }
 
+function base64URLEncode(str) {
+	const base64Encoded = btoa(str);
+	return base64Encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+}
+
 var md5 = (function(){
 
     function md5cycle(x, k) {
@@ -908,21 +909,21 @@ var md5 = (function(){
 
     return md5;
 })();
-//
-// /**
-//  * ==================================================================================
-//  * EXPORT
-//  * ==================================================================================
-//  */
-//
-// if (typeof define === 'function' && define.amd) {
-//   define(function () {
-//     return DataStoreServer
-//   })
-// } else if (typeof module === 'object' && module.exports) {
-//   module.exports = DataStoreServer
-// } else {
-//   global.DataStoreServer = DataStoreServer
-// }
-//
-// })(this);
\ No newline at end of file
+
+/**
+ * ==================================================================================
+ * EXPORT
+ * ==================================================================================
+ */
+
+if (typeof define === 'function' && define.amd) {
+  define(function () {
+    return DataStoreServer
+  })
+} else if (typeof module === 'object' && module.exports) {
+  module.exports = DataStoreServer
+} else {
+  global.DataStoreServer = DataStoreServer
+}
+
+})(this);
\ No newline at end of file
diff --git a/api-openbis-javascript/src/v3/openbis.js b/api-openbis-javascript/src/v3/openbis.js
index e525f31966cca0fde250f87b0ffdff337d647ba6..f7a8d669586eb261f939331da483b19ba15f9469 100644
--- a/api-openbis-javascript/src/v3/openbis.js
+++ b/api-openbis-javascript/src/v3/openbis.js
@@ -551,7 +551,8 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
                 return asFacade._private.ajaxRequestTransactional(afsServerTransactionParticipantId, {
                     data : {
                         "method" : "write",
-                        "params" : [ owner, source, offset, btoa(data), btoa(hex2a(md5(data))) ]
+		                // use base64 url version of encoding that produces url safe characters only (default version of base64 produces "+" and "/" which need to be further converted by encodeURIComponent to "%2B" and "%2F" and therefore they unnecessarily increase the request size)
+                        "params" : [ owner, source, offset, base64URLEncode(data), base64URLEncode(hex2a(md5(data))) ]
                     }
                 })
             }else{
@@ -3078,6 +3079,11 @@ define([ 'jquery', 'util/Json', 'as/dto/datastore/search/DataStoreSearchCriteria
         return str;
     }
 
+    function base64URLEncode(str) {
+        const base64Encoded = btoa(str);
+        return base64Encoded.replace(/\+/g, '-').replace(/\//g, '_').replace(/=+$/, '');
+    }
+
     return facade;
 
 });
\ No newline at end of file
diff --git a/docs/software-developer-documentation/development-environment/system-requirements.md b/docs/software-developer-documentation/development-environment/system-requirements.md
index fae80f7c0ca53275923ed71f95c60ffbd5a6387e..3897dfc052915fbc2bc49f803e9e097d0e666300 100644
--- a/docs/software-developer-documentation/development-environment/system-requirements.md
+++ b/docs/software-developer-documentation/development-environment/system-requirements.md
@@ -1,5 +1,16 @@
-# System Requirements
+# System Software Requirements
 
-- JDK 17
+Mandatory:
+
+- JDK 17 (JDK is necessary for the development, for running the system JRE 17 headless is sufficient)
 - Postgres 15
 
+Optional:
+
+- In order to use V3 API two-phase commit please enable Postgres prepared transactions functionality. This can be done by adding to postgresql.conf file "max_prepared_transactions" setting. For instance:
+
+    ```
+    max_prepared_transactions = 10
+    ```
+
+    More information: https://www.postgresql.org/docs/15/sql-prepare-transaction.html
\ No newline at end of file
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/TransactionCoordinatorJsonServer.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/TransactionCoordinatorJsonServer.java
index 1e2834d2bdacbb497f29999a2854e83e1dd4aa8a..79ec856cdd97f5f689ad62ed155f21d2b47d4d2d 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/TransactionCoordinatorJsonServer.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/TransactionCoordinatorJsonServer.java
@@ -168,7 +168,7 @@ public class TransactionCoordinatorJsonServer extends AbstractApiJsonServiceExpo
                                 && operationArgument instanceof String)
                         {
                             // for byte[] operation arguments accept also String values
-                            convertedOperationArguments[index] = Base64.getDecoder().decode((String) operationArgument);
+                            convertedOperationArguments[index] = Base64.getUrlDecoder().decode((String) operationArgument);
                         } else if (methodParameter.getType().equals(Long.class) && operationArgument instanceof Number)
                         {
                             // for Long operation arguments accept also other Number values
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
index 3d8790d6e5d5270548506be85afd48b7c95ed7ee..590da5340d591b09b4f0dfb6d91c20156f13afa2 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutor.java
@@ -79,8 +79,6 @@ import java.util.zip.ZipEntry;
 import javax.annotation.PostConstruct;
 import javax.annotation.Resource;
 
-import com.openhtmltopdf.extend.FSSupplier;
-
 import org.apache.commons.compress.archivers.zip.ZipArchiveEntry;
 import org.apache.commons.compress.archivers.zip.ZipArchiveOutputStream;
 import org.apache.log4j.Logger;
@@ -97,6 +95,7 @@ import com.fasterxml.jackson.databind.JsonNode;
 import com.fasterxml.jackson.databind.ObjectMapper;
 import com.fasterxml.jackson.databind.ObjectWriter;
 import com.fasterxml.jackson.databind.node.TextNode;
+import com.openhtmltopdf.extend.FSSupplier;
 import com.openhtmltopdf.pdfboxout.PdfRendererBuilder;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.IApplicationServerApi;
@@ -175,16 +174,12 @@ public class ExportExecutor implements IExportExecutor
 
     public static final String EXPORT_FILE_PREFIX = "export";
 
-    public static final String METADATA_FILE_NAME = "metadata" + XLSExport.XLSX_EXTENSION;
-
     public static final String XLSX_DIRECTORY = "xlsx";
 
     public static final String PDF_DIRECTORY = "pdf";
 
     public static final String DATA_DIRECTORY = "data";
 
-    public static final String META_FILE_NAME = "meta.json";
-
     public static final String SHARED_SAMPLES_DIRECTORY = "(shared)";
 
     public static final String HTML_EXTENSION = ".html";
@@ -193,6 +188,10 @@ public class ExportExecutor implements IExportExecutor
 
     public static final String JSON_EXTENSION = ".json";
 
+    public static final String METADATA_FILE_NAME = "metadata" + XLSExport.XLSX_EXTENSION;
+
+    public static final String METADATA_JSON_FILE_NAME = "metadata" + JSON_EXTENSION;
+
     static final String NAME_PROPERTY_NAME = "$NAME";
 
     private static final String TYPE_EXPORT_FIELD_KEY = "TYPE";
@@ -577,10 +576,10 @@ public class ExportExecutor implements IExportExecutor
             final String dataSetCode = dataSet.getCode();
             final String dataSetTypeCode = dataSet.getType().getCode();
             final String dataSetName = getEntityName(dataSet);
+            final String dataDirectorySuffix = "#" + UUID.randomUUID();
 
-            final File metadataJsonFile = createMetadataJsonFile(parentDataDirectory, prefix, spaceCode, projectCode, containerCode, code,
-                    dataSetTypeCode, dataSetCode, dataSetName, codeHolderJson, compatibleWithImport);
-            createDocFilesForDataSet(sessionToken, metadataJsonFile.getParentFile(), null, dataSet, EnumSet.of(ExportFormat.PDF));
+            createMetadataJsonFile(parentDataDirectory, prefix, spaceCode, projectCode, containerCode, code,
+                    dataSetTypeCode, dataSetCode, dataSetName, dataDirectorySuffix, codeHolderJson, compatibleWithImport);
 
             if (dataSet.getKind() != DataSetKind.LINK)
             {
@@ -604,7 +603,7 @@ public class ExportExecutor implements IExportExecutor
                     while ((file = reader.read()) != null)
                     {
                         createNextDataFile(parentDataDirectory, prefix, spaceCode, projectCode,
-                                containerCode, code, dataSetTypeCode, dataSetCode, dataSetName, file, compatibleWithImport);
+                                containerCode, code, dataSetTypeCode, dataSetCode, dataSetName, dataDirectorySuffix, file, compatibleWithImport);
                     }
                 }
             } else
@@ -628,33 +627,34 @@ public class ExportExecutor implements IExportExecutor
 
     private static File createMetadataJsonFile(final File parentDataDirectory, final char prefix,
             final String spaceCode, final String projectCode, final String containerCode, final String code, final String dataSetTypeCode,
-            final String dataSetCode, final String dataSetName, final String codeHolderJson, final boolean compatibleWithImport) throws IOException
+            final String dataSetCode, final String dataSetName, final String dataDirectorySuffix, final String codeHolderJson,
+            final boolean compatibleWithImport) throws IOException
     {
-        final File metadataFile;
+        final File metadataJsonFile;
 
         if (compatibleWithImport)
         {
             final File dataDirectory = new File(parentDataDirectory, DATA_DIRECTORY + '/');
             mkdirs(dataDirectory);
-            metadataFile = new File(dataDirectory,
-                    getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, code, dataSetTypeCode, dataSetCode, dataSetName,
-                            META_FILE_NAME));
+            metadataJsonFile = new File(dataDirectory,
+                    getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, code, dataSetTypeCode,
+                            dataDirectorySuffix, METADATA_JSON_FILE_NAME));
         } else
         {
             final File dataDirectory = new File(parentDataDirectory, getFullEntityName(dataSetCode, dataSetName));
             mkdirs(dataDirectory);
-            metadataFile = new File(new File(dataDirectory, DATA_DIRECTORY), META_FILE_NAME);
+            metadataJsonFile = new File(new File(dataDirectory, DATA_DIRECTORY), METADATA_JSON_FILE_NAME);
         }
 
-        final File dataSubdirectory = metadataFile.getParentFile();
+        final File dataSubdirectory = metadataJsonFile.getParentFile();
         mkdirs(dataSubdirectory);
 
-        try (final OutputStream os = new BufferedOutputStream(new FileOutputStream(metadataFile)))
+        try (final OutputStream os = new BufferedOutputStream(new FileOutputStream(metadataJsonFile)))
         {
             writeInChunks(os, codeHolderJson.getBytes(StandardCharsets.UTF_8));
         }
 
-        return metadataFile;
+        return metadataJsonFile;
     }
 
     private void exportSpacesDoc(final String sessionToken, final Map<String, Map<String, List<Map<String, String>>>> exportFields,
@@ -1090,12 +1090,11 @@ public class ExportExecutor implements IExportExecutor
     }
 
     private void createDocFilesForDataSet(final String sessionToken, final File docDirectory,
-            final Map<String, List<Map<String, String>>> entityTypeExportFieldsMap,
             final DataSet dataSet, final Set<ExportFormat> exportFormats) throws IOException
     {
         final boolean hasHtmlFormat = exportFormats.contains(ExportFormat.HTML);
         final boolean hasPdfFormat = exportFormats.contains(ExportFormat.PDF);
-        final String html = getHtml(sessionToken, dataSet, entityTypeExportFieldsMap);
+        final String html = getHtml(sessionToken, dataSet, null);
         final byte[] htmlBytes = html.getBytes(StandardCharsets.UTF_8);
 
         if (hasHtmlFormat)
@@ -1232,7 +1231,8 @@ public class ExportExecutor implements IExportExecutor
 
     private static void createNextDataFile(final File parentDataDirectory, final char prefix, final String spaceCode, final String projectCode,
             final String containerCode, final String entityCode, final String dataSetTypeCode, final String dataSetCode,
-            final String dataSetName, final DataSetFileDownload dataSetFileDownload, final boolean compatibleWithImport) throws IOException
+            final String dataSetName, final String dataDirectorySuffix, final DataSetFileDownload dataSetFileDownload,
+            final boolean compatibleWithImport) throws IOException
     {
         final DataSetFile dataSetFile = dataSetFileDownload.getDataSetFile();
         final String filePath = dataSetFile.getPath();
@@ -1244,7 +1244,7 @@ public class ExportExecutor implements IExportExecutor
             final File dataDirectory = new File(parentDataDirectory, DATA_DIRECTORY + '/');
             mkdirs(dataDirectory);
             dataSetFsEntry = new File(dataDirectory, getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode,
-                    dataSetTypeCode, dataSetCode, dataSetName, filePath) + (isDirectory ? "/" : ""));
+                    dataSetTypeCode, dataDirectorySuffix, filePath) + (isDirectory ? "/" : ""));
         } else
         {
             final File datasetDirectory = new File(parentDataDirectory, getFullEntityName(dataSetCode, dataSetName));
@@ -1272,7 +1272,7 @@ public class ExportExecutor implements IExportExecutor
 
     static String getDataDirectoryName(final char prefix, final String spaceCode, final String projectCode,
             final String containerCode, final String entityCode, final String dataSetTypeCode,
-            final String dataSetCode, final String dataSetName, final String fileName)
+            final String dataDirectorySuffix, final String fileName)
     {
         if (prefix != 'O' && prefix != 'E')
         {
@@ -1322,13 +1322,9 @@ public class ExportExecutor implements IExportExecutor
             throw new IllegalArgumentException("Data set type code is mandatory");
         }
 
-        if (dataSetCode != null)
-        {
-            entryBuilder.append('+');
-            addFullEntityName(entryBuilder, null, dataSetCode, dataSetName);
-        } else
+        if (dataDirectorySuffix != null)
         {
-            throw new IllegalArgumentException("Data set code is mandatory");
+            entryBuilder.append(dataDirectorySuffix);
         }
 
         if (fileName != null)
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
index aa8e5edb34335e4bed95e16441cbc70cc63fca13..d67b599f33c3c7a30ed3f40983c12e0453c08f54 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
@@ -49,6 +49,8 @@ public class ExportExecutorTest
 
     private static final String DATA_SET_CODE = "TEST_DATA_SET";
 
+    public static final String UUID_SUFFIX = "#123e4567-e89b-12d3-a456-426614174000";
+
     private static final Object[][] NEXT_ZIP_ENTRY_DATA = {
             {
                     null, null, null, null, null, null, null, null, null, "/"
@@ -237,82 +239,58 @@ public class ExportExecutorTest
 
     private static final Object[][] FOLDER_NAME_DATA = {
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", null,
-                    "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)"
-            },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file",
-                    "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
-            },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", null, "file",
-                    "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ1+ANALYZED_DATA+20231201115004780-27/file"
-            },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file",
-                    "O+DEFAULT_LAB_NOTEBOOK+OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", null,
+                    "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ1+ANALYZED_DATA" + UUID_SUFFIX
             },
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", null, "file",
-                    "O+DEFAULT_LAB_NOTEBOOK+OBJ1+ANALYZED_DATA+20231201115004780-27/file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "file",
+                    "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ1+ANALYZED_DATA"  + UUID_SUFFIX + "/file"
             },
             {
-                    'O', null, null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file",
-                    "O+OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", null, null, "OBJ1", "ANALYZED_DATA", "file",
+                    "O+DEFAULT_LAB_NOTEBOOK+OBJ1+ANALYZED_DATA"  + UUID_SUFFIX + "/file"
             },
             {
-                    'O', null, null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", null, "file",
-                    "O+OBJ1+ANALYZED_DATA+20231201115004780-27/file"
+                    'O', null, null, null, "OBJ1", "ANALYZED_DATA", "file",
+                    "O+OBJ1+ANALYZED_DATA" + UUID_SUFFIX + "/file"
             },
             {
-                    'E', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file",
-                    "E+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+EXP1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
+                    'E', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "EXP1", "ANALYZED_DATA", "file",
+                    "E+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+EXP1+ANALYZED_DATA" + UUID_SUFFIX + "/file"
             },
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "OBJ_CONTAINER", "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset",
-                    "file", "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ_CONTAINER*OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "OBJ_CONTAINER", "OBJ1", "ANALYZED_DATA",
+                    "file", "O+DEFAULT_LAB_NOTEBOOK+DEFAULT_PROJECT+OBJ_CONTAINER*OBJ1+ANALYZED_DATA" + UUID_SUFFIX + "/file"
             },
     };
 
     private static final Object[][] ERRONEOUS_FOLDER_NAME_DATA = {
             {
-                    'P', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+                    'P', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "file"
             },
             {
-                    'O', null, "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+                    'O', null, "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "file"
             },
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, null, "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, null, "ANALYZED_DATA", "file"
             },
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "OBJ_CONTAINER", null, "ANALYZED_DATA", "20231201115004780-27", "my dataset",
-                    "file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "OBJ_CONTAINER", null, "ANALYZED_DATA", "file"
             },
             {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", null, "20231201115004780-27", "my dataset", "file"
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", null, "file"
             },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", null, "my dataset", "file"
-            },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", null, null, "file"
-            },
-            {
-                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", null, null, null
-            },
-
             {
                     // Experiments cannot have containers
-                    'E', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "EXP_CONTAINER", "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset",
-                    "file"
+                    'E', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "EXP_CONTAINER", "EXP1", "ANALYZED_DATA", "file"
             },
             {
                     // Experiments cannot be on the space level
-                    'E', "DEFAULT_LAB_NOTEBOOK", null, null, "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+                    'E', "DEFAULT_LAB_NOTEBOOK", null, null, "EXP1", "ANALYZED_DATA", "file"
             },
             {
                     // Experiments cannot be shared (w/o space)
-                    'E', null, null, null, "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+                    'E', null, null, null, "EXP1", "ANALYZED_DATA", "file"
             },
     };
 
@@ -360,19 +338,20 @@ public class ExportExecutorTest
 
     @Test(dataProvider = FOLDER_NAME_DATA_PROVIDER)
     public void testGetDataDirectoryName(final char prefix, final String spaceCode, final String projectCode,
-            final String containerCode, final String entityCode, final String dataSetTypeCode, final String dataSetCode,
-            final String dataSetName, final String fileName, final String expectedResult)
+            final String containerCode, final String entityCode, final String dataSetTypeCode,
+            final String fileName, final String expectedResult)
     {
-        assertEquals(ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode, dataSetCode,
-                dataSetName, fileName), expectedResult);
+        assertEquals(ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode,
+                UUID_SUFFIX, fileName), expectedResult);
     }
 
     @Test(dataProvider = ERRONEOUS_FOLDER_NAME_DATA_PROVIDER, expectedExceptions = IllegalArgumentException.class)
     public void testGetDataDirectoryNameError(final char prefix, final String spaceCode, final String projectCode,
-            final String containerCode, final String entityCode, final String dataSetTypeCode, final String dataSetCode,
-            final String dataSetName, final String fileName)
+            final String containerCode, final String entityCode, final String dataSetTypeCode,
+            final String fileName)
     {
-        ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode, dataSetCode, dataSetName, fileName);
+        ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode,
+                UUID_SUFFIX, fileName);
     }
 
     @Test()
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportData.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportData.java
index 4c2afd458f42da996d2a638ffce90b501593303d..19c4099407bc392a4ca9fdcb3b8869751b210358 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportData.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportData.java
@@ -148,17 +148,6 @@ class ExportData
                     false, // withImportCompatibility
                     true
             },
-//            {
-//                    // Sample: /MP:A03
-//                    "export-sample-contained-xlsx.zip",
-//                    EnumSet.of(ExportFormat.XLSX),
-//                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050947161-653"))),
-//                    new AllFields(),
-//                    XlsTextFormat.RICH,
-//                    false, // withReferredTypes
-//                    false, // withImportCompatibility
-//                    true
-//            },
             {
                     // Data set: "ROOT_CONTAINER"
                     "export-data-set-xlsx.zip",
@@ -405,17 +394,6 @@ class ExportData
                     false, // withImportCompatibility
                     true
             },
-//            {
-//                    // Sample: /MP:A03
-//                    "export-sample-contained-html.zip",
-//                    EnumSet.of(ExportFormat.HTML),
-//                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050947161-653"))),
-//                    new AllFields(),
-//                    XlsTextFormat.RICH,
-//                    false, // withReferredTypes
-//                    false, // withImportCompatibility
-//                    true
-//            },
             {
                     // Data set: "ROOT_CONTAINER"
                     "export-data-set-html.zip",
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportTest.java
index 1a43c36ba5ebb779a47f6495bc95a997fb8e6c00..f006733b63c3022735ecf0f48a546be472bff2a9 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportTest.java
@@ -54,6 +54,7 @@ import java.net.URL;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 import java.util.EnumSet;
+import java.util.Enumeration;
 import java.util.List;
 import java.util.Map;
 import java.util.Objects;
@@ -625,8 +626,11 @@ public class ExportTest extends AbstractTest
         )
         {
             final Set<String> expectedZipEntries = extectedZipFile.stream().map(ZipEntry::getName).collect(Collectors.toSet());
-            final Set<String> actualZipEntries = actualZipFile.stream().map(ZipEntry::getName).collect(Collectors.toSet());
-            assertEquals(actualZipEntries, expectedZipEntries);
+            final Set<String> cleanedExpectedZipEntries = expectedZipEntries.stream().map(this::removeUuid).collect(Collectors.toSet());
+            final Set<String> cleanedActualZipEntries = actualZipFile.stream().map(zipEntry -> removeUuid(zipEntry.getName()))
+                    .collect(Collectors.toSet());
+
+            assertEquals(cleanedActualZipEntries, cleanedExpectedZipEntries);
 
             for (final String expectedZipEntry : expectedZipEntries)
             {
@@ -644,7 +648,7 @@ public class ExportTest extends AbstractTest
                     // We ignore PDF and JSON files in comparison
                     try (
                             final InputStream expectedInputStream = extectedZipFile.getInputStream(extectedZipFile.getEntry(expectedZipEntry));
-                            final InputStream actualInputStream = actualZipFile.getInputStream(actualZipFile.getEntry(expectedZipEntry));
+                            final InputStream actualInputStream = actualZipFile.getInputStream(findEntry(actualZipFile, expectedZipEntry));
                     )
                     {
                         compareStreams(expectedInputStream, actualInputStream);
@@ -654,6 +658,28 @@ public class ExportTest extends AbstractTest
         }
     }
 
+    private ZipEntry findEntry(final ZipFile actualZipFile, final String expectedZipEntryName)
+    {
+        final Enumeration<? extends ZipEntry> entries = actualZipFile.entries();
+        while (entries.hasMoreElements())
+        {
+            final ZipEntry entry = entries.nextElement();
+            final String entryName = entry.getName();
+            final String cleanedActualEntryName = removeUuid(entryName);
+            if (cleanedActualEntryName.equals(removeUuid(expectedZipEntryName)))
+            {
+                return entry;
+            }
+        }
+
+        throw new IllegalArgumentException("Entry (with removed UUID) not found: " + expectedZipEntryName);
+    }
+
+    private String removeUuid(final String inputString)
+    {
+        return inputString.replaceFirst("#[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}", "");
+    }
+
     private void compareDirectories(final File expectedDirectory, final File actualDirectory) throws IOException
     {
         final File[] expectedFiles = expectedDirectory.listFiles();
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data-compatible-with-import.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data-compatible-with-import.zip
index ff5a24cbfefdcb0c49326af8823c9288e7905557..e67ebdd498522832e5bfc512c84e9044bc447737 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data-compatible-with-import.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data-compatible-with-import.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data.zip
index 4481c90dd3c42f46881b26bf1bc4a65f6dff3119..f2c9cb0418260daab12daf09ec41ffb3a858970c 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-data.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all-compatible-with-import.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all-compatible-with-import.zip
index 83b5a31c2d66f652a3ccf25262a794fc002c4c1d..21240eec08fa258e7f64d9a869e28465dfc4bbf8 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all-compatible-with-import.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all-compatible-with-import.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all.zip
index 0d38f2c2ad6d7443b7f246645e11f027e04ddb91..e24ab081b35e09e6c213509b482c77b29f585f3e 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-all.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data-compatible-with-import.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data-compatible-with-import.zip
index 939121f27d137b2dc3924b6e841e09a1de276d78..a0d7983cb92a0f0201c0725f19b2339a90d5c103 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data-compatible-with-import.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data-compatible-with-import.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data.zip
index c035b12ae3f1be5f6f9ecefc515954b69c94bf81..f18c32a25792bbd104902b98889498ba426019b9 100644
Binary files a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data.zip and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-data.zip differ
diff --git a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/drop-boxes/eln-lims-dropbox/eln-lims-dropbox.py b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/drop-boxes/eln-lims-dropbox/eln-lims-dropbox.py
index 45db4f0ff5db961980b3a70fd37636dc52650cf1..e26d6e6d43ba0ece55e025a1d642b7043d7fddd9 100644
--- a/ui-eln-lims/src/core-plugins/eln-lims/1/dss/drop-boxes/eln-lims-dropbox/eln-lims-dropbox.py
+++ b/ui-eln-lims/src/core-plugins/eln-lims/1/dss/drop-boxes/eln-lims-dropbox/eln-lims-dropbox.py
@@ -30,7 +30,7 @@ errorMessages = []
 
 def process(transaction):
     incoming = transaction.getIncoming();
-    folderName = incoming.getName();
+    folderName = substring_up_to_hash(incoming.getName());
     emailAddress = None
 
     try:
@@ -199,6 +199,11 @@ def process(transaction):
         reportAllIssues(transaction, emailAddress)
 
 
+def substring_up_to_hash(input_string):
+    hash_index = input_string.rfind('#')
+    return input_string[:hash_index] if hash_index >=0 else input_string
+
+
 def pathListToStr(list):
     return "\n".join(list)