diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java
index 0a24c8350ad6d8513523a256d321957636e5138b..976bf70c80f5ad07cc50579a1f22df20e604f21a 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/IApplicationServerApi.java
@@ -75,9 +75,6 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.search.ExperimentSear
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.search.ExperimentTypeSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update.ExperimentTypeUpdate;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.update.ExperimentUpdate;
-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.options.ExportOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.ExternalDms;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.create.ExternalDmsCreation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.delete.ExternalDmsDeletionOptions;
@@ -2264,6 +2261,6 @@ public interface IApplicationServerApi extends IRpcService
 
     public void executeImport(String sessionToken, ImportData importData, ImportOptions importOptions);
 
-    public ExportResult executeExport(String sessionToken, ExportData exportData, ExportOptions exportOptions);
+//    public ExportResult executeExport(String sessionToken, ExportData exportData, ExportOptions exportOptions);
 
 }
diff --git a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java
index 71184cd8a6c7c280ab0ab64fc7e2fc5b60dbcfe0..0305a2d2690a87e3ed0abbee264cb7ca6039894f 100644
--- a/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java
+++ b/api-openbis-java/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/importer/data/UncompressedImportData.java
@@ -17,7 +17,7 @@
 package ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data;
 
 import java.io.Serializable;
-import java.util.List;
+import java.util.Collection;
 
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -30,9 +30,9 @@ public class UncompressedImportData implements Serializable, ImportData
 
     private final byte[] file;
 
-    private final List<ImportScript> scripts;
+    private final Collection<ImportScript> scripts;
 
-    public UncompressedImportData(final ImportFormat format, final byte[] file, final List<ImportScript> scripts)
+    public UncompressedImportData(final ImportFormat format, final byte[] file, final Collection<ImportScript> scripts)
     {
         this.format = format;
         this.file = file;
@@ -49,7 +49,7 @@ public class UncompressedImportData implements Serializable, ImportData
         return file;
     }
 
-    public List<ImportScript> getScripts()
+    public Collection<ImportScript> getScripts()
     {
         return scripts;
     }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java
index f7effd8acfe164565af9e2751300b0f432f7729d..f22e5f58378e9f56d2568ba23c249954c9eecf29 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiLogger.java
@@ -87,6 +87,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.update.ExternalDmsUp
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.GlobalSearchObject;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.fetchoptions.GlobalSearchObjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.search.GlobalSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportData;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.MaterialType;
@@ -1365,9 +1366,9 @@ public class ApplicationServerApiLogger extends AbstractServerLogger implements
     }
 
     @Override
-    public void doImport(final String sessionToken, final byte[] file, final ImportOptions importOptions)
+    public void executeImport(final String sessionToken, final ImportData importData, final ImportOptions importOptions)
     {
-        logAccess(sessionToken, "do-import", "Path(%s) ImportOptions(%s)", file, importOptions);
+        logAccess(sessionToken, "execute-import", "ImportData(%s) ImportOptions(%s)", importData, importOptions);
     }
 
 }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java
index 309d0c278e607bb3631a1f2f84b92a9848fc9f07..7b13dffafa7d49aa9ea49680df54d8ecacb9faa1 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/ApplicationServerApiPersonalAccessTokenInvocationHandler.java
@@ -88,6 +88,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.externaldms.update.ExternalDmsUp
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.GlobalSearchObject;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.fetchoptions.GlobalSearchObjectFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.global.search.GlobalSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportData;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.Material;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.material.MaterialType;
@@ -1254,7 +1255,7 @@ public class ApplicationServerApiPersonalAccessTokenInvocationHandler implements
     }
 
     @Override
-    public void doImport(final String sessionToken, final byte[] file, final ImportOptions importOptions)
+    public void executeImport(final String sessionToken, final ImportData importData, final ImportOptions importOptions)
     {
         invocation.proceedWithNewFirstArgument(converter.convert(sessionToken));
     }
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java
index 658d75337981d1e2487e05edaaad6f50cb64a90a..eb2490c96e929d54915400f22a7697368a0c65eb 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportExecutor.java
@@ -63,12 +63,15 @@ public class ImportExecutor implements IImportExecutor
             {
                 // XLS file
 
-                importXls(context, operation, Map.of(), ((UncompressedImportData) importData).getFile());
+                final UncompressedImportData uncompressedImportData = (UncompressedImportData) importData;
+
+                importXls(context, operation, Map.of(), uncompressedImportData.getFile());
             } else if (importData instanceof ZipImportData)
             {
                 // ZIP file
 
-                try (final ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(((ZipImportData) importData).getFile())))
+                final ZipImportData zipImportData = (ZipImportData) importData;
+                try (final ZipInputStream zip = new ZipInputStream(new ByteArrayInputStream(zipImportData.getFile())))
                 {
                     final Map<String, String> scripts = new HashMap<>();
                     byte[] xlsFileContent = null;
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java
index 72d971a4a9cd87dbec3517d4d1cf5aca388554ab..ef4032eeaa8069acad357189f88a7ad6bd389419 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/importer/ImportOperationExecutor.java
@@ -18,12 +18,14 @@
 package ch.ethz.sis.openbis.generic.server.asapi.v3.executor.importer;
 
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.stereotype.Component;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.ImportOperation;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.ImportOperationResult;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.IOperationContext;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.common.OperationExecutor;
 
+@Component
 public class ImportOperationExecutor extends OperationExecutor<ImportOperation, ImportOperationResult>
 {
 
diff --git a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java
index 87b6cd191b608a2b0498b17480b82ac8cd798ca2..999b67987740760aca81c786b719edf9b3c75d00 100644
--- a/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java
+++ b/server-application-server/source/java/ch/ethz/sis/openbis/generic/server/asapi/v3/executor/operation/OperationsExecutor.java
@@ -76,6 +76,7 @@ import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.IGetExte
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.ISearchExternalDmsOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.externaldms.IUpdateExternalDmsOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.globalsearch.ISearchGloballyOperationExecutor;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.importer.ImportOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.ICreateMaterialTypesOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.ICreateMaterialsOperationExecutor;
 import ch.ethz.sis.openbis.generic.server.asapi.v3.executor.material.IDeleteMaterialTypesOperationExecutor;
@@ -651,6 +652,9 @@ public class OperationsExecutor implements IOperationsExecutor
     @Autowired
     private IGetSessionInformationOperationExecutor getSessionInformationExecutor;
 
+    @Autowired
+    private ImportOperationExecutor importOperationExecutor;
+
     @Override
     public List<IOperationResult> execute(IOperationContext context, List<? extends IOperation> operations, IOperationExecutionOptions options)
     {
@@ -681,6 +685,7 @@ public class OperationsExecutor implements IOperationsExecutor
             executeCreations(operations, resultMap, context);
             executeUpdates(operations, resultMap, context);
             resultMap.putAll(internalOperationExecutor.execute(context, operations));
+            resultMap.putAll(importOperationExecutor.execute(context, operations));
 
             flushCurrentSession();
             clearCurrentSession();
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c42172366a9ad39d29b29f3e0b3db2ca2ee73c6b
--- /dev/null
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ImportTest.java
@@ -0,0 +1,97 @@
+/*
+ * 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 org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.Collection;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.stream.Collectors;
+
+import org.testng.annotations.BeforeClass;
+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.importer.data.ImportData;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportFormat;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.ImportScript;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.data.UncompressedImportData;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportMode;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.importer.options.ImportOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.VocabularyTerm;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.fetchoptions.VocabularyFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.search.VocabularySearchCriteria;
+
+public class ImportTest extends AbstractTest
+{
+
+    private final Map<String, String> IMPORT_SCRIPT_MAP = Map.of("Script 1", "Value 1", "Script 2", "Value 2");
+
+    private final Collection<ImportScript> IMPORT_SCRIPTS = IMPORT_SCRIPT_MAP.entrySet().stream()
+            .map(entry -> new ImportScript(entry.getKey(), entry.getValue())).collect(Collectors.toList());
+
+    private static byte[] fileContent;
+
+    @BeforeClass
+    public void setupClass()
+    {
+        try (final InputStream is = ImportTest.class.getResourceAsStream("test_files/xls/import.xlsx"))
+        {
+            if (is == null)
+            {
+                throw new RuntimeException();
+            }
+
+            fileContent = is.readAllBytes();
+        } catch (final IOException e)
+        {
+            throw new RuntimeException(e);
+        }
+    }
+
+    @Test
+    public void testUncompressedDataImport()
+    {
+        final String sessionToken = v3api.login(TEST_USER, PASSWORD);
+
+        final ImportData importData = new UncompressedImportData(ImportFormat.XLS, fileContent, IMPORT_SCRIPTS);
+        final ImportOptions importOptions = new ImportOptions(ImportMode.UPDATE_IF_EXISTS);
+
+        v3api.executeImport(sessionToken, importData, importOptions);
+
+        final VocabularySearchCriteria vocabularySearchCriteria = new VocabularySearchCriteria();
+        vocabularySearchCriteria.withCode().thatEquals("DETECTION");
+
+        final VocabularyFetchOptions vocabularyFetchOptions = new VocabularyFetchOptions();
+        vocabularyFetchOptions.withTerms();
+
+        final SearchResult<Vocabulary> vocabularySearchResult =
+                v3api.searchVocabularies(sessionToken, vocabularySearchCriteria, vocabularyFetchOptions);
+
+        assertEquals(1, vocabularySearchResult.getTotalCount());
+
+        final List<VocabularyTerm> vocabularyTerms = vocabularySearchResult.getObjects().get(0).getTerms();
+        assertEquals(2, vocabularyTerms.size());
+        assertEquals(Set.of("HRP", "AAA"), vocabularyTerms.stream().map(VocabularyTerm::getCode).collect(Collectors.toSet()));
+    }
+
+}
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/xls/import.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..2ed0c7e2a6091a46bd5fa3b055a723a6a1838fd4
Binary files /dev/null and b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/test_files/xls/import.xlsx differ