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
new file mode 100644
index 0000000000000000000000000000000000000000..016aa4035fe826207d11760de9d4f14c8a38ca02
--- /dev/null
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/exporter/ExportExecutorTest.java
@@ -0,0 +1,384 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.exporter;
+
+import static org.testng.Assert.assertEquals;
+
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+public class ExportExecutorTest
+{
+
+    private static final String NEXT_ZIP_ENTRY_DATA_PROVIDER = "nextZipEntryData";
+
+    private static final String ERRONEOUS_NEXT_ZIP_ENTRY_DATA_PROVIDER = "erroneousNextZipEntryData";
+
+    private static final String FOLDER_NAME_DATA_PROVIDER = "folderNameData";
+
+    private static final String ERRONEOUS_FOLDER_NAME_DATA_PROVIDER = "erroneousFolderNameData";
+
+    private static final String SPACE_CODE = "TEST_SPACE";
+
+    private static final String PROJECT_CODE = "TEST_PROJECT";
+
+    private static final String EXPERIMENT_CODE = "TEST_EXPERIMENT";
+
+    private static final String EXPERIMENT_NAME = "Test experiment name";
+
+    private static final String SAMPLE_CODE = "TEST_SAMPLE";
+
+    private static final String SAMPLE_NAME = "Test sample name";
+
+    private static final String EXTENSION = ".pdf";
+
+    private static final String DATA_SET_CODE = "TEST_DATA_SET";
+
+    private static final Object[][] NEXT_ZIP_ENTRY_DATA = {
+            {
+                    null, null, null, null, null, null, null, null, null, "/"
+            },
+            {
+                    SPACE_CODE, null, null, null, null, null, null, null, null,
+                    String.format("%s/", SPACE_CODE)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, null, null, null, EXTENSION,
+                    String.format("%s%s", SPACE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, null, null, null,
+                    String.format("%s/%s/", SPACE_CODE, SAMPLE_CODE)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, null, null, EXTENSION,
+                    String.format("%s/%s%s", SPACE_CODE, SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, null,
+                    String.format("%s/%s (%s)/", SPACE_CODE, SAMPLE_NAME, SAMPLE_CODE)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, EXTENSION,
+                    String.format("%s/%s (%s)%s", SPACE_CODE, SAMPLE_NAME, SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, null, DATA_SET_CODE, null,
+                    String.format("%s/%s/%s/", SPACE_CODE, SAMPLE_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, null, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s/%s%s", SPACE_CODE, SAMPLE_CODE, DATA_SET_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, null,
+                    String.format("%s/%s (%s)/%s/", SPACE_CODE, SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s (%s)/%s%s", SPACE_CODE, SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, null, null, null, null,
+                    String.format("%s/%s/", SPACE_CODE, PROJECT_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, null, null, null, EXTENSION,
+                    String.format("%s/%s%s", SPACE_CODE, PROJECT_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, null,
+                    String.format("%s/%s/%s (%s)/", SPACE_CODE, PROJECT_CODE, SAMPLE_NAME, SAMPLE_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, EXTENSION,
+                    String.format("%s/%s/%s (%s)%s", SPACE_CODE, PROJECT_CODE, SAMPLE_NAME, SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, null, null, null,
+                    String.format("%s/%s/%s/", SPACE_CODE, PROJECT_CODE, SAMPLE_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, null, null, EXTENSION,
+                    String.format("%s/%s/%s%s", SPACE_CODE, PROJECT_CODE, SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, null,
+                    String.format("%s/%s/%s (%s)/%s/", SPACE_CODE, PROJECT_CODE, SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s/%s (%s)/%s%s", SPACE_CODE, PROJECT_CODE, SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE,
+                            EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, null, DATA_SET_CODE, null,
+                    String.format("%s/%s/%s/%s/", SPACE_CODE, PROJECT_CODE, SAMPLE_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, SAMPLE_CODE, null, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s/%s/%s%s", SPACE_CODE, PROJECT_CODE, SAMPLE_CODE, DATA_SET_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, null, null, null, null, null, null,
+                    String.format("%s/%s/%s/", SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, null, null, null, null, null, EXTENSION,
+                    String.format("%s/%s/%s%s", SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, null, null, null, null,
+                    String.format("%s/%s/%s (%s)/", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, null, null, null, EXTENSION,
+                    String.format("%s/%s/%s (%s)%s", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, null, null, DATA_SET_CODE, null,
+                    String.format("%s/%s/%s (%s)/%s/", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, null, null, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s/%s (%s)/%s%s", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE, DATA_SET_CODE,
+                            EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, SAMPLE_CODE, SAMPLE_NAME, null, null,
+                    String.format("%s/%s/%s (%s)/%s (%s)/", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE, SAMPLE_NAME,
+                            SAMPLE_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, SAMPLE_CODE, SAMPLE_NAME, null, EXTENSION,
+                    String.format("%s/%s/%s (%s)/%s (%s)%s", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE,
+                            SAMPLE_NAME, SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, null,
+                    String.format("%s/%s/%s (%s)/%s (%s)/%s/", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE,
+                            SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE)
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, EXTENSION,
+                    String.format("%s/%s/%s (%s)/%s (%s)/%s%s", SPACE_CODE, PROJECT_CODE, EXPERIMENT_NAME, EXPERIMENT_CODE,
+                            SAMPLE_NAME, SAMPLE_CODE, DATA_SET_CODE, EXTENSION)
+            },
+            {
+                    null, null, null, null, null, SAMPLE_CODE, null, null, null,
+                    String.format("%s/", SAMPLE_CODE)
+            },
+            {
+                    null, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, null,
+                    String.format("%s (%s)/", SAMPLE_NAME, SAMPLE_CODE)
+            },
+            {
+                    null, null, null, null, null, SAMPLE_CODE, null, null, EXTENSION,
+                    String.format("%s%s", SAMPLE_CODE, EXTENSION)
+            },
+            {
+                    null, null, null, null, null, SAMPLE_CODE, SAMPLE_NAME, null, EXTENSION,
+                    String.format("%s (%s)%s", SAMPLE_NAME, SAMPLE_CODE, EXTENSION)
+            },
+    };
+
+    private static final Object[][] ERRONEOUS_NEXT_ZIP_ENTRY_DATA = {
+            {
+                    null, PROJECT_CODE, null, null, null, null, null, null, null
+            },
+            {
+                    null, null, EXPERIMENT_CODE, null, null, null, null, null, null
+            },
+            {
+                    null, null, null, null, null, null, null, DATA_SET_CODE, null
+            },
+            {
+                    null, null, null, null, null, null, null, null, EXTENSION
+            },
+            {
+                    null, PROJECT_CODE, EXPERIMENT_CODE, null, null, SAMPLE_CODE, null, DATA_SET_CODE, null
+            },
+            {
+                    null, PROJECT_CODE, EXPERIMENT_CODE, EXPERIMENT_NAME, null, SAMPLE_CODE, SAMPLE_NAME, DATA_SET_CODE, EXTENSION
+            },
+            {
+                    SPACE_CODE, null, EXPERIMENT_CODE, EXPERIMENT_NAME, null, null, null, null, EXTENSION
+            },
+            {
+                    SPACE_CODE, null, null, null, null, null, null, DATA_SET_CODE, EXTENSION
+            },
+            {
+                    SPACE_CODE, null, null, null, null, null, null, DATA_SET_CODE, null
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, null, null, DATA_SET_CODE, EXTENSION
+            },
+            {
+                    SPACE_CODE, PROJECT_CODE, null, null, null, null, null, DATA_SET_CODE, null
+            },
+    };
+
+    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", null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", null, "file",
+                    "O+DEFAULT_LAB_NOTEBOOK+OBJ1+ANALYZED_DATA+20231201115004780-27/file"
+            },
+            {
+                    'O', null, null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file",
+                    "O+OBJ1+ANALYZED_DATA+my dataset (20231201115004780-27)/file"
+            },
+            {
+                    'O', null, null, null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", null, "file",
+                    "O+OBJ1+ANALYZED_DATA+20231201115004780-27/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"
+            },
+            {
+                    '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"
+            },
+    };
+
+    private static final Object[][] ERRONEOUS_FOLDER_NAME_DATA = {
+            {
+                    'P', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+            },
+            {
+                    'O', null, "DEFAULT_PROJECT", null, "OBJ1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+            },
+            {
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, null, "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+            },
+            {
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", "OBJ_CONTAINER", null, "ANALYZED_DATA", "20231201115004780-27", "my dataset",
+                    "file"
+            },
+            {
+                    'O', "DEFAULT_LAB_NOTEBOOK", "DEFAULT_PROJECT", null, "OBJ1", null, "20231201115004780-27", "my dataset", "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"
+            },
+            {
+                    // Experiments cannot be on the space level
+                    'E', "DEFAULT_LAB_NOTEBOOK", null, null, "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+            },
+            {
+                    // Experiments cannot be shared (w/o space)
+                    'E', null, null, null, "EXP1", "ANALYZED_DATA", "20231201115004780-27", "my dataset", "file"
+            },
+    };
+
+    @DataProvider
+    private Object[][] nextZipEntryData()
+    {
+        return NEXT_ZIP_ENTRY_DATA;
+    }
+
+    @DataProvider
+    private Object[][] erroneousNextZipEntryData()
+    {
+        return ERRONEOUS_NEXT_ZIP_ENTRY_DATA;
+    }
+
+    @DataProvider
+    private Object[][] folderNameData()
+    {
+        return FOLDER_NAME_DATA;
+    }
+
+    @DataProvider
+    private Object[][] erroneousFolderNameData()
+    {
+        return ERRONEOUS_FOLDER_NAME_DATA;
+    }
+
+    @Test(dataProvider = NEXT_ZIP_ENTRY_DATA_PROVIDER)
+    public void testGetNextDirectoryName(final String spaceCode, final String projectCode, final String experimentCode, final String experimentName,
+             final String containerCode, final String sampleCode, final String sampleName, final String dataSetCode, final String extension,
+            final String expectedResult)
+    {
+        assertEquals(ExportExecutor.getNextDocDirectoryName(spaceCode, projectCode, experimentCode, experimentName, containerCode, sampleCode,
+                sampleName, dataSetCode, extension), expectedResult);
+    }
+
+    @Test(dataProvider = ERRONEOUS_NEXT_ZIP_ENTRY_DATA_PROVIDER, expectedExceptions = IllegalArgumentException.class)
+    public void testGetNextDirectoryNameError(final String spaceCode, final String projectCode, final String experimentCode,
+            final String experimentName, final String containerCode, final String sampleCode, final String sampleName, final String dataSetCode,
+            final String extension)
+    {
+        ExportExecutor.getNextDocDirectoryName(spaceCode, projectCode, experimentCode, experimentName, containerCode, sampleCode, sampleName, dataSetCode,
+                extension);
+    }
+
+    @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)
+    {
+        assertEquals(ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode, dataSetCode,
+                dataSetName, 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)
+    {
+        ExportExecutor.getDataDirectoryName(prefix, spaceCode, projectCode, containerCode, entityCode, dataSetTypeCode, dataSetCode, dataSetName, fileName);
+    }
+
+    @Test()
+    public void testEscapeUnsafeCharacters()
+    {
+        final String input = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 $!#%'()+,-.;=@[]^_{}~\\/:*?\"<>|`";
+        final String expectedOutput = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789 $!#%'()+,-.;=@[]^_{}~__________";
+        assertEquals(ExportExecutor.escapeUnsafeCharacters(input), expectedOutput);
+    }
+
+}
\ No newline at end of file
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/XLSExportTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/XLSExportTest.java
index faa44046ce577a2c91369c8a9edbcd3c85d53ce7..89a97b30698e87f30e6dcb0b4b4021bf6d0a8025 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/XLSExportTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/generic/server/xls/export/XLSExportTest.java
@@ -280,7 +280,7 @@ public class XLSExportTest
         }
     }
 
-    private static void assertWorkbooksEqual(final Workbook actual, final Workbook expected)
+    public static void assertWorkbooksEqual(final Workbook actual, final Workbook expected)
     {
         final int sheetsCount = expected.getNumberOfSheets();
         assertEquals(actual.getNumberOfSheets(), sheetsCount);
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractImportTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractImportTest.java
index a74fd17fe3085d9718e6ec5835dad2d5e307fb32..f67f997478f3a2de43f15ce8f0dec63faafb78c1 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractImportTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/AbstractImportTest.java
@@ -61,7 +61,7 @@ public class AbstractImportTest extends AbstractTest
 
     protected static byte[] getFileContent(final String fileName)
     {
-        try (final InputStream is = AbstractImportTest.class.getResourceAsStream("test_files/xls/" + fileName))
+        try (final InputStream is = AbstractImportTest.class.getResourceAsStream("test_files/import/" + fileName))
         {
             if (is == null)
             {
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
new file mode 100644
index 0000000000000000000000000000000000000000..62c27ddc0d5db3082cbcebef54655b505b87640f
--- /dev/null
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportData.java
@@ -0,0 +1,572 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package ch.ethz.sis.openbis.systemtest.asapi.v3;
+
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.AUTO_GENERATE_CODES;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.CHILDREN;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.CODE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.DESCRIPTION;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.DISALLOW_DELETION;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.EXPERIMENT;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.GENERATED_CODE_PREFIX;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.IDENTIFIER;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.MODIFICATION_DATE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.MODIFIER;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.PARENTS;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.PERM_ID;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.PRESENT_IN_ARCHIVE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.PROJECT;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.REGISTRATION_DATE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.REGISTRATOR;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.SAMPLE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.SPACE;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.STORAGE_CONFIRMATION;
+import static ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.Attribute.UNIQUE_SUBCODES;
+
+import java.util.EnumSet;
+import java.util.List;
+
+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.ExperimentPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.AllFields;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.ExportableKind;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.ExportablePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.SelectedFields;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.ExportFormat;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.XlsTextFormat;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.id.ProjectPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
+
+class ExportData
+{
+    static final String RICH_TEXT_PROPERTY_NAME = "MULTILINE";
+
+    static final String RICH_TEXT_WITH_IMAGE_PROPERTY_NAME = "MULTILINE_WITH_IMAGE";
+
+    static final String RICH_TEXT_WITH_SPREADSHEET_PROPERTY_NAME = "MULTILINE_WITH_SPREADSHEET";
+
+    static final Object[][] EXPORT_DATA = {
+            // XLS: All fields
+            {
+                    // Non-existing sample
+                    "empty-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("WrongPermId"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Space: TEST-SPACE
+                    "export-space-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SPACE, new SpacePermId("TEST-SPACE"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Project: TEST-PROJECT
+                    "export-project-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.PROJECT, new ProjectPermId("20120814110011738-105"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment: EXP-SPACE-TEST
+                    "export-experiment-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new ExperimentPermId("201206190940555-1032"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/EV-TEST
+                    "export-sample-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("201206191219327-1055"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-compatible-with-import-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("201206191219327-1054"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    true // withImportCompatibility
+            },
+            {
+                    // Sample: /MP
+                    "export-sample-shared-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050947161-652"))),
+                    new AllFields(),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+//            {
+//                    // 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,
+//                    true, // withReferredTypes
+//                    false // withImportCompatibility
+//            },
+            {
+                    // Data set: "ROOT_CONTAINER"
+                    "export-data-set-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.DATASET, new DataSetPermId("ROOT_CONTAINER"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample Type: CELL_PLATE
+                    "export-sample-type-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE_TYPE, new EntityTypePermId("CELL_PLATE", EntityKind.SAMPLE))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample Type: CELL_PLATE
+                    "export-sample-type-with-referred-types-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE_TYPE, new EntityTypePermId("CELL_PLATE", EntityKind.SAMPLE))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment Type: SIRNA_HCS
+                    "export-experiment-type-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT_TYPE, new EntityTypePermId("SIRNA_HCS", EntityKind.EXPERIMENT))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Dataset Type: HCS_IMAGE
+                    "export-data-set-type-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.DATASET_TYPE, new EntityTypePermId("HCS_IMAGE", EntityKind.DATA_SET))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // XLS: Selected fields
+            {
+                    // Space: TEST-SPACE
+                    "export-space-filtered-attributes-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SPACE, new SpacePermId("TEST-SPACE"))),
+                    new SelectedFields(List.of(CODE, REGISTRATOR, DESCRIPTION), List.of()),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Project: TEST-PROJECT
+                    "export-project-filtered-fields-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.PROJECT, new ProjectPermId("20120814110011738-105"))),
+                    new SelectedFields(
+                            List.of(REGISTRATOR, REGISTRATION_DATE, CODE, IDENTIFIER, SPACE, DESCRIPTION),
+                            List.of()),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment: EXP-SPACE-TEST
+                    "export-experiment-filtered-fields-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new ExperimentPermId("201206190940555-1032"))),
+                    new SelectedFields(
+                            List.of(CODE, PERM_ID, IDENTIFIER, PROJECT, REGISTRATOR, MODIFIER),
+                            List.of(new PropertyTypePermId("GENDER"), new PropertyTypePermId("DESCRIPTION"))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-filtered-fields-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("201206191219327-1054"))),
+                    new SelectedFields(
+                            List.of(CODE, PERM_ID, IDENTIFIER, SPACE, PARENTS, CHILDREN, REGISTRATOR, REGISTRATION_DATE),
+                            List.of(new PropertyTypePermId("BACTERIUM"), new PropertyTypePermId("COMMENT"), new PropertyTypePermId("ORGANISM"))),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Data set: "20081105092159188-3", type: "HCS_IMAGE"
+                    "export-data-set-filtered-fields-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.DATASET, new DataSetPermId("20081105092159188-3"))),
+                    new SelectedFields(
+                            List.of(REGISTRATOR, REGISTRATION_DATE, CODE, IDENTIFIER, PARENTS, CHILDREN, STORAGE_CONFIRMATION, PRESENT_IN_ARCHIVE,
+                                    SAMPLE, EXPERIMENT),
+                            List.of(new PropertyTypePermId("COMMENT"), new PropertyTypePermId("GENDER"))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample Type: CELL_PLATE
+                    "export-sample-type-filtered-attributes-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE_TYPE, new EntityTypePermId("CELL_PLATE", EntityKind.SAMPLE))),
+                    new SelectedFields(List.of(CODE, AUTO_GENERATE_CODES, DESCRIPTION, GENERATED_CODE_PREFIX, UNIQUE_SUBCODES), List.of()),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment Type: SIRNA_HCS
+                    "export-experiment-type-filtered-attributes-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT_TYPE, new EntityTypePermId("SIRNA_HCS", EntityKind.EXPERIMENT))),
+                    new SelectedFields(List.of(DESCRIPTION, CODE, MODIFICATION_DATE), List.of()),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Dataset Type: HCS_IMAGE
+                    "export-data-set-type-filtered-attributes-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.DATASET_TYPE, new EntityTypePermId("HCS_IMAGE", EntityKind.DATA_SET))),
+                    new SelectedFields(List.of(CODE, DISALLOW_DELETION, DESCRIPTION), List.of()),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-plain-text-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_PROPERTY_NAME))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-rich-text-xlsx.zip",
+                    EnumSet.of(ExportFormat.XLSX),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_PROPERTY_NAME))),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // HTML: All fields
+            {
+                    // Space: TEST-SPACE
+                    "export-space-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SPACE, new SpacePermId("TEST-SPACE"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Project: TEST-PROJECT
+                    "export-project-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.PROJECT, new ProjectPermId("20120814110011738-105"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment: EXP-SPACE-TEST
+                    "export-experiment-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new ExperimentPermId("201206190940555-1032"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/EV-TEST
+                    "export-sample-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("201206191219327-1055"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /MP
+                    "export-sample-shared-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050947161-652"))),
+                    new AllFields(),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+//            {
+//                    // 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,
+//                    true, // withReferredTypes
+//                    false // withImportCompatibility
+//            },
+            {
+                    // Data set: "ROOT_CONTAINER"
+                    "export-data-set-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.DATASET, new DataSetPermId("ROOT_CONTAINER"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // HTML: Selected fields
+            {
+                    // Space: TEST-SPACE
+                    "export-space-filtered-fields-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SPACE, new SpacePermId("TEST-SPACE"))),
+                    new SelectedFields(List.of(CODE, PERM_ID, MODIFICATION_DATE), List.of()),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Project: TEST-PROJECT
+                    "export-project-filtered-fields-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.PROJECT, new ProjectPermId("20120814110011738-105"))),
+                    new SelectedFields(List.of(PERM_ID, IDENTIFIER, REGISTRATOR, REGISTRATION_DATE), List.of()),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment: EXP-SPACE-TEST
+                    "export-experiment-filtered-fields-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new ExperimentPermId("201206190940555-1032"))),
+                    new SelectedFields(List.of(CODE, PARENTS, CHILDREN, REGISTRATOR, REGISTRATION_DATE),
+                            List.of(new PropertyTypePermId("DESCRIPTION"))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /CISD/NEMO/3VCP6
+                    "export-sample-filtered-fields-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050946559-980"))),
+                    new SelectedFields(
+                            List.of(CODE, PARENTS, CHILDREN),
+                            List.of(new PropertyTypePermId("BACTERIUM"), new PropertyTypePermId("COMMENT"), new PropertyTypePermId("ORGANISM"))),
+                    XlsTextFormat.PLAIN,
+                    false, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-plain-text-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_PROPERTY_NAME))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-rich-text-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_PROPERTY_NAME))),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-with-image-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_WITH_IMAGE_PROPERTY_NAME))),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-with-spreadsheet-html.zip",
+                    EnumSet.of(ExportFormat.HTML),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, null)), // null perm ID indicates that the newly created value in the setup of the test should be used.
+                    new SelectedFields(List.of(IDENTIFIER, CODE), List.of(new PropertyTypePermId(RICH_TEXT_WITH_SPREADSHEET_PROPERTY_NAME))),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // PDF: All fields
+            {
+                    // Space: TEST-SPACE
+                    "export-space-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.SPACE, new SpacePermId("TEST-SPACE"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Project: TEST-PROJECT
+                    "export-project-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.PROJECT, new ProjectPermId("20120814110011738-105"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Experiment: EXP-SPACE-TEST
+                    "export-experiment-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new ExperimentPermId("201206190940555-1032"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /CISD/NEMO/3VCP6
+                    "export-sample-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050946559-980"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /MP
+                    "export-sample-shared-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200811050947161-652"))),
+                    new AllFields(),
+                    XlsTextFormat.RICH,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Data set: "ROOT_CONTAINER"
+                    "export-data-set-pdf.zip",
+                    EnumSet.of(ExportFormat.PDF),
+                    List.of(new ExportablePermId(ExportableKind.DATASET, new DataSetPermId("ROOT_CONTAINER"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // Data
+            {
+                    // Sample: /CISD/NEMO/CP-TEST-3
+                    "export-sample-data.zip",
+                    EnumSet.of(ExportFormat.DATA),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200902091225616-1027"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+            {
+                    // Sample: /CISD/NEMO/EXP1
+                    "export-experiment-data.zip",
+                    EnumSet.of(ExportFormat.DATA),
+                    List.of(new ExportablePermId(ExportableKind.EXPERIMENT, new SamplePermId("200811050951882-1028"))),
+                    new AllFields(),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+
+            // All
+            {
+                    // Sample: /TEST-SPACE/TEST-PROJECT/FV-TEST
+                    "export-sample-all.zip",
+                    EnumSet.of(ExportFormat.XLSX, ExportFormat.HTML, ExportFormat.PDF, ExportFormat.DATA),
+                    List.of(new ExportablePermId(ExportableKind.SAMPLE, new SamplePermId("200902091250077-1026"))),
+                    new SelectedFields(
+                            List.of(CODE, PARENTS, CHILDREN, REGISTRATOR, REGISTRATION_DATE),
+                            List.of(new PropertyTypePermId("BACTERIUM"), new PropertyTypePermId("SIZE"), new PropertyTypePermId("ORGANISM"))),
+                    XlsTextFormat.PLAIN,
+                    true, // withReferredTypes
+                    false // withImportCompatibility
+            },
+    };
+
+    private ExportData()
+    {
+        throw new UnsupportedOperationException();
+    }
+
+}
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
new file mode 100644
index 0000000000000000000000000000000000000000..3bf1cb5c955da338c1ee57e5e2f6aa08525067f2
--- /dev/null
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExportTest.java
@@ -0,0 +1,537 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package ch.ethz.sis.openbis.systemtest.asapi.v3;
+
+import static ch.ethz.sis.openbis.generic.server.FileServiceServlet.REPO_PATH_KEY;
+import static ch.ethz.sis.openbis.generic.server.asapi.v3.executor.exporter.ExportExecutor.JSON_EXTENSION;
+import static ch.ethz.sis.openbis.generic.server.asapi.v3.executor.exporter.ExportExecutor.METADATA_FILE_NAME;
+import static ch.ethz.sis.openbis.generic.server.asapi.v3.executor.exporter.ExportExecutor.PDF_EXTENSION;
+import static ch.ethz.sis.openbis.generic.server.xls.export.XLSExport.XLSX_EXTENSION;
+import static ch.ethz.sis.openbis.generic.server.xls.export.XLSExport.ZIP_EXTENSION;
+import static ch.ethz.sis.openbis.systemtest.asapi.v3.ExportData.RICH_TEXT_PROPERTY_NAME;
+import static ch.ethz.sis.openbis.systemtest.asapi.v3.ExportData.RICH_TEXT_WITH_IMAGE_PROPERTY_NAME;
+import static ch.ethz.sis.openbis.systemtest.asapi.v3.ExportData.RICH_TEXT_WITH_SPREADSHEET_PROPERTY_NAME;
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.BufferedInputStream;
+import java.io.BufferedReader;
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.DataOutputStream;
+import java.io.File;
+import java.io.FileInputStream;
+import java.io.FilenameFilter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.ObjectOutputStream;
+import java.net.URISyntaxException;
+import java.net.URL;
+import java.nio.charset.StandardCharsets;
+import java.util.List;
+import java.util.Map;
+import java.util.Objects;
+import java.util.Set;
+import java.util.function.Function;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+
+import javax.annotation.Resource;
+
+import org.apache.commons.io.filefilter.NameFileFilter;
+import org.apache.poi.ss.usermodel.Workbook;
+import org.apache.poi.xssf.usermodel.XSSFWorkbook;
+import org.jmock.Expectations;
+import org.jmock.Mockery;
+import org.testng.annotations.AfterClass;
+import org.testng.annotations.AfterMethod;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.DataProvider;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.id.DataSetPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.deletion.id.IDeletionId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.ExportResult;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.ExportData;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.ExportablePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.data.IExportableFields;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.ExportFormat;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.ExportOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.exporter.options.XlsTextFormat;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.create.PropertyAssignmentCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.create.PropertyTypeCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.delete.PropertyTypeDeletionOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.create.SampleTypeCreation;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleDeletionOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.delete.SampleTypeDeletionOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id.SpacePermId;
+import ch.ethz.sis.openbis.generic.dssapi.v3.IDataStoreServerApi;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.DataSetFile;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.download.DataSetFileDownloadOptions;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.fetchoptions.DataSetFileFetchOptions;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.id.DataSetFilePermId;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.id.IDataSetFileId;
+import ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.search.DataSetFileSearchCriteria;
+import ch.ethz.sis.openbis.generic.server.xls.export.XLSExportTest;
+import ch.systemsx.cisd.common.spring.ExposablePropertyPlaceholderConfigurer;
+import ch.systemsx.cisd.openbis.generic.server.CommonServiceProvider;
+
+public class ExportTest extends AbstractTest
+{
+
+    private static final String EXPORT_DATA_PROVIDER = "exportData";
+
+    private static final String PLAIN_TEXT_VALUE = "Rich format test";
+
+    private static final String RICH_TEXT_VALUE = String.format("<b>%s</b>", PLAIN_TEXT_VALUE);
+
+    private static final String XLS_EXPORT_RESOURCES_PATH = "ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/";
+
+    private static final String RICH_TEXT_WITH_IMAGE_VALUE = String.format("<b>Here goes the image: <figure class=\"image\">\n"
+            + "<img src=\"%snature.png\"/></figure></b>", XLS_EXPORT_RESOURCES_PATH);
+
+    private static final String RICH_TEXT_SAMPLE_CODE = "RICH_TEXT";
+
+    private static final String JAVA_FOLDER_PATH = "./sourceTest/java/";
+
+    protected String sessionToken;
+
+    private PropertyTypePermId richTextPropertyTypePermId;
+
+    private PropertyTypePermId richTextWithImagePropertyTypePermId;
+
+    private PropertyTypePermId richTextWithSpreadsheetPropertyTypePermId;
+
+    private EntityTypePermId sampleTypePermId;
+
+    private SamplePermId samplePermId;
+
+    @Resource(name = ExposablePropertyPlaceholderConfigurer.PROPERTY_CONFIGURER_BEAN_NAME)
+    private ExposablePropertyPlaceholderConfigurer configurer;
+
+    private Mockery mockery;
+
+    private IDataStoreServerApi v3Dss;
+
+    @DataProvider
+    protected Object[][] exportData()
+    {
+        return ch.ethz.sis.openbis.systemtest.asapi.v3.ExportData.EXPORT_DATA;
+    }
+
+    @BeforeClass
+    public void beforeClass()
+    {
+        mockery = new Mockery();
+
+        configurer.getResolvedProps().setProperty(REPO_PATH_KEY, JAVA_FOLDER_PATH);
+
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final PropertyTypeCreation richTextPropertyTypeCreation = new PropertyTypeCreation();
+        richTextPropertyTypeCreation.setCode(RICH_TEXT_PROPERTY_NAME);
+        richTextPropertyTypeCreation.setLabel("Multiline");
+        richTextPropertyTypeCreation.setDescription("Property type with multiline text value");
+        richTextPropertyTypeCreation.setDataType(DataType.MULTILINE_VARCHAR);
+
+        final PropertyTypeCreation richTextWithImagePropertyTypeCreation = new PropertyTypeCreation();
+        richTextWithImagePropertyTypeCreation.setCode(RICH_TEXT_WITH_IMAGE_PROPERTY_NAME);
+        richTextWithImagePropertyTypeCreation.setLabel("Image");
+        richTextWithImagePropertyTypeCreation.setDescription("Property type with image");
+        richTextWithImagePropertyTypeCreation.setMetaData(Map.of("custom_widget", "Word Processor"));
+        richTextWithImagePropertyTypeCreation.setDataType(DataType.MULTILINE_VARCHAR);
+
+        final PropertyTypeCreation richTextWithSpreadsheetPropertyTypeCreation = new PropertyTypeCreation();
+        richTextWithSpreadsheetPropertyTypeCreation.setCode(RICH_TEXT_WITH_SPREADSHEET_PROPERTY_NAME);
+        richTextWithSpreadsheetPropertyTypeCreation.setLabel("Spreadsheet");
+        richTextWithSpreadsheetPropertyTypeCreation.setDescription("Property type with spreadsheet");
+        richTextWithSpreadsheetPropertyTypeCreation.setMetaData(Map.of("custom_widget", "Spreadsheet"));
+        richTextWithSpreadsheetPropertyTypeCreation.setDataType(DataType.XML);
+
+        final List<PropertyTypePermId> propertyTypes =
+                v3api.createPropertyTypes(sessionToken, List.of(richTextPropertyTypeCreation, richTextWithImagePropertyTypeCreation,
+                        richTextWithSpreadsheetPropertyTypeCreation));
+        richTextPropertyTypePermId = propertyTypes.get(0);
+        richTextWithImagePropertyTypePermId = propertyTypes.get(1);
+        richTextWithSpreadsheetPropertyTypePermId = propertyTypes.get(2);
+
+        final SampleTypeCreation sampleTypeCreation = new SampleTypeCreation();
+        sampleTypeCreation.setCode("MULTI_LINE_VALUE_SAMPLE_TYPE");
+
+        final PropertyAssignmentCreation richTextPropertyAssignmentCreation = new PropertyAssignmentCreation();
+        richTextPropertyAssignmentCreation.setPropertyTypeId(richTextPropertyTypePermId);
+
+        final PropertyAssignmentCreation richTextWithImagePropertyAssignmentCreation = new PropertyAssignmentCreation();
+        richTextWithImagePropertyAssignmentCreation.setPropertyTypeId(richTextWithImagePropertyTypePermId);
+
+        final PropertyAssignmentCreation richTextWithSpreadsheetPropertyAssignmentCreation = new PropertyAssignmentCreation();
+        richTextWithSpreadsheetPropertyAssignmentCreation.setPropertyTypeId(richTextWithSpreadsheetPropertyTypePermId);
+
+        sampleTypeCreation.setPropertyAssignments(List.of(richTextPropertyAssignmentCreation, richTextWithImagePropertyAssignmentCreation,
+                richTextWithSpreadsheetPropertyAssignmentCreation));
+        sampleTypePermId = v3api.createSampleTypes(sessionToken, List.of(sampleTypeCreation)).get(0);
+
+        final SampleCreation richTextSampleCreation = new SampleCreation();
+        richTextSampleCreation.setSpaceId(new SpacePermId("TEST-SPACE"));
+        richTextSampleCreation.setCode(RICH_TEXT_SAMPLE_CODE);
+        richTextSampleCreation.setTypeId(sampleTypePermId);
+        richTextSampleCreation.setProperty(RICH_TEXT_PROPERTY_NAME, RICH_TEXT_VALUE);
+        richTextSampleCreation.setProperty(RICH_TEXT_WITH_IMAGE_PROPERTY_NAME, RICH_TEXT_WITH_IMAGE_VALUE);
+        richTextSampleCreation.setProperty(RICH_TEXT_WITH_SPREADSHEET_PROPERTY_NAME, SpreadsheetData.BASE64_SPREADSHEET_DATA);
+
+        samplePermId = v3api.createSamples(sessionToken, List.of(richTextSampleCreation)).get(0);
+
+        registerDss();
+
+        v3api.logout(sessionToken);
+    }
+
+    private void registerDss()
+    {
+        v3Dss = mockery.mock(IDataStoreServerApi.class);
+        CommonServiceProvider.setDataStoreServerApi(v3Dss);
+    }
+
+
+    @AfterClass
+    public void afterClass()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final SampleDeletionOptions sampleDeletionOptions = new SampleDeletionOptions();
+        sampleDeletionOptions.setReason("Test");
+        final IDeletionId deletionId = v3api.deleteSamples(sessionToken, List.of(samplePermId), sampleDeletionOptions);
+        v3api.confirmDeletions(systemSessionToken, List.of(deletionId));
+
+        final SampleTypeDeletionOptions sampleTypeDeletionOptions = new SampleTypeDeletionOptions();
+        sampleTypeDeletionOptions.setReason("Test");
+        v3api.deleteSampleTypes(sessionToken, List.of(sampleTypePermId), sampleTypeDeletionOptions);
+
+        final PropertyTypeDeletionOptions propertyTypeDeletionOptions = new PropertyTypeDeletionOptions();
+        propertyTypeDeletionOptions.setReason("Test");
+        v3api.deletePropertyTypes(sessionToken,
+                List.of(richTextPropertyTypePermId, richTextWithImagePropertyTypePermId, richTextWithSpreadsheetPropertyTypePermId),
+                propertyTypeDeletionOptions);
+
+        v3api.logout(sessionToken);
+    }
+
+    @BeforeMethod
+    public void beforeMethod()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @AfterMethod
+    public void afterMethod()
+    {
+        v3api.logout(sessionToken);
+    }
+
+    @SuppressWarnings({ "unchecked", "resource" })
+    @Test(dataProvider = EXPORT_DATA_PROVIDER)
+    public void testDataExport(final String expectedResultFileName, final Set<ExportFormat> formats, final List<ExportablePermId> permIds,
+            final IExportableFields fields, final XlsTextFormat xlsTextFormat, final boolean withReferredTypes,
+            final boolean withImportCompatibility) throws Exception
+    {
+        processPermIds(permIds);
+
+        if (formats.contains(ExportFormat.DATA))
+        {
+            final String fileContent1 = "This is some test data.";
+            final DataSetFile dataSetFile1 = createDataSetFile("default/data1.txt", fileContent1.length());
+            final SearchResult<DataSetFile> results1 = new SearchResult<>(List.of(dataSetFile1), 1);
+            final InputStream is1 = objectAndDataToStream(dataSetFile1, fileContent1);
+
+            final String fileContent2 = "This is some other test data.";
+            final DataSetFile dataSetFile2 = createDataSetFile("my-folder/data2.txt", fileContent2.length());
+            final SearchResult<DataSetFile> results2 = new SearchResult<>(List.of(dataSetFile2), 1);
+            final InputStream is2 = objectAndDataToStream(dataSetFile2, fileContent2);
+
+            mockery.checking(new Expectations()
+            {{
+                atLeast(1).of(v3Dss).searchFiles(with(equal(sessionToken)), with(any(DataSetFileSearchCriteria.class)),
+                        with(any(DataSetFileFetchOptions.class)));
+                will(onConsecutiveCalls(returnValue(results1), returnValue(results2)));
+
+                exactly(1).of(v3Dss).downloadFiles(with(equal(sessionToken)), with(equal(List.<IDataSetFileId>of(dataSetFile1.getPermId()))),
+                        with(any(DataSetFileDownloadOptions.class)));
+                will(returnValue(is1));
+
+                atMost(1).of(v3Dss).downloadFiles(with(equal(sessionToken)), with(equal(List.<IDataSetFileId>of(dataSetFile2.getPermId()))),
+                        with(any(DataSetFileDownloadOptions.class)));
+                will(returnValue(is2));
+            }});
+        }
+
+        final ExportData exportData = new ExportData(permIds, fields);
+        final ExportOptions exportOptions = new ExportOptions(formats, xlsTextFormat, withReferredTypes, withImportCompatibility);
+        final ExportResult exportResult = v3api.executeExport(sessionToken, exportData, exportOptions);
+
+        compareFiles(XLS_EXPORT_RESOURCES_PATH + expectedResultFileName, exportResult.getDownloadURL());
+        mockery.assertIsSatisfied();
+    }
+
+    private static DataSetFile createDataSetFile(final String filePath, final int fileLength)
+    {
+        final DataSetFilePermId dataSetFilePermId = new DataSetFilePermId(new DataSetPermId("20230904175944612-1"), filePath);
+        final DataSetFile dataSetFile = new DataSetFile();
+        dataSetFile.setPermId(dataSetFilePermId);
+        dataSetFile.setFileLength(fileLength);
+        dataSetFile.setPath(filePath);
+        return dataSetFile;
+    }
+
+    public static InputStream objectAndDataToStream(final Object obj, final String data) throws IOException {
+        final byte[] objectBytes = getObjectBytes(obj);
+
+        final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+        final DataOutputStream dos = new DataOutputStream(baos);
+
+        // Write the size of the object
+        dos.writeLong(objectBytes.length);
+
+        // Write the object again
+        dos.write(objectBytes);
+
+        // Convert the string to bytes and write its size followed by the data
+        final byte[] stringBytes = data.getBytes();
+        final long stringSize = stringBytes.length;
+        dos.writeLong(stringSize);
+        dos.write(stringBytes);
+
+        dos.close();
+
+        // Return a ByteArrayInputStream containing the sequence
+        return new ByteArrayInputStream(baos.toByteArray());
+    }
+
+    private static byte[] getObjectBytes(final Object obj) throws IOException
+    {
+        try (
+            final ByteArrayOutputStream baos = new ByteArrayOutputStream();
+            final ObjectOutputStream oos = new ObjectOutputStream(baos)
+        )
+        {
+            oos.writeObject(obj);
+            return baos.toByteArray();
+        }
+    }
+
+    /**
+     * Searches for ExportablePermIds with null perm IDs, which should indicate that it should be replaced with {@link #samplePermId}.
+     *
+     * @param permIds the list of ExportablePermId values to be processed.
+     */
+    private void processPermIds(final List<ExportablePermId> permIds)
+    {
+        permIds.forEach(exportablePermId ->
+        {
+            if (exportablePermId.getPermId() == null)
+            {
+                exportablePermId.setPermId(samplePermId);
+            }
+        });
+    }
+
+    private void compareFiles(final String expectedResultFilePath, final String actualResultFilePath) throws IOException
+    {
+        final URL expectedResultUrl = getClass().getClassLoader().getResource(expectedResultFilePath);
+        assertNotNull(expectedResultUrl, String.format("Expected result file path produces null URL: %s.", expectedResultFilePath));
+
+        final File expectedResultFile;
+        try
+        {
+            expectedResultFile = new File(expectedResultUrl.toURI());
+        } catch (final URISyntaxException e)
+        {
+            throw new RuntimeException(e);
+        }
+        assertTrue(expectedResultFile.exists(), String.format("Expected result file does not exist: %s.", expectedResultUrl.getPath()));
+
+        if (expectedResultFile.isDirectory())
+        {
+            final File actualResultFile = getActualFile(actualResultFilePath);
+            assertTrue(actualResultFile.exists(), String.format("Actual result file does not exist: %s.", actualResultFilePath));
+
+            assertTrue(actualResultFile.isDirectory());
+            compareDirectories(expectedResultFile, actualResultFile);
+        } else if (expectedResultFilePath.endsWith(XLSX_EXTENSION) && actualResultFilePath.endsWith(XLSX_EXTENSION))
+        {
+            compareXlsxFiles(expectedResultFilePath, actualResultFilePath);
+        } else if (expectedResultFilePath.endsWith(ZIP_EXTENSION) && actualResultFilePath.endsWith(ZIP_EXTENSION))
+        {
+            compareZipFiles(expectedResultFilePath, actualResultFilePath);
+        } else
+        {
+            throw new IllegalArgumentException(String.format("Expected ('%s') and actual ('%s') files have different formats.",
+                    expectedResultFilePath, actualResultFilePath));
+        }
+    }
+
+    private void compareXlsxFiles(final String expectedResultFilePath, final String actualResultFilePath) throws IOException
+    {
+        final InputStream expectedResultStream = getClass().getClassLoader().getResourceAsStream(expectedResultFilePath);
+        if (expectedResultStream == null)
+        {
+            throw new IllegalArgumentException(String.format("Expected result file '%s' not found.", expectedResultFilePath));
+        }
+        compareXlsxStreams(expectedResultStream, new FileInputStream(getActualFile(actualResultFilePath)));
+    }
+
+    private void compareZipFiles(final String expectedResultFilePath, final String actualResultFilePath) throws IOException
+    {
+        final URL expectedResultUrl = getClass().getClassLoader().getResource(expectedResultFilePath);
+        assertNotNull(expectedResultUrl);
+
+        final File actualFile = getActualFile(actualResultFilePath);
+
+        try (
+                final ZipFile extectedZipFile = new ZipFile(expectedResultUrl.getPath());
+                final ZipFile actualZipFile = new ZipFile(actualFile);
+        )
+        {
+            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);
+
+            for (final String expectedZipEntry : expectedZipEntries)
+            {
+                if (expectedZipEntry.endsWith(XLSX_EXTENSION))
+                {
+                    try (
+                            final InputStream expectedInputStream = extectedZipFile.getInputStream(extectedZipFile.getEntry(expectedZipEntry));
+                            final InputStream actualInputStream = actualZipFile.getInputStream(actualZipFile.getEntry(expectedZipEntry));
+                    )
+                    {
+                        compareXlsxStreams(expectedInputStream, actualInputStream);
+                    }
+                } else if (!expectedZipEntry.endsWith(PDF_EXTENSION) && !expectedZipEntry.endsWith(JSON_EXTENSION))
+                {
+                    // 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));
+                    )
+                    {
+                        compareStreams(expectedInputStream, actualInputStream);
+                    }
+                }
+            }
+        }
+    }
+
+    private void compareDirectories(final File expectedDirectory, final File actualDirectory) throws IOException
+    {
+        final File[] expectedFiles = expectedDirectory.listFiles();
+        final File[] actualFiles = actualDirectory.listFiles();
+        final Set<String> expectedFileNames = Stream.of(Objects.requireNonNull(expectedFiles)).map(File::getName)
+                .collect(Collectors.toSet());
+        final Set<String> actualFileNames = Stream.of(Objects.requireNonNull(actualFiles)).map(File::getName)
+                .collect(Collectors.toSet());
+
+        assertEquals(actualFileNames, expectedFileNames);
+
+        final Map<String, File> actualFileByName = Stream.of(Objects.requireNonNull(actualFiles))
+                .collect(Collectors.toMap(File::getName, Function.identity()));
+
+        for (final File expectedFile : expectedFiles)
+        {
+            final String expectedFileName = expectedFile.getName();
+            final File actualFile = actualFileByName.get(expectedFileName);
+            final boolean expectedFileIsDirectory = expectedFile.isDirectory();
+            final boolean actualFileIsDirectory = actualFile.isDirectory();
+
+            assertEquals(actualFileIsDirectory, expectedFileIsDirectory, "One of the compared files is a directory whereas the other is not.");
+            if (expectedFileIsDirectory)
+            {
+                compareDirectories(expectedFile, actualFile);
+            } else
+            {
+                try (
+                        final InputStream expectedInputStream = new BufferedInputStream(new FileInputStream(expectedFile));
+                        final InputStream actualInputStream = new BufferedInputStream(new FileInputStream(actualFile));
+                )
+                {
+                    if (expectedFileName.equals(METADATA_FILE_NAME))
+                    {
+                        compareXlsxStreams(expectedInputStream, actualInputStream);
+                    } else
+                    {
+                        compareStreams(expectedInputStream, actualInputStream);
+                    }
+                }
+            }
+        }
+    }
+
+    private static void compareXlsxStreams(final InputStream expectedResultInputStream, final InputStream actualResultInputStream) throws IOException
+    {
+        final Workbook expectedResult = new XSSFWorkbook(expectedResultInputStream);
+        final Workbook actualResult = new XSSFWorkbook(actualResultInputStream);
+
+        XLSExportTest.assertWorkbooksEqual(actualResult, expectedResult);
+    }
+
+    private static void compareStreams(final InputStream expectedResultInputStream, final InputStream actualResultInputStream) throws IOException
+    {
+        try (
+                final BufferedReader expectedReader = new BufferedReader(new InputStreamReader(expectedResultInputStream, StandardCharsets.UTF_8));
+                final BufferedReader actualReader = new BufferedReader(new InputStreamReader(actualResultInputStream, StandardCharsets.UTF_8));
+        )
+        {
+            String expectedLine;
+            while ((expectedLine = expectedReader.readLine()) != null)
+            {
+                final String actualLine = actualReader.readLine();
+                assertEquals(actualLine, expectedLine);
+            }
+            assertNull(actualReader.readLine());
+        }
+    }
+
+    private File getActualFile(final String actualResultFilePath)
+    {
+        final int pathSeparatorLocation = actualResultFilePath.lastIndexOf("/");
+        final String intermediatePath = pathSeparatorLocation > 0 ? actualResultFilePath.substring(0, pathSeparatorLocation) : "";
+        final String actualResultFileName = pathSeparatorLocation > 0
+                ? actualResultFilePath.substring(pathSeparatorLocation + 1) : actualResultFilePath;
+        final File sessionWorkspace = sessionWorkspaceProvider.getSessionWorkspace(sessionToken);
+        final File sessionWorkspaceSubfolder = new File(sessionWorkspace, intermediatePath);
+        final File[] files = sessionWorkspaceSubfolder.listFiles((FilenameFilter) new NameFileFilter(actualResultFileName));
+
+        assertNotNull(files);
+        assertEquals(1, files.length, String.format("Session workspace should contain only one file with the download URL '%s'.",
+                actualResultFilePath));
+
+        return files[0];
+    }
+
+}
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SpreadsheetData.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SpreadsheetData.java
new file mode 100644
index 0000000000000000000000000000000000000000..c0de4a99a271361813a538e9f675d66b82857d75
--- /dev/null
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SpreadsheetData.java
@@ -0,0 +1,62 @@
+/*
+ *  Copyright ETH 2023 Zürich, Scientific IT Services
+ *
+ *  Licensed under the Apache License, Version 2.0 (the "License");
+ *  you may not use this file except in compliance with the License.
+ *  You may obtain a copy of the License at
+ *
+ *       http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ *
+ */
+
+package ch.ethz.sis.openbis.systemtest.asapi.v3;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+
+class SpreadsheetData
+{
+
+    private static final String DECODED_SPREADSHEET_DATA = "{\"headers\":[\"A\",\"B\",\"C\",\"D\",\"E\",\"F\",\"G\",\"H\",\"I\",\"J\",\"K\",\"L\",\"M\","
+            + "\"N\",\"O\",\"P\",\"Q\",\"R\",\"S\",\"T\",\"U\",\"V\",\"W\",\"X\",\"Y\",\"Z\",\"AA\",\"AB\",\"AC\",\"AD\"],"
+            + "\"data\":[[\"A1\",\"B1\",\"C1\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"A2\",\"B2\",\"C2\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],"
+            + "[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\","
+            + "\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],"
+            + "[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"],[\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\",\"\"]],\"style\":{\"A1\":\"text-align: center; overflow: hidden;\",\"B1\":\"text-align: center; overflow: hidden;\",\"C1\":\"text-align: center;\",\"D1\":\"text-align: center;\",\"E1\":\"text-align: center;\",\"F1\":\"text-align: center;\",\"G1\":\"text-align: center;\",\"H1\":\"text-align: center;\",\"I1\":\"text-align: center;\",\"J1\":\"text-align: center;\",\"K1\":\"text-align: center;\",\"L1\":\"text-align: center;\",\"M1\":\"text-align: center;\",\"N1\":\"text-align: center;\",\"O1\":\"text-align: center;\",\"P1\":\"text-align: center;\",\"Q1\":\"text-align: center;\",\"R1\":\"text-align: center;\",\"S1\":\"text-align: center;\",\"T1\":\"text-align: center;\",\"U1\":\"text-align: center;\",\"V1\":\"text-align: center;\",\"W1\":\"text-align: center;\",\"X1\":\"text-align: center;\",\"Y1\":\"text-align: center;\",\"Z1\":\"text-align: center;\",\"AA1\":\"text-align: center;\",\"AB1\":\"text-align: center;\",\"AC1\":\"text-align: center;\",\"AD1\":\"text-align: center;\",\"A2\":\"text-align: center; overflow: hidden;\",\"B2\":\"text-align: center; overflow: hidden;\",\"C2\":\"text-align: center;\",\"D2\":\"text-align: center;\",\"E2\":\"text-align: center;\",\"F2\":\"text-align: center;\",\"G2\":\"text-align: center;\",\"H2\":\"text-align: center;\",\"I2\":\"text-align: center;\",\"J2\":\"text-align: center;\",\"K2\":\"text-align: center;\",\"L2\":\"text-align: center;\",\"M2\":\"text-align: center;\",\"N2\":\"text-align: center;\",\"O2\":\"text-align: center;\",\"P2\":\"text-align: center;\",\"Q2\":\"text-align: center;\",\"R2\":\"text-align: center;\",\"S2\":\"text-align: center;\",\"T2\":\"text-align: center;\",\"U2\":\"text-align: center;\",\"V2\":\"text-align: center;\",\"W2\":\"text-align: center;\",\"X2\":\"text-align: center;\",\"Y2\":\"text-align: center;\",\"Z2\":\"text-align: center;\",\"AA2\":\"text-align: center;\",\"AB2\":\"text-align: center;\",\"AC2\":\"text-align: center;\",\"AD2\":\"text-align: center;\",\"A3\":\"text-align: center;\",\"B3\":\"text-align: center;\",\"C3\":\"text-align: center;\",\"D3\":\"text-align: center;\",\"E3\":\"text-align: center;\",\"F3\":\"text-align: center;\",\"G3\":\"text-align: center;\",\"H3\":\"text-align: center;\",\"I3\":\"text-align: center;\",\"J3\":\"text-align: center;\",\"K3\":\"text-align: center;\",\"L3\":\"text-align: center;\",\"M3\":\"text-align: center;\",\"N3\":\"text-align: center;\",\"O3\":\"text-align: center;\",\"P3\":\"text-align: center;\",\"Q3\":\"text-align: center;\",\"R3\":\"text-align: center;\",\"S3\":\"text-align: center;\",\"T3\":\"text-align: center;\",\"U3\":\"text-align: center;\",\"V3\":\"text-align: center;\",\"W3\":\"text-align: center;\",\"X3\":\"text-align: center;\",\"Y3\":\"text-align: center;\",\"Z3\":\"text-align: center;\",\"AA3\":\"text-align: center;\",\"AB3\":\"text-align: center;\",\"AC3\":\"text-align: center;\",\"AD3\":\"text-align: center;\",\"A4\":\"text-align: center;\",\"B4\":\"text-align: center;\",\"C4\":\"text-align: center;\",\"D4\":\"text-align: center;\",\"E4\":\"text-align: center;\",\"F4\":\"text-align: center;\",\"G4\":\"text-align: center;\",\"H4\":\"text-align: center;\",\"I4\":\"text-align: center;\",\"J4\":\"text-align: center;\",\"K4\":\"text-align: center;\",\"L4\":\"text-align: center;\",\"M4\":\"text-align: center;\",\"N4\":\"text-align: center;\",\"O4\":\"text-align: center;\",\"P4\":\"text-align: center;\",\"Q4\":\"text-align: center;\",\"R4\":\"text-align: center;\",\"S4\":\"text-align: center;\",\"T4\":\"text-align: center;\",\"U4\":\"text-align: center;\",\"V4\":\"text-align: center;\",\"W4\":\"text-align: center;\",\"X4\":\"text-align: center;\",\"Y4\":\"text-align: center;\",\"Z4\":\"text-align: center;\",\"AA4\":\"text-align: center;\",\"AB4\":\"text-align: center;\",\"AC4\":\"text-align: center;\",\"AD4\":\"text-align: center;\",\"A5\":\"text-align: center;\",\"B5\":\"text-align: center;\",\"C5\":\"text-align: center;\",\"D5\":\"text-align: center;\",\"E5\":\"text-align: center;\",\"F5\":\"text-align: center;\",\"G5\":\"text-align: center;\",\"H5\":\"text-align: center;\",\"I5\":\"text-align: center;\",\"J5\":\"text-align: center;\",\"K5\":\"text-align: center;\",\"L5\":\"text-align: center;\",\"M5\":\"text-align: center;\",\"N5\":\"text-align: center;\",\"O5\":\"text-align: center;\",\"P5\":\"text-align: center;\",\"Q5\":\"text-align: center;\",\"R5\":\"text-align: center;\",\"S5\":\"text-align: center;\",\"T5\":\"text-align: center;\",\"U5\":\"text-align: center;\",\"V5\":\"text-align: center;\",\"W5\":\"text-align: center;\",\"X5\":\"text-align: center;\",\"Y5\":\"text-align: center;\",\"Z5\":\"text-align: center;\",\"AA5\":\"text-align: center;\",\"AB5\":\"text-align: center;\",\"AC5\":\"text-align: center;\",\"AD5\":\"text-align: center;\",\"A6\":\"text-align: center;\",\"B6\":\"text-align: center;\",\"C6\":\"text-align: center;\",\"D6\":\"text-align: center;\",\"E6\":\"text-align: center;\",\"F6\":\"text-align: center;\",\"G6\":\"text-align: center;\",\"H6\":\"text-align: center;\",\"I6\":\"text-align: center;\",\"J6\":\"text-align: center;\",\"K6\":\"text-align: center;\",\"L6\":\"text-align: center;\",\"M6\":\"text-align: center;\",\"N6\":\"text-align: center;\",\"O6\":\"text-align: center;\",\"P6\":\"text-align: center;\",\"Q6\":\"text-align: center;\",\"R6\":\"text-align: center;\",\"S6\":\"text-align: center;\",\"T6\":\"text-align: center;\",\"U6\":\"text-align: center;\",\"V6\":\"text-align: center;\",\"W6\":\"text-align: center;\",\"X6\":\"text-align: center;\",\"Y6\":\"text-align: center;\",\"Z6\":\"text-align: center;\",\"AA6\":\"text-align: center;\",\"AB6\":\"text-align: center;\",\"AC6\":\"text-align: center;\",\"AD6\":\"text-align: center;\",\"A7\":\"text-align: center;\",\"B7\":\"text-align: center;\",\"C7\":\"text-align: center;\",\"D7\":\"text-align: center;\",\"E7\":\"text-align: center;\",\"F7\":\"text-align: center;\",\"G7\":\"text-align: center;\",\"H7\":\"text-align: center;\",\"I7\":\"text-align: center;\",\"J7\":\"text-align: center;\",\"K7\":\"text-align: center;\",\"L7\":\"text-align: center;\",\"M7\":\"text-align: center;\",\"N7\":\"text-align: center;\",\"O7\":\"text-align: center;\",\"P7\":\"text-align: center;\",\"Q7\":\"text-align: center;\",\"R7\":\"text-align: center;\",\"S7\":\"text-align: center;\",\"T7\":\"text-align: center;\",\"U7\":\"text-align: center;\",\"V7\":\"text-align: center;\",\"W7\":\"text-align: center;\",\"X7\":\"text-align: center;\",\"Y7\":\"text-align: center;\",\"Z7\":\"text-align: center;\",\"AA7\":\"text-align: center;\",\"AB7\":\"text-align: center;\",\"AC7\":\"text-align: center;\",\"AD7\":\"text-align: center;\",\"A8\":\"text-align: center;\",\"B8\":\"text-align: center;\",\"C8\":\"text-align: center;\",\"D8\":\"text-align: center;\",\"E8\":\"text-align: center;\",\"F8\":\"text-align: center;\",\"G8\":\"text-align: center;\",\"H8\":\"text-align: center;\",\"I8\":\"text-align: center;\",\"J8\":\"text-align: center;\",\"K8\":\"text-align: center;\",\"L8\":\"text-align: center;\",\"M8\":\"text-align: center;\",\"N8\":\"text-align: center;\",\"O8\":\"text-align: center;\",\"P8\":\"text-align: center;\",\"Q8\":\"text-align: center;\",\"R8\":\"text-align: center;\",\"S8\":\"text-align: center;\",\"T8\":\"text-align: center;\",\"U8\":\"text-align: center;\",\"V8\":\"text-align: center;\",\"W8\":\"text-align: center;\",\"X8\":\"text-align: center;\",\"Y8\":\"text-align: center;\",\"Z8\":\"text-align: center;\",\"AA8\":\"text-align: center;\",\"AB8\":\"text-align: center;\",\"AC8\":\"text-align: center;\",\"AD8\":\"text-align: center;\",\"A9\":\"text-align: center;\",\"B9\":\"text-align: center;\",\"C9\":\"text-align: center;\",\"D9\":\"text-align: center;\",\"E9\":\"text-align: center;\",\"F9\":\"text-align: center;\",\"G9\":\"text-align: center;\",\"H9\":\"text-align: center;\",\"I9\":\"text-align: center;\",\"J9\":\"text-align: center;\",\"K9\":\"text-align: center;\",\"L9\":\"text-align: center;\",\"M9\":\"text-align: center;\",\"N9\":\"text-align: center;\",\"O9\":\"text-align: center;\",\"P9\":\"text-align: center;\",\"Q9\":\"text-align: center;\",\"R9\":\"text-align: center;\",\"S9\":\"text-align: center;\",\"T9\":\"text-align: center;\",\"U9\":\"text-align: center;\",\"V9\":\"text-align: center;\",\"W9\":\"text-align: center;\",\"X9\":\"text-align: center;\",\"Y9\":\"text-align: center;\",\"Z9\":\"text-align: center;\",\"AA9\":\"text-align: center;\",\"AB9\":\"text-align: center;\",\"AC9\":\"text-align: center;\",\"AD9\":\"text-align: center;\",\"A10\":\"text-align: center;\",\"B10\":\"text-align: center;\",\"C10\":\"text-align: center;\",\"D10\":\"text-align: center;\",\"E10\":\"text-align: center;\",\"F10\":\"text-align: center;\",\"G10\":\"text-align: center;\",\"H10\":\"text-align: center;\",\"I10\":\"text-align: center;\",\"J10\":\"text-align: center;\",\"K10\":\"text-align: center;\",\"L10\":\"text-align: center;\",\"M10\":\"text-align: center;\",\"N10\":\"text-align: center;\",\"O10\":\"text-align: center;\",\"P10\":\"text-align: center;\",\"Q10\":\"text-align: center;\",\"R10\":\"text-align: center;\",\"S10\":\"text-align: center;\",\"T10\":\"text-align: center;\",\"U10\":\"text-align: center;\",\"V10\":\"text-align: center;\",\"W10\":\"text-align: center;\",\"X10\":\"text-align: center;\",\"Y10\":\"text-align: center;\",\"Z10\":\"text-align: center;\",\"AA10\":\"text-align: center;\",\"AB10\":\"text-align: center;\",\"AC10\":\"text-align: center;\",\"AD10\":\"text-align: center;\",\"A11\":\"text-align: center;\",\"B11\":\"text-align: center;\",\"C11\":\"text-align: center;\",\"D11\":\"text-align: center;\",\"E11\":\"text-align: center;\",\"F11\":\"text-align: center;\",\"G11\":\"text-align: center;\",\"H11\":\"text-align: center;\",\"I11\":\"text-align: center;\",\"J11\":\"text-align: center;\",\"K11\":\"text-align: center;\",\"L11\":\"text-align: center;\",\"M11\":\"text-align: center;\",\"N11\":\"text-align: center;\",\"O11\":\"text-align: center;\",\"P11\":\"text-align: center;\",\"Q11\":\"text-align: center;\",\"R11\":\"text-align: center;\",\"S11\":\"text-align: center;\",\"T11\":\"text-align: center;\",\"U11\":\"text-align: center;\",\"V11\":\"text-align: center;\",\"W11\":\"text-align: center;\",\"X11\":\"text-align: center;\",\"Y11\":\"text-align: center;\",\"Z11\":\"text-align: center;\",\"AA11\":\"text-align: center;\",\"AB11\":\"text-align: center;\",\"AC11\":\"text-align: center;\",\"AD11\":\"text-align: center;\",\"A12\":\"text-align: center;\",\"B12\":\"text-align: center;\",\"C12\":\"text-align: center;\",\"D12\":\"text-align: center;\",\"E12\":\"text-align: center;\",\"F12\":\"text-align: center;\",\"G12\":\"text-align: center;\",\"H12\":\"text-align: center;\",\"I12\":\"text-align: center;\",\"J12\":\"text-align: center;\",\"K12\":\"text-align: center;\",\"L12\":\"text-align: center;\",\"M12\":\"text-align: center;\",\"N12\":\"text-align: center;\",\"O12\":\"text-align: center;\",\"P12\":\"text-align: center;\",\"Q12\":\"text-align: center;\",\"R12\":\"text-align: center;\",\"S12\":\"text-align: center;\",\"T12\":\"text-align: center;\",\"U12\":\"text-align: center;\",\"V12\":\"text-align: center;\",\"W12\":\"text-align: center;\",\"X12\":\"text-align: center;\",\"Y12\":\"text-align: center;\",\"Z12\":\"text-align: center;\",\"AA12\":\"text-align: center;\",\"AB12\":\"text-align: center;\",\"AC12\":\"text-align: center;\",\"AD12\":\"text-align: center;\",\"A13\":\"text-align: center;\",\"B13\":\"text-align: center;\",\"C13\":\"text-align: center;\",\"D13\":\"text-align: center;\",\"E13\":\"text-align: center;\",\"F13\":\"text-align: center;\",\"G13\":\"text-align: center;\",\"H13\":\"text-align: center;\",\"I13\":\"text-align: center;\",\"J13\":\"text-align: center;\",\"K13\":\"text-align: center;\",\"L13\":\"text-align: center;\",\"M13\":\"text-align: center;\",\"N13\":\"text-align: center;\",\"O13\":\"text-align: center;\",\"P13\":\"text-align: center;\",\"Q13\":\"text-align: center;\",\"R13\":\"text-align: center;\",\"S13\":\"text-align: center;\",\"T13\":\"text-align: center;\",\"U13\":\"text-align: center;\",\"V13\":\"text-align: center;\",\"W13\":\"text-align: center;\",\"X13\":\"text-align: center;\",\"Y13\":\"text-align: center;\",\"Z13\":\"text-align: center;\",\"AA13\":\"text-align: center;\",\"AB13\":\"text-align: center;\",\"AC13\":\"text-align: center;\",\"AD13\":\"text-align: center;\",\"A14\":\"text-align: center;\",\"B14\":\"text-align: center;\",\"C14\":\"text-align: center;\",\"D14\":\"text-align: center;\",\"E14\":\"text-align: center;\",\"F14\":\"text-align: center;\",\"G14\":\"text-align: center;\",\"H14\":\"text-align: center;\",\"I14\":\"text-align: center;\",\"J14\":\"text-align: center;\",\"K14\":\"text-align: center;\",\"L14\":\"text-align: center;\",\"M14\":\"text-align: center;\",\"N14\":\"text-align: center;\",\"O14\":\"text-align: center;\",\"P14\":\"text-align: center;\",\"Q14\":\"text-align: center;\",\"R14\":\"text-align: center;\",\"S14\":\"text-align: center;\",\"T14\":\"text-align: center;\",\"U14\":\"text-align: center;\",\"V14\":\"text-align: center;\",\"W14\":\"text-align: center;\",\"X14\":\"text-align: center;\",\"Y14\":\"text-align: center;\",\"Z14\":\"text-align: center;\",\"AA14\":\"text-align: center;\",\"AB14\":\"text-align: center;\",\"AC14\":\"text-align: center;\",\"AD14\":\"text-align: center;\",\"A15\":\"text-align: center;\",\"B15\":\"text-align: center;\",\"C15\":\"text-align: center;\",\"D15\":\"text-align: center;\",\"E15\":\"text-align: center;\",\"F15\":\"text-align: center;\",\"G15\":\"text-align: center;\",\"H15\":\"text-align: center;\",\"I15\":\"text-align: center;\",\"J15\":\"text-align: center;\",\"K15\":\"text-align: center;\",\"L15\":\"text-align: center;\",\"M15\":\"text-align: center;\",\"N15\":\"text-align: center;\",\"O15\":\"text-align: center;\",\"P15\":\"text-align: center;\",\"Q15\":\"text-align: center;\",\"R15\":\"text-align: center;\",\"S15\":\"text-align: center;\",\"T15\":\"text-align: center;\",\"U15\":\"text-align: center;\",\"V15\":\"text-align: center;\",\"W15\":\"text-align: center;\",\"X15\":\"text-align: center;\",\"Y15\":\"text-align: center;\",\"Z15\":\"text-align: center;\",\"AA15\":\"text-align: center;\",\"AB15\":\"text-align: center;\",\"AC15\":\"text-align: center;\",\"AD15\":\"text-align: center;\",\"A16\":\"text-align: center;\",\"B16\":\"text-align: center;\",\"C16\":\"text-align: center;\",\"D16\":\"text-align: center;\",\"E16\":\"text-align: center;\",\"F16\":\"text-align: center;\",\"G16\":\"text-align: center;\",\"H16\":\"text-align: center;\",\"I16\":\"text-align: center;\",\"J16\":\"text-align: center;\",\"K16\":\"text-align: center;\",\"L16\":\"text-align: center;\",\"M16\":\"text-align: center;\",\"N16\":\"text-align: center;\",\"O16\":\"text-align: center;\",\"P16\":\"text-align: center;\",\"Q16\":\"text-align: center;\",\"R16\":\"text-align: center;\",\"S16\":\"text-align: center;\",\"T16\":\"text-align: center;\",\"U16\":\"text-align: center;\",\"V16\":\"text-align: center;\",\"W16\":\"text-align: center;\",\"X16\":\"text-align: center;\",\"Y16\":\"text-align: center;\",\"Z16\":\"text-align: center;\",\"AA16\":\"text-align: center;\",\"AB16\":\"text-align: center;\",\"AC16\":\"text-align: center;\",\"AD16\":\"text-align: center;\",\"A17\":\"text-align: center;\",\"B17\":\"text-align: center;\",\"C17\":\"text-align: center;\",\"D17\":\"text-align: center;\",\"E17\":\"text-align: center;\",\"F17\":\"text-align: center;\",\"G17\":\"text-align: center;\",\"H17\":\"text-align: center;\",\"I17\":\"text-align: center;\",\"J17\":\"text-align: center;\",\"K17\":\"text-align: center;\",\"L17\":\"text-align: center;\",\"M17\":\"text-align: center;\",\"N17\":\"text-align: center;\",\"O17\":\"text-align: center;\",\"P17\":\"text-align: center;\",\"Q17\":\"text-align: center;\",\"R17\":\"text-align: center;\",\"S17\":\"text-align: center;\",\"T17\":\"text-align: center;\",\"U17\":\"text-align: center;\",\"V17\":\"text-align: center;\",\"W17\":\"text-align: center;\",\"X17\":\"text-align: center;\",\"Y17\":\"text-align: center;\",\"Z17\":\"text-align: center;\",\"AA17\":\"text-align: center;\",\"AB17\":\"text-align: center;\",\"AC17\":\"text-align: center;\",\"AD17\":\"text-align: center;\",\"A18\":\"text-align: center;\",\"B18\":\"text-align: center;\",\"C18\":\"text-align: center;\",\"D18\":\"text-align: center;\",\"E18\":\"text-align: center;\",\"F18\":\"text-align: center;\",\"G18\":\"text-align: center;\",\"H18\":\"text-align: center;\",\"I18\":\"text-align: center;\",\"J18\":\"text-align: center;\",\"K18\":\"text-align: center;\",\"L18\":\"text-align: center;\",\"M18\":\"text-align: center;\",\"N18\":\"text-align: center;\",\"O18\":\"text-align: center;\",\"P18\":\"text-align: center;\",\"Q18\":\"text-align: center;\",\"R18\":\"text-align: center;\",\"S18\":\"text-align: center;\",\"T18\":\"text-align: center;\",\"U18\":\"text-align: center;\",\"V18\":\"text-align: center;\",\"W18\":\"text-align: center;\",\"X18\":\"text-align: center;\",\"Y18\":\"text-align: center;\",\"Z18\":\"text-align: center;\",\"AA18\":\"text-align: center;\",\"AB18\":\"text-align: center;\",\"AC18\":\"text-align: center;\",\"AD18\":\"text-align: center;\",\"A19\":\"text-align: center;\",\"B19\":\"text-align: center;\",\"C19\":\"text-align: center;\",\"D19\":\"text-align: center;\",\"E19\":\"text-align: center;\",\"F19\":\"text-align: center;\",\"G19\":\"text-align: center;\",\"H19\":\"text-align: center;\",\"I19\":\"text-align: center;\",\"J19\":\"text-align: center;\",\"K19\":\"text-align: center;\",\"L19\":\"text-align: center;\",\"M19\":\"text-align: center;\",\"N19\":\"text-align: center;\",\"O19\":\"text-align: center;\",\"P19\":\"text-align: center;\",\"Q19\":\"text-align: center;\",\"R19\":\"text-align: center;\",\"S19\":\"text-align: center;\",\"T19\":\"text-align: center;\",\"U19\":\"text-align: center;\",\"V19\":\"text-align: center;\",\"W19\":\"text-align: center;\",\"X19\":\"text-align: center;\",\"Y19\":\"text-align: center;\",\"Z19\":\"text-align: center;\",\"AA19\":\"text-align: center;\",\"AB19\":\"text-align: center;\",\"AC19\":\"text-align: center;\",\"AD19\":\"text-align: center;\",\"A20\":\"text-align: center;\",\"B20\":\"text-align: center;\",\"C20\":\"text-align: center;\",\"D20\":\"text-align: center;\",\"E20\":\"text-align: center;\",\"F20\":\"text-align: center;\",\"G20\":\"text-align: center;\",\"H20\":\"text-align: center;\",\"I20\":\"text-align: center;\",\"J20\":\"text-align: center;\",\"K20\":\"text-align: center;\",\"L20\":\"text-align: center;\",\"M20\":\"text-align: center;\",\"N20\":\"text-align: center;\",\"O20\":\"text-align: center;\",\"P20\":\"text-align: center;\",\"Q20\":\"text-align: center;\",\"R20\":\"text-align: center;\",\"S20\":\"text-align: center;\",\"T20\":\"text-align: center;\",\"U20\":\"text-align: center;\",\"V20\":\"text-align: center;\",\"W20\":\"text-align: center;\",\"X20\":\"text-align: center;\",\"Y20\":\"text-align: center;\",\"Z20\":\"text-align: center;\",\"AA20\":\"text-align: center;\",\"AB20\":\"text-align: center;\",\"AC20\":\"text-align: center;\",\"AD20\":\"text-align: center;\",\"A21\":\"text-align: center;\",\"B21\":\"text-align: center;\",\"C21\":\"text-align: center;\",\"D21\":\"text-align: center;\",\"E21\":\"text-align: center;\",\"F21\":\"text-align: center;\",\"G21\":\"text-align: center;\",\"H21\":\"text-align: center;\",\"I21\":\"text-align: center;\",\"J21\":\"text-align: center;\",\"K21\":\"text-align: center;\",\"L21\":\"text-align: center;\",\"M21\":\"text-align: center;\",\"N21\":\"text-align: center;\",\"O21\":\"text-align: center;\",\"P21\":\"text-align: center;\",\"Q21\":\"text-align: center;\",\"R21\":\"text-align: center;\",\"S21\":\"text-align: center;\",\"T21\":\"text-align: center;\",\"U21\":\"text-align: center;\",\"V21\":\"text-align: center;\",\"W21\":\"text-align: center;\",\"X21\":\"text-align: center;\",\"Y21\":\"text-align: center;\",\"Z21\":\"text-align: center;\",\"AA21\":\"text-align: center;\",\"AB21\":\"text-align: center;\",\"AC21\":\"text-align: center;\",\"AD21\":\"text-align: center;\",\"A22\":\"text-align: center;\",\"B22\":\"text-align: center;\",\"C22\":\"text-align: center;\",\"D22\":\"text-align: center;\",\"E22\":\"text-align: center;\",\"F22\":\"text-align: center;\",\"G22\":\"text-align: center;\",\"H22\":\"text-align: center;\",\"I22\":\"text-align: center;\",\"J22\":\"text-align: center;\",\"K22\":\"text-align: center;\",\"L22\":\"text-align: center;\",\"M22\":\"text-align: center;\",\"N22\":\"text-align: center;\",\"O22\":\"text-align: center;\",\"P22\":\"text-align: center;\",\"Q22\":\"text-align: center;\",\"R22\":\"text-align: center;\",\"S22\":\"text-align: center;\",\"T22\":\"text-align: center;\",\"U22\":\"text-align: center;\",\"V22\":\"text-align: center;\",\"W22\":\"text-align: center;\",\"X22\":\"text-align: center;\",\"Y22\":\"text-align: center;\",\"Z22\":\"text-align: center;\",\"AA22\":\"text-align: center;\",\"AB22\":\"text-align: center;\",\"AC22\":\"text-align: center;\",\"AD22\":\"text-align: center;\",\"A23\":\"text-align: center;\",\"B23\":\"text-align: center;\",\"C23\":\"text-align: center;\",\"D23\":\"text-align: center;\",\"E23\":\"text-align: center;\",\"F23\":\"text-align: center;\",\"G23\":\"text-align: center;\",\"H23\":\"text-align: center;\",\"I23\":\"text-align: center;\",\"J23\":\"text-align: center;\",\"K23\":\"text-align: center;\",\"L23\":\"text-align: center;\",\"M23\":\"text-align: center;\",\"N23\":\"text-align: center;\",\"O23\":\"text-align: center;\",\"P23\":\"text-align: center;\",\"Q23\":\"text-align: center;\",\"R23\":\"text-align: center;\",\"S23\":\"text-align: center;\",\"T23\":\"text-align: center;\",\"U23\":\"text-align: center;\",\"V23\":\"text-align: center;\",\"W23\":\"text-align: center;\",\"X23\":\"text-align: center;\",\"Y23\":\"text-align: center;\",\"Z23\":\"text-align: center;\",\"AA23\":\"text-align: center;\",\"AB23\":\"text-align: center;\",\"AC23\":\"text-align: center;\",\"AD23\":\"text-align: center;\",\"A24\":\"text-align: center;\",\"B24\":\"text-align: center;\",\"C24\":\"text-align: center;\",\"D24\":\"text-align: center;\",\"E24\":\"text-align: center;\",\"F24\":\"text-align: center;\",\"G24\":\"text-align: center;\",\"H24\":\"text-align: center;\",\"I24\":\"text-align: center;\",\"J24\":\"text-align: center;\",\"K24\":\"text-align: center;\",\"L24\":\"text-align: center;\",\"M24\":\"text-align: center;\",\"N24\":\"text-align: center;\",\"O24\":\"text-align: center;\",\"P24\":\"text-align: center;\",\"Q24\":\"text-align: center;\",\"R24\":\"text-align: center;\",\"S24\":\"text-align: center;\",\"T24\":\"text-align: center;\",\"U24\":\"text-align: center;\",\"V24\":\"text-align: center;\",\"W24\":\"text-align: center;\",\"X24\":\"text-align: center;\",\"Y24\":\"text-align: center;\",\"Z24\":\"text-align: center;\",\"AA24\":\"text-align: center;\",\"AB24\":\"text-align: center;\",\"AC24\":\"text-align: center;\",\"AD24\":\"text-align: center;\",\"A25\":\"text-align: center;\",\"B25\":\"text-align: center;\",\"C25\":\"text-align: center;\",\"D25\":\"text-align: center;\",\"E25\":\"text-align: center;\",\"F25\":\"text-align: center;\",\"G25\":\"text-align: center;\",\"H25\":\"text-align: center;\",\"I25\":\"text-align: center;\",\"J25\":\"text-align: center;\",\"K25\":\"text-align: center;\",\"L25\":\"text-align: center;\",\"M25\":\"text-align: center;\",\"N25\":\"text-align: center;\",\"O25\":\"text-align: center;\",\"P25\":\"text-align: center;\",\"Q25\":\"text-align: center;\",\"R25\":\"text-align: center;\",\"S25\":\"text-align: center;\",\"T25\":\"text-align: center;\",\"U25\":\"text-align: center;\",\"V25\":\"text-align: center;\",\"W25\":\"text-align: center;\",\"X25\":\"text-align: center;\",\"Y25\":\"text-align: center;\",\"Z25\":\"text-align: center;\",\"AA25\":\"text-align: center;\",\"AB25\":\"text-align: center;\",\"AC25\":\"text-align: center;\",\"AD25\":\"text-align: center;\",\"A26\":\"text-align: center;\",\"B26\":\"text-align: center;\",\"C26\":\"text-align: center;\",\"D26\":\"text-align: center;\",\"E26\":\"text-align: center;\",\"F26\":\"text-align: center;\",\"G26\":\"text-align: center;\",\"H26\":\"text-align: center;\",\"I26\":\"text-align: center;\",\"J26\":\"text-align: center;\",\"K26\":\"text-align: center;\",\"L26\":\"text-align: center;\",\"M26\":\"text-align: center;\",\"N26\":\"text-align: center;\",\"O26\":\"text-align: center;\",\"P26\":\"text-align: center;\",\"Q26\":\"text-align: center;\",\"R26\":\"text-align: center;\",\"S26\":\"text-align: center;\",\"T26\":\"text-align: center;\",\"U26\":\"text-align: center;\",\"V26\":\"text-align: center;\",\"W26\":\"text-align: center;\",\"X26\":\"text-align: center;\",\"Y26\":\"text-align: center;\",\"Z26\":\"text-align: center;\",\"AA26\":\"text-align: center;\",\"AB26\":\"text-align: center;\",\"AC26\":\"text-align: center;\",\"AD26\":\"text-align: center;\",\"A27\":\"text-align: center;\",\"B27\":\"text-align: center;\",\"C27\":\"text-align: center;\",\"D27\":\"text-align: center;\",\"E27\":\"text-align: center;\",\"F27\":\"text-align: center;\",\"G27\":\"text-align: center;\",\"H27\":\"text-align: center;\",\"I27\":\"text-align: center;\",\"J27\":\"text-align: center;\",\"K27\":\"text-align: center;\",\"L27\":\"text-align: center;\",\"M27\":\"text-align: center;\",\"N27\":\"text-align: center;\",\"O27\":\"text-align: center;\",\"P27\":\"text-align: center;\",\"Q27\":\"text-align: center;\",\"R27\":\"text-align: center;\",\"S27\":\"text-align: center;\",\"T27\":\"text-align: center;\",\"U27\":\"text-align: center;\",\"V27\":\"text-align: center;\",\"W27\":\"text-align: center;\",\"X27\":\"text-align: center;\",\"Y27\":\"text-align: center;\",\"Z27\":\"text-align: center;\",\"AA27\":\"text-align: center;\",\"AB27\":\"text-align: center;\",\"AC27\":\"text-align: center;\",\"AD27\":\"text-align: center;\",\"A28\":\"text-align: center;\",\"B28\":\"text-align: center;\",\"C28\":\"text-align: center;\",\"D28\":\"text-align: center;\",\"E28\":\"text-align: center;\",\"F28\":\"text-align: center;\",\"G28\":\"text-align: center;\",\"H28\":\"text-align: center;\",\"I28\":\"text-align: center;\",\"J28\":\"text-align: center;\",\"K28\":\"text-align: center;\",\"L28\":\"text-align: center;\",\"M28\":\"text-align: center;\",\"N28\":\"text-align: center;\",\"O28\":\"text-align: center;\",\"P28\":\"text-align: center;\",\"Q28\":\"text-align: center;\",\"R28\":\"text-align: center;\",\"S28\":\"text-align: center;\",\"T28\":\"text-align: center;\",\"U28\":\"text-align: center;\",\"V28\":\"text-align: center;\",\"W28\":\"text-align: center;\",\"X28\":\"text-align: center;\",\"Y28\":\"text-align: center;\",\"Z28\":\"text-align: center;\",\"AA28\":\"text-align: center;\",\"AB28\":\"text-align: center;\",\"AC28\":\"text-align: center;\",\"AD28\":\"text-align: center;\",\"A29\":\"text-align: center;\",\"B29\":\"text-align: center;\",\"C29\":\"text-align: center;\",\"D29\":\"text-align: center;\",\"E29\":\"text-align: center;\",\"F29\":\"text-align: center;\",\"G29\":\"text-align: center;\",\"H29\":\"text-align: center;\",\"I29\":\"text-align: center;\",\"J29\":\"text-align: center;\",\"K29\":\"text-align: center;\",\"L29\":\"text-align: center;\",\"M29\":\"text-align: center;\",\"N29\":\"text-align: center;\",\"O29\":\"text-align: center;\",\"P29\":\"text-align: center;\",\"Q29\":\"text-align: center;\",\"R29\":\"text-align: center;\",\"S29\":\"text-align: center;\",\"T29\":\"text-align: center;\",\"U29\":\"text-align: center;\",\"V29\":\"text-align: center;\",\"W29\":\"text-align: center;\",\"X29\":\"text-align: center;\",\"Y29\":\"text-align: center;\",\"Z29\":\"text-align: center;\",\"AA29\":\"text-align: center;\",\"AB29\":\"text-align: center;\",\"AC29\":\"text-align: center;\",\"AD29\":\"text-align: center;\",\"A30\":\"text-align: center;\",\"B30\":\"text-align: center;\",\"C30\":\"text-align: center;\",\"D30\":\"text-align: center;\",\"E30\":\"text-align: center;\",\"F30\":\"text-align: center;\",\"G30\":\"text-align: center;\",\"H30\":\"text-align: center;\",\"I30\":\"text-align: center;\",\"J30\":\"text-align: center;\",\"K30\":\"text-align: center;\",\"L30\":\"text-align: center;\",\"M30\":\"text-align: center;\",\"N30\":\"text-align: center;\",\"O30\":\"text-align: center;\",\"P30\":\"text-align: center;\",\"Q30\":\"text-align: center;\",\"R30\":\"text-align: center;\",\"S30\":\"text-align: center;\",\"T30\":\"text-align: center;\",\"U30\":\"text-align: center;\",\"V30\":\"text-align: center;\",\"W30\":\"text-align: center;\",\"X30\":\"text-align: center;\",\"Y30\":\"text-align: center;\",\"Z30\":\"text-align: center;\",\"AA30\":\"text-align: center;\",\"AB30\":\"text-align: center;\",\"AC30\":\"text-align: center;\",\"AD30\":\"text-align: center;\"},\"meta\":null,\"width\":[50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50]}";
+
+    static final String BASE64_SPREADSHEET_DATA = String.format("<DATA>%s</DATA>", Base64.getEncoder().encodeToString(
+            DECODED_SPREADSHEET_DATA.getBytes(StandardCharsets.UTF_8)));
+
+}
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/empty-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/empty-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..63dfa222ead310bcd08c8cd3b162eab5e3a58db8
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/empty-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-filtered-fields-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-filtered-fields-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..f84c95ae1871904030bbaae590425b7a6d50153e
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-filtered-fields-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..88bb91f7fb876ed6aecfa0d449c1a5dce2842706
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..5b3e1abf97d82706eaf345011dd0f68efff42cb0
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-filtered-attributes-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-filtered-attributes-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..9b80fef58278ad2df93d52fc64228e29844e067f
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-filtered-attributes-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..7ea33932342d51080790fc8a65fc50ade206052c
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-type-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..6ad4437c3c89efa3ad46cbe1038e869597786c03
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-data-set-xlsx.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
new file mode 100644
index 0000000000000000000000000000000000000000..c51038ff6c7bd0457e8448da0190dd86228ebb2c
Binary files /dev/null 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-experiment-filtered-fields-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-filtered-fields-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..8155966ebc63b949ecf163e7f9f118147ea31d95
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-filtered-fields-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-filtered-fields-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-filtered-fields-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..03e73cda1e5807ebf0cc0f00e4da329e73a2c919
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-filtered-fields-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..39a819d75b01f07af55de21fcfdca71c3ce32ac7
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..267997ec96ccd3f3df76a8dfba8df4b7a8c4c7f1
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-filtered-attributes-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-filtered-attributes-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..150be7848a5dd9b5fc6a16bb9e04106c2b3a05c2
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-filtered-attributes-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..b713e274f4385b78bf9b791be296a9231c6267a4
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-type-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..f83fc1b4839a8917f4c41aaf4df00f52bdc4d00a
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-experiment-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..f7b9ccb791f8019a236d39c0ecae42fdfa8bb3bc
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..abc8b5dde3ab4564c2f4cd49817ff91c7be16c14
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-filtered-fields-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..96b3f35341b24573cd1d5f0915a26466830f050a
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..dc53ff1ef3a7e539608ef52f1bbbe77618837e80
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..d083be9f64aa9d32eb55f4aaa2adb8232f4975b7
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-project-xlsx.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
new file mode 100644
index 0000000000000000000000000000000000000000..b5433f028291e5d9017a2425ca2ea44ce971c977
Binary files /dev/null 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-compatible-with-import-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-compatible-with-import-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..14a0e95d80b83c63e23528f85bdef44c763dd7a7
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-compatible-with-import-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..1473bdb4edda8ed0d907814eca830da8de974324
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..5c473e4ed6c91eceb70a66a4507d043acf73be52
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-contained-xlsx.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
new file mode 100644
index 0000000000000000000000000000000000000000..ce589a30b354d4d98aec9f67f6640381fc12bb60
Binary files /dev/null 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/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3e71569b98c7d0eeda3d1b57e8d0fccf0a4627d4
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..b8a73ef20abc9a0443c75c4803bdf0dfae37e18c
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-filtered-fields-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..d397bb57847bf3eaf8629e82c591dc41e6a6c2b3
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..1065fbb0a5a29fdb80cf6931513bae7cb11cd469
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..07bf5660bc1f82a67115c8f5c23512dfaee5c812
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..7f4543cb50b16220a2f56911ecdf258fc994e71f
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-plain-text-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..988ef8d034c1071536e80de00d6a026f8533cdf5
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..bdc7eb62d547e455388ea7b1e883805adbb94de5
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-rich-text-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..c76342bb9438259a7005d1aaf23c6fcade233a37
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..06ee930ca42544209afc87f2e5f3ed87980c2115
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..7cdf0e251a5e55293a654b0cc58651116b2bf93f
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-shared-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-filtered-attributes-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-filtered-attributes-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..efa6f6a62badb1603e1a00a41bc4d38ff77a94a9
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-filtered-attributes-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-with-referred-types-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-with-referred-types-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..d4eedef238e154bf6b846cf66877723a9b2b2ad8
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-with-referred-types-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..199c11a875eae8f61a2537d51388644773d26285
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-type-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-image-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-image-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..ec93b872b55e9afa164ec53b03d1de597a6a1a69
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-image-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-spreadsheet-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-spreadsheet-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..895a921480f8b7c9f844335092007cf175a4a8f9
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-with-spreadsheet-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..ae82af2e9008fc9cf6973e9ba9458147db8b3129
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-sample-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-attributes-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-attributes-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3d2752458e3ed7c04d99de739e0645a79ad28e0a
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-attributes-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-fields-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-fields-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..4633bed1615a5c35ac117c184939b66872931f91
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-filtered-fields-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-html.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-html.zip
new file mode 100644
index 0000000000000000000000000000000000000000..4d6b3c38aee8c7e372cbd2114ded855fae61c89d
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-html.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-pdf.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-pdf.zip
new file mode 100644
index 0000000000000000000000000000000000000000..3765b842443e3290aff51eed6cf3bb334ba002b7
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-pdf.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-xlsx.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-xlsx.zip
new file mode 100644
index 0000000000000000000000000000000000000000..5c23f115f705b73d31e1d2c138fa55a170bf2a1b
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/export-space-xlsx.zip differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/nature.png b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/nature.png
new file mode 100644
index 0000000000000000000000000000000000000000..c816782396f24d7534c1982021ca454335f1b03a
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/export/nature.png differ
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/dynamic_script.xls b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/dynamic_script.xls
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/dynamic_script.xls
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/dynamic_script.xls
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/dynamic_script.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/dynamic_script.zip
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/dynamic_script.zip
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/dynamic_script.zip
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/existing_vocabulary.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/existing_vocabulary.xlsx
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/existing_vocabulary.xlsx
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/existing_vocabulary.xlsx
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/existing_vocabulary.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/existing_vocabulary.zip
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/existing_vocabulary.zip
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/existing_vocabulary.zip
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/import.xlsx
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/import.xlsx
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/import.zip
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.zip
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/import.zip
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/scripts/dynamic.py b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/scripts/dynamic.py
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/scripts/dynamic.py
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/scripts/dynamic.py
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/validation_script.xls b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/validation_script.xls
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/validation_script.xls
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/validation_script.xls
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/validation_script.zip b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/validation_script.zip
similarity index 100%
rename from server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/validation_script.zip
rename to server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/import/validation_script.zip