diff --git a/openbis_standard_technologies/.dynamic_property_evaluator_queue b/openbis_standard_technologies/.dynamic_property_evaluator_queue
new file mode 100644
index 0000000000000000000000000000000000000000..2e08dce276e43c677d121d627a250d1710fed824
Binary files /dev/null and b/openbis_standard_technologies/.dynamic_property_evaluator_queue differ
diff --git a/openbis_standard_technologies/build.gradle b/openbis_standard_technologies/build.gradle
index 5d823361a6a0bdfb21f9b692075006e0e71d75a0..b5cf66c440696ed75b1d0d0140d76b06dbce84db 100644
--- a/openbis_standard_technologies/build.gradle
+++ b/openbis_standard_technologies/build.gradle
@@ -108,6 +108,19 @@ dependencies {
 
 	javadoc_compilation	project(path:':rtd_phosphonetx'),
 				    	project(path:':screening')
+				    	
+    testCompile (project(path: ':openbis', configuration: 'tests')) {
+         exclude group: 'google', module: 'gwt-user'
+    }
+
+}
+
+sourceSets { 
+	test {
+		resources {
+			srcDirs = ['source/java', 'sourceTest/java']
+		}
+	}
 }
 
 task compileGwt (dependsOn: classes, type: JavaExec) {
diff --git a/openbis_standard_technologies/dist/core-plugins/core-plugins.properties b/openbis_standard_technologies/dist/core-plugins/core-plugins.properties
new file mode 100644
index 0000000000000000000000000000000000000000..77fe9f20e507ac4dc02ef2ae23706d7f9f36fb00
--- /dev/null
+++ b/openbis_standard_technologies/dist/core-plugins/core-plugins.properties
@@ -0,0 +1 @@
+enabled-modules = dev-.*
\ No newline at end of file
diff --git a/openbis_standard_technologies/source/java/service.properties b/openbis_standard_technologies/source/java/service.properties
index e8586097f09ecde472f31d671d52d7dcc0c13ad4..ca515e360564c0f113dea8f8e4d273c487fd2610 100644
--- a/openbis_standard_technologies/source/java/service.properties
+++ b/openbis_standard_technologies/source/java/service.properties
@@ -77,7 +77,7 @@ hibernate.search.worker.execution=async
 
 web-client-configuration-file = etc/web-client.properties
 
-core-plugins-folder=source/core-plugins
+core-plugins-folder=dist/core-plugins
 
 # Database Configurations for Query module
 query-databases = 1
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/AbstractImportTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/AbstractImportTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f7819e2ba882e4e25e8ecc774bdb685fcaa4d8c7
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/AbstractImportTest.java
@@ -0,0 +1,23 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
+import org.testng.annotations.BeforeSuite;
+
+import ch.systemsx.cisd.openbis.generic.server.util.TestInitializer;
+import ch.systemsx.cisd.openbis.generic.shared.Constants;
+import ch.systemsx.cisd.openbis.generic.shared.coreplugin.CorePluginsUtils;
+
+public class AbstractImportTest extends AbstractTransactionalTestNGSpringContextTests
+{
+
+    protected String FILES_DIR;
+
+    @BeforeSuite
+    public void setupSuite()
+    {
+        System.setProperty(CorePluginsUtils.CORE_PLUGINS_FOLDER_KEY, "dist/core-plugins");
+        System.setProperty(Constants.ENABLED_MODULES_KEY, "xls-import");
+        TestInitializer.initEmptyDbNoIndex();
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportDatasetTypesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportDatasetTypesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f5436657b69312da800689c90793c6e97a1f372b
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportDatasetTypesTest.java
@@ -0,0 +1,107 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportDatasetTypesTest extends AbstractImportTest
+{
+
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String DATASET_TYPES_XLS = "dataset_types/normal_dataset.xls";
+
+    private static final String DATASET_NO_CODE = "dataset_types/no_code.xls";
+
+    private static final String DATASET_WITH_VALIDATION_SCRIPT = "dataset_types/with_validation.xls";
+
+    private static final String DATASET_WITHOUT_PROPERTIES = "dataset_types/no_properties.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportDatasetTypesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportDatasetTypesTest.class.getSimpleName().length()) + "/test_files/";
+        System.out.println(FILES_DIR);
+        System.out.println("SEE ME MY DEAR FRIEND");
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalDatasetsTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, DATASET_TYPES_XLS)));
+        // WHEN
+        DataSetType rawData = TestUtils.getDatasetType(v3api, sessionToken, "RAW_DATA");
+        // THEN
+        assertEquals(rawData.getCode(), "RAW_DATA");
+        assertEquals(rawData.getPropertyAssignments().size(), 2);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testDatasetsWithoutPropertiesTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, DATASET_WITHOUT_PROPERTIES)));
+        // WHEN
+        DataSetType rawData = TestUtils.getDatasetType(v3api, sessionToken, "RAW_DATA");
+        // THEN
+        assertEquals(rawData.getCode(), "RAW_DATA");
+        assertEquals(rawData.getPropertyAssignments().size(), 0);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithValidationScript() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, TestUtils.getValidationPluginMap(),
+                Paths.get(FilenameUtils.concat(FILES_DIR, DATASET_WITH_VALIDATION_SCRIPT)));
+        // WHEN
+        DataSetType collection = TestUtils.getDatasetType(v3api, sessionToken, "RAW_DATA");
+        // THEN
+        assertEquals(collection.getValidationPlugin().getName().toUpperCase(), "RAW_DATA.VALID");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoSampleCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, DATASET_NO_CODE)));
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentTypesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentTypesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..99010317951ca59f376a98f62e0bed6b8d29e0e0
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentTypesTest.java
@@ -0,0 +1,88 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.ExperimentType;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportExperimentTypesTest extends AbstractImportTest
+{
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String EXPERIMENT_TYPES_XLS = "experiment_types/normal_experiment.xls";
+
+    private static final String EXPERIMENT_NO_CODE = "experiment_types/no_code.xls";
+
+    private static final String EXPERIMENT_WITH_VALIDATION_SCRIPT = "experiment_types/with_validation_script.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportExperimentTypesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportExperimentTypesTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalExperimentTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPES_XLS)));
+        // WHEN
+        ExperimentType collection = TestUtils.getExperimentType(v3api, sessionToken, "COLLECTION");
+        // THEN
+        assertEquals(collection.getCode(), "COLLECTION");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testExperimentTypesWithValidationScript() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, TestUtils.getValidationPluginMap(),
+                Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_WITH_VALIDATION_SCRIPT)));
+        // WHEN
+        ExperimentType collection = TestUtils.getExperimentType(v3api, sessionToken, "COLLECTION");
+        // THEN
+        assertEquals(collection.getValidationPlugin().getName().toUpperCase(), "COLLECTION.VALID");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoSampleCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_NO_CODE)));
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentsTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..cbf5a4114bb870ebbbaca669283fc3ac1994d5e5
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportExperimentsTest.java
@@ -0,0 +1,329 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportExperimentsTest extends AbstractImportTest
+{
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String EXPERIMENT_XLS = "experiments/all_inside.xls";
+
+    private static final String EXPERIMENTS_ALL_ELSEWHERE = "experiments/all_elsewhere.xls";
+
+    private static final String EXPERIMENTS_WITH_TYPE_ELSEWHERE = "experiments/experiment_type_elsewhere.xls";
+
+    private static final String EXPERIMENTS_NO_CODE = "experiments/no_code.xls";
+
+    private static final String EXPERIMENTS_WITH_NON_MANDATORY_PROPERTY_MISSING = "experiments/no_non_mandatory_property.xls";
+
+    private static final String EXPERIMENTS_NO_PROJECT_ATTRIBUTE = "experiments/no_project.xls";
+
+    private static final String EXPERIMENTS_WITH_SPACE_AND_PROJECT_ELSEWHERE = "experiments/space_and_project_elsewhere.xls";
+
+    private static final String EXPERIMENTS_SPACE_ELSEWHERE = "experiments/space_elsewhere.xls";
+
+    private static final String EXPERIMENTS_WITH_TYPE_AND_SPACE_ELSEWHERE = "experiments/type_and_space_elsewhere.xls";
+
+    private static final String EXPERIMENTS_WITH_MANDATORY_PROPERTY_MISSING = "experiments/with_mandatory_property_missing.xls";
+
+    private static final String EXPERIMENTS_WITH_MANDATORY_PROPERTY_PRESENT = "experiments/with_mandatory_property.xls";
+
+    private static final String EXPERIMENTS_PROPERTIES_COLUMNS_AS_LABELS = "experiments/with_properties_as_labels.xls";
+
+    private static final String EXPERIMENTS_PROPERTIES_COLUMNS_AS_LABELS_TYPE_ON_SERVER = "experiments/with_properties_as_labels_type_elsewhere.xls";
+
+    private static final String SPACE = "experiments/space.xls";
+
+    private static final String PROJECT = "experiments/project.xls";
+
+    private static final String EXPERIMENT_TYPE = "experiments/experiment_type.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportExperimentsTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportExperimentsTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_XLS)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedSecondExperiment() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_XLS)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT2", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT2");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Other Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "Random string");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithEverythingOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECT)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_ALL_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithEverythingOnServerAndInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECT)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_XLS)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfExperimentTypeDoesntExist() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECT)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_ALL_ELSEWHERE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfProjectDoesntExist() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_ALL_ELSEWHERE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithTypeOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_TYPE_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithTypeOnServerAndInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECT)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_TYPE_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfExperimentNoCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_NO_CODE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWhenNonMandatoryPropertiesAreNotProvided() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_NON_MANDATORY_PROPERTY_MISSING)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), null);
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfExperimentNoProject() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_NO_PROJECT_ATTRIBUTE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithSpaceAndProjectOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECT)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_SPACE_AND_PROJECT_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithSpaceOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_SPACE_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWithTypeAndSpaceOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_TYPE_AND_SPACE_ELSEWHERE)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfMandatoryPropertyMissing() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_MANDATORY_PROPERTY_MISSING)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedIfMandatoryPropertyArePresent() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_WITH_MANDATORY_PROPERTY_PRESENT)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWhenPropertiesAreAddressedByLabelsWithTypeInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_PROPERTIES_COLUMNS_AS_LABELS)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedWhenPropertiesAreAddressedByLabelsWithTypeOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENT_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, EXPERIMENTS_PROPERTIES_COLUMNS_AS_LABELS_TYPE_ON_SERVER)));
+        // WHEN
+        Experiment experiment = TestUtils.getExperiment(v3api, sessionToken, "TEST_EXPERIMENT", "TEST_PROJECT", "TEST_SPACE");
+        // THEN
+        assertEquals(experiment.getCode(), "TEST_EXPERIMENT");
+        assertEquals(experiment.getProject().getCode(), "TEST_PROJECT");
+        assertEquals(experiment.getProperties().get("$NAME"), "Value");
+        assertEquals(experiment.getProperties().get("DEFAULT_OBJECT_TYPE"), "OBJECT_TYPE");
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportProjectsTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportProjectsTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..7b06530d87c6fa5575741a913414f78c8937692d
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportProjectsTest.java
@@ -0,0 +1,132 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportProjectsTest extends AbstractImportTest
+{
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String PROJECTS_XLS = "projects/with_spaces.xls";
+
+    private static final String PROJECTS_NO_CODE = "projects/no_code.xls";
+
+    private static final String PROJECTS_NO_DESCRIPTION = "projects/no_desc.xls";
+
+    private static final String PROJECTS_NO_SPACE = "projects/no_space.xls";
+
+    private static final String PROJECTS_WITH_SPACES_ON_SERVER = "projects/with_spaces_on_server.xls";
+
+    private static final String SPACES = "projects/spaces.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportProjectsTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportProjectsTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_XLS)));
+        // WHEN
+        Project project = TestUtils.getProject(v3api, sessionToken, "TEST_PROJECT");
+        // THEN
+        assertEquals(project.getCode(), "TEST_PROJECT");
+        assertEquals(project.getDescription(), "TEST");
+        assertEquals(project.getSpace().getCode(), "TEST_SPACE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedSecondProject() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_XLS)));
+        // WHEN
+        Project project = TestUtils.getProject(v3api, sessionToken, "TEST_PROJECT2");
+        // THEN
+        assertEquals(project.getCode(), "TEST_PROJECT2");
+        assertEquals(project.getDescription(), "description of another project");
+        assertEquals(project.getSpace().getCode(), "TEST_SPACE2");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoProjectCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_NO_CODE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedNoDescription() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_NO_DESCRIPTION)));
+        // WHEN
+        Project project = TestUtils.getProject(v3api, sessionToken, "TEST_PROJECT");
+        // THEN
+        assertEquals(project.getCode(), "TEST_PROJECT");
+        assertEquals(project.getDescription(), null);
+        assertEquals(project.getSpace().getCode(), "TEST_SPACE");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoProjectSpace() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_NO_SPACE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testProjectsAreCreatedSpaceOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACES)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROJECTS_WITH_SPACES_ON_SERVER)));
+        // WHEN
+        Project project = TestUtils.getProject(v3api, sessionToken, "TEST_PROJECT");
+        // THEN
+        assertEquals(project.getCode(), "TEST_PROJECT");
+        assertEquals(project.getDescription(), "TEST");
+        assertEquals(project.getSpace().getCode(), "TEST_SPACE");
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportPropertyTypesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportPropertyTypesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..8b0def35d27e07b085af53fe2dce981ace80eb7d
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportPropertyTypesTest.java
@@ -0,0 +1,148 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.DataType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyType;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportPropertyTypesTest extends AbstractImportTest
+{
+
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String PROPERTY_TYPES_XLS = "property_types/normal_property_type.xls";
+
+    private static final String PROPERTY_NO_CODE = "property_types/no_code.xls";
+
+    private static final String PROPERTY_NO_DATA_TYPE = "property_types/no_data_type.xls";
+
+    private static final String PROPERTY_NO_DESCRIPTION = "property_types/no_desc.xls";
+
+    private static final String PROPERTY_NO_LABEL = "property_types/no_label.xls";
+
+    private static final String PROPERTY_VOCAB_TYPE_NO_VOCABULARY_CODE = "property_types/no_vocab_code.xls";
+
+    private static final String PROPERTY_NON_VOCAB_TYPE_VOCABULARY_CODE = "property_types/vocabcode_when_not_vocabtype.xls";
+
+    private static final String PROPERTY_VOCABULARY_ON_SERVER = "property_types/with_vocab_on_server.xls";
+
+    private static final String PROPERTY_VOCAB_TYPE = "property_types/with_vocab.xls";
+
+    private static final String VOCABULARY_DETECTION = "property_types/vocabulary_detection.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportPropertyTypesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportPropertyTypesTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalPropertyTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_TYPES_XLS)));
+        // WHEN
+        PropertyType notes = TestUtils.getPropertyType(v3api, sessionToken, "NOTES");
+        // THEN
+        assertEquals(notes.getCode(), "NOTES");
+        assertEquals(notes.getLabel(), "Notes");
+        assertEquals(notes.getDataType(), DataType.MULTILINE_VARCHAR);
+        assertEquals(notes.getDescription(), "Notes Descripton");
+        assertFalse(notes.isInternalNameSpace());
+        assertFalse(notes.isManagedInternally());
+        assertNull(notes.getVocabulary());
+    }
+
+    @Test
+    @DirtiesContext
+    public void testInternalPropertyTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_TYPES_XLS)));
+        // WHEN
+        PropertyType notes = TestUtils.getPropertyType(v3api, sessionToken, "$INTERNAL_PROP");
+        // THEN
+        assertEquals(notes.getCode(), "$INTERNAL_PROP");
+        assertEquals(notes.getLabel(), "Name");
+        assertEquals(notes.getDataType(), DataType.VARCHAR);
+        assertEquals(notes.getDescription(), "Name");
+        assertTrue(notes.isInternalNameSpace());
+        assertFalse(notes.isManagedInternally());
+        assertNull(notes.getVocabulary());
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeNoCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_NO_CODE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeNoLabel() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_NO_LABEL)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeNoVocabularyCodeWhenVocabularyType() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_VOCAB_TYPE_NO_VOCABULARY_CODE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeNoDataType() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_NO_DATA_TYPE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeNoDescription() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_NO_DESCRIPTION)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void testPropertyTypeVocabularyCodeToNonVocabularyType() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, PROPERTY_NON_VOCAB_TYPE_VOCABULARY_CODE)));
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSampleTypesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSampleTypesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..78c3538bf5c6fcc708c07b90dfd5d8c569b93112
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSampleTypesTest.java
@@ -0,0 +1,233 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertFalse;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertTrue;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.plugin.Plugin;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.plugin.PluginType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyAssignment;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.SampleType;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportSampleTypesTest extends AbstractImportTest
+{
+
+    private static final String SAMPLE_TYPES_XLS = "sample_types/normal_samples.xls";
+
+    private static final String SAMPLE_TYPES_XLS_DIFFERENT_PROPERTY_ASSIGN = "sample_types/normal_samples_v2.xls";
+
+    private static final String SAMPLE_TYPES_WITH_DYNAMIC_SCRIPT = "sample_types/with_dynamic_script.xls";
+
+    private static final String SAMPLE_TYPES_WITH_VALIDATION_SCRIPT = "sample_types/with_validation_script.xls";
+
+    private static final String SAMPLE_TYPES_WITH_VOCABULARY = "sample_types/with_vocabulary_in_xls.xls";
+
+    private static final String SAMPLE_TYPES_WITH_VOCABULARY_ON_SERVER = "sample_types/with_vocabulary_on_server.xls";
+
+    private static final String VOCABULARY_DETECTION = "sample_types/vocabulary_detection.xls";
+
+    private static final String SAMPLE_TYPES_WITH_AUTO_GENERATED_CODES = "sample_types/with_auto_generated_codes.xls";
+
+    private static final String SAMPLE_TYPE_NO_CODE = "sample_types/no_code.xls";
+
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportSampleTypesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportSampleTypesTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalSampleTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_XLS)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        assertFalse(antibody.isAutoGeneratedCode());
+    }
+
+    @Test
+    @DirtiesContext
+    public void testPropertyTypeAssignmentsFromNormalSampleTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_XLS)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        boolean allMandatory = antibody.getPropertyAssignments().stream().allMatch(propAssignment -> propAssignment.isMandatory() == true);
+        boolean allShownInEditView =
+                antibody.getPropertyAssignments().stream().allMatch(propAssignment -> propAssignment.isShowInEditView() == true);
+        boolean generalInformationExists =
+                antibody.getPropertyAssignments().stream().anyMatch(propAssignment -> propAssignment.getSection().equals("General information"));
+        boolean someOtherSectionExists =
+                antibody.getPropertyAssignments().stream().anyMatch(propAssignment -> propAssignment.getSection().equals("Some other section"));
+        boolean threePropertyAssignments = antibody.getPropertyAssignments().size() == 3;
+        assertTrue(threePropertyAssignments);
+        assertTrue(generalInformationExists);
+        assertTrue(someOtherSectionExists);
+        assertTrue(allShownInEditView);
+        assertTrue(allMandatory);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testPropertyTypeAssignmentsFromNormalv2SampleTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_XLS_DIFFERENT_PROPERTY_ASSIGN)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        boolean allNotMandatory = antibody.getPropertyAssignments().stream().allMatch(propAssignment -> propAssignment.isMandatory() == false);
+        boolean allNotShownInEditView =
+                antibody.getPropertyAssignments().stream().allMatch(propAssignment -> propAssignment.isShowInEditView() == false);
+        boolean threePropertyAssignments = antibody.getPropertyAssignments().size() == 3;
+        assertTrue(threePropertyAssignments);
+        assertTrue(allNotShownInEditView);
+        assertTrue(allNotMandatory);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testPropertyTypesFromNormalSampleTypesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_XLS)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        boolean namePropertyExists =
+                antibody.getPropertyAssignments().stream().anyMatch(propAssignment -> propAssignment.getPropertyType().getCode().equals("$NAME"));
+        boolean forWhatPropertyExists =
+                antibody.getPropertyAssignments().stream().anyMatch(propAssignment -> propAssignment.getPropertyType().getCode().equals("FOR_WHAT"));
+        boolean epitopePropertyExists =
+                antibody.getPropertyAssignments().stream().anyMatch(propAssignment -> propAssignment.getPropertyType().getCode().equals("EPITOPE"));
+
+        assertNotNull(antibody);
+        assertTrue(namePropertyExists);
+        assertTrue(forWhatPropertyExists);
+        assertTrue(epitopePropertyExists);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithPropertyHavingDynamicScript() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, TestUtils.getDynamicPluginMap(),
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_WITH_DYNAMIC_SCRIPT)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        Plugin dynamicScript = antibody.getPropertyAssignments().get(0).getPlugin();
+        assertNotNull(dynamicScript);
+        assertEquals(dynamicScript.getName().toUpperCase(), "$NAME.DYNAMIC");
+        assertEquals(dynamicScript.getScript(), TestUtils.getDynamicScript());
+        assertEquals(dynamicScript.getPluginType(), PluginType.DYNAMIC_PROPERTY);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithPropertyHavingValidationScript() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, TestUtils.getValidationPluginMap(),
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_WITH_VALIDATION_SCRIPT)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        Plugin validationScript = antibody.getValidationPlugin();
+        assertNotNull(validationScript);
+        assertEquals(validationScript.getName().toUpperCase(), "ANTIBODY.VALID");
+        assertEquals(validationScript.getScript(), TestUtils.getValidationScript());
+        assertEquals(validationScript.getPluginType(), PluginType.ENTITY_VALIDATION);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithVocabularyInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_WITH_VOCABULARY)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        PropertyAssignment propertyAssignment = antibody.getPropertyAssignments().get(0);
+        assertNotNull(propertyAssignment);
+        assertEquals(propertyAssignment.getPropertyType().getVocabulary().getCode(), "DETECTION");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithVocabularyOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARY_DETECTION)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_WITH_VOCABULARY_ON_SERVER)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "ANTIBODY");
+        // THEN
+        PropertyAssignment propertyAssignment = antibody.getPropertyAssignments().get(0);
+        assertNotNull(propertyAssignment);
+        assertEquals(propertyAssignment.getPropertyType().getVocabulary().getCode(), "DETECTION");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSampleTypesWithAutoGeneratedCodeAttribute() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPES_WITH_AUTO_GENERATED_CODES)));
+        // WHEN
+        SampleType antibody = TestUtils.getSampleType(v3api, sessionToken, "SECONDBODY");
+        // THEN
+        assertTrue(antibody.isAutoGeneratedCode());
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoSampleCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPE_NO_CODE)));
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSamplesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSamplesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..f83fb7839c5e85bc3e832ed6d54b4e3ee3802752
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSamplesTest.java
@@ -0,0 +1,313 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportSamplesTest extends AbstractImportTest
+{
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String SAMPLES_XLS = "samples/all_in.xls";
+
+    private static final String SAMPLES_SPACE_ELSEWHERE = "samples/space_elsewhere.xls";
+
+    private static final String SAMPLES_SAMPLE_TYPE_ELSWHERE = "samples/sample_type_elsewhere.xls";
+
+    private static final String SAMPLES_SPACE_PROJECT_EXPERIMENT_ELSEWHERE = "samples/space_project_experiment_elsewhere.xls";
+
+    private static final String SPACE = "samples/space.xls";
+
+    private static final String SAMPLE_TYPE = "samples/sample_type.xls";
+
+    private static final String VOCABULARY_TYPE = "samples/vocab_type.xls";
+
+    private static final String CHILD_AS_CODE = "samples/child_as_code.xls";
+
+    private static final String CHILD_AS_DOLLARTAG = "samples/child_as_dollartag.xls";
+
+    private static final String PARENT_AS_CODE = "samples/parent_as_code.xls";
+
+    private static final String PARENT_AS_DOLLARTAG = "samples/parent_as_dollartag.xls";
+
+    private static final String MANDATORY_FIELD_MISSING = "samples/mandatory_field_missing.xls";
+
+    private static final String NON_MANDATORY_FIELD_MISSING = "samples/non_mandatory_field_missing.xls";
+
+    private static final String AUTO_GENERATED_SAMPLE_LEVEL = "samples/with_auto_generated_code_sample_level.xls";
+
+    private static final String AUTO_GENERATED_SAMPLE_TYPE_LEVEL = "samples/with_auto_generated_code_sampletype_level.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportSamplesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportSamplesTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_XLS)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "AAA", "TEST_SPACE");
+        // THEN
+        assertEquals(sample.getCode(), "AAA");
+        assertEquals(sample.getProject(), null);
+        assertEquals(sample.getExperiment().getCode(), "TEST_EXPERIMENT2");
+        assertEquals(sample.getSpace().getCode(), "TEST_SPACE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedSecondSample() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_XLS)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertEquals(sample.getCode(), "VVV");
+        assertEquals(sample.getProject(), null);
+        assertEquals(sample.getExperiment().getCode(), "TEST_EXPERIMENT");
+        assertEquals(sample.getSpace().getCode(), "TEST_SPACE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedThirdSample() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_XLS)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "S1", "TEST_SPACE");
+        // THEN
+        assertEquals(sample.getCode(), "S1");
+        assertEquals(sample.getProject(), null);
+        assertEquals(sample.getExperiment().getCode(), "TEST_EXPERIMENT");
+        assertEquals(sample.getSpace().getCode(), "TEST_SPACE");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedWhenSpaceOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SPACE_ELSEWHERE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedWhenSpaceInSeparateXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SPACE_ELSEWHERE)),
+                Paths.get(FilenameUtils.concat(FILES_DIR, SPACE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfSpaceDoesntExist() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SPACE_ELSEWHERE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedWhenSampleTypeOnServer() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARY_TYPE)),
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPE)));
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SAMPLE_TYPE_ELSWHERE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesAreCreatedWhenSampleTypeInSeparateXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SAMPLE_TYPE_ELSWHERE)),
+                Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLE_TYPE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesChildrenAreAssignedWhenAddressedByCodeInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, CHILD_AS_CODE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getChildren().size(), 1);
+        assertEquals(sample.getChildren().get(0).getCode(), "AAA");
+        assertEquals(sample.getChildren().get(0).getSpace().getCode(), "TEST_SPACE");
+        assertEquals(sample.getChildren().get(0).getExperiment().getCode(), "TEST_EXPERIMENT2");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesParentsAreAssignedWhenAddressedByCodeInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, PARENT_AS_CODE)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getParents().size(), 1);
+        assertEquals(sample.getParents().get(0).getCode(), "AAA");
+        assertEquals(sample.getParents().get(0).getSpace().getCode(), "TEST_SPACE");
+        assertEquals(sample.getParents().get(0).getExperiment().getCode(), "TEST_EXPERIMENT2");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesChildrenAreAssignedWhenAddressedByDollartagInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, CHILD_AS_DOLLARTAG)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getChildren().size(), 1);
+        assertEquals(sample.getChildren().get(0).getCode(), "AAA");
+        assertEquals(sample.getChildren().get(0).getSpace().getCode(), "TEST_SPACE");
+        assertEquals(sample.getChildren().get(0).getExperiment().getCode(), "TEST_EXPERIMENT2");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testSamplesParentsAreAssignedWhenAddressedByDollartagInXls() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, PARENT_AS_DOLLARTAG)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "VVV", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getParents().size(), 1);
+        assertEquals(sample.getParents().get(0).getCode(), "AAA");
+        assertEquals(sample.getParents().get(0).getSpace().getCode(), "TEST_SPACE");
+        assertEquals(sample.getParents().get(0).getExperiment().getCode(), "TEST_EXPERIMENT2");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testCreatesSampleWithNonMandatoryFieldsMissing() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, NON_MANDATORY_FIELD_MISSING)));
+        // WHEN
+        Sample sample = TestUtils.getSample(v3api, sessionToken, "AAA", "TEST_SPACE");
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getProperties().get("FOR_WHAT"), null);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testCreatesSampleWithAutogeneratedCodeWhenOnPerSampleLevel() throws IOException
+    {
+        // GIVEN
+        String result = TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, AUTO_GENERATED_SAMPLE_LEVEL)));
+        String permId = TestUtils.extractSamplePermIdFromResults(result);
+        // WHEN
+        Sample sample = TestUtils.getSampleByPermId(v3api, sessionToken, permId);
+        // THEN
+        assertNotNull(sample.getCode());
+        assertEquals(sample.getType().getCode(), "ANTIBODY");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testCreatesSampleWithAutogeneratedCodeWhenOnSampleTypeLevel() throws IOException
+    {
+        // GIVEN
+        String result = TestUtils.createFrom(v3api, sessionToken,
+                Paths.get(FilenameUtils.concat(FILES_DIR, AUTO_GENERATED_SAMPLE_TYPE_LEVEL)));
+        String permId = TestUtils.extractSamplePermIdFromResults(result);
+        // WHEN
+        Sample sample = TestUtils.getSampleByPermId(v3api, sessionToken, permId);
+        // THEN
+        assertNotNull(sample);
+        assertEquals(sample.getType().getCode(), "ANTIBODY");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfSamplesSpaceProjectDoesntExist() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SAMPLES_SPACE_PROJECT_EXPERIMENT_ELSEWHERE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfMandatoryPropertyIsMissing() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, MANDATORY_FIELD_MISSING)));
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSpacesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSpacesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..c76bf95b2505429d0711af6453ffebf7dbdd9fc8
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportSpacesTest.java
@@ -0,0 +1,102 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportSpacesTest extends AbstractImportTest
+{
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static final String SPACES_XLS = "spaces/normal_spaces.xls";
+
+    private static final String SPACES_NO_CODE = "spaces/no_code.xls";
+
+    private static final String SPACES_NO_DESCRIPTION = "spaces/no_desc.xls";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportSpacesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportSpacesTest.class.getSimpleName().length()) + "/test_files/";
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalSpacesAreCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACES_XLS)));
+        // WHEN
+        Space rawData = TestUtils.getSpace(v3api, sessionToken, "TEST_SPACE");
+        // THEN
+        assertEquals(rawData.getCode(), "TEST_SPACE");
+        assertEquals(rawData.getDescription(), "TEST");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalSpacesAreCreatedSecondSpace() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACES_XLS)));
+        // WHEN
+        Space space = TestUtils.getSpace(v3api, sessionToken, "TEST_SPACE2");
+        // THEN
+        assertEquals(space.getCode(), "TEST_SPACE2");
+        assertEquals(space.getDescription(), "TEST desc");
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoSpaceCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACES_NO_CODE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void shouldCreateSpaceWhenNoDescription() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, SPACES_NO_DESCRIPTION)));
+        // WHEN
+        Space space = TestUtils.getSpace(v3api, sessionToken, "TEST_SPACE");
+        // THEN
+        assertEquals(space.getCode(), "TEST_SPACE");
+        assertEquals(space.getDescription(), null);
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportVocabularyTypesTest.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportVocabularyTypesTest.java
new file mode 100644
index 0000000000000000000000000000000000000000..4a8f9088f44b3de91fbf0614bb0d1f088b6556d3
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/ImportVocabularyTypesTest.java
@@ -0,0 +1,205 @@
+/*
+ * Copyright 2015 ETH Zuerich, SIS
+ *
+ * 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.plugin.excelimport;
+
+import static org.testng.Assert.assertEquals;
+import static org.testng.Assert.assertNotNull;
+import static org.testng.Assert.assertNull;
+
+import java.io.IOException;
+import java.nio.file.Paths;
+import java.util.List;
+
+import org.apache.commons.io.FilenameUtils;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.test.annotation.DirtiesContext;
+import org.springframework.test.annotation.Rollback;
+import org.springframework.test.context.ContextConfiguration;
+import org.springframework.transaction.annotation.Transactional;
+import org.testng.annotations.BeforeClass;
+import org.testng.annotations.BeforeMethod;
+import org.testng.annotations.Test;
+
+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.server.asapi.v3.IApplicationServerInternalApi;
+import ch.systemsx.cisd.common.exceptions.UserFailureException;
+
+@ContextConfiguration(locations = "classpath:applicationContext.xml")
+@Transactional(transactionManager = "transaction-manager")
+@Rollback
+public class ImportVocabularyTypesTest extends AbstractImportTest
+{
+
+    private static final String VOCABULARIES_TYPES_XLS = "vocabularies/normal_vocab.xls";
+
+    private static final String VOCABULARIES_NO_CODE = "vocabularies/vocab_no_code.xlsx";
+
+    private static final String VOCABULARIES_NO_DESCRIPTION = "vocabularies/vocab_no_desc.xlsx";
+
+    private static final String VOCABULARIES_NO_TERM_CODE = "vocabularies/vocab_no_term_code.xlsx";
+
+    private static final String VOCABULARIES_NO_TERM_DESCRIPTION = "vocabularies/vocab_no_term_desc.xlsx";
+
+    private static final String VOCABULARIES_NO_TERM_LABEL = "vocabularies/vocab_no_term_label.xlsx";
+
+    private static final String VOCABULARIES_NO_TERMS = "vocabularies/vocab_no_term_label.xlsx";
+
+    @Autowired
+    private IApplicationServerInternalApi v3api;
+
+    private static final String TEST_USER = "test";
+
+    private static final String PASSWORD = "password";
+
+    private static String FILES_DIR;
+
+    private String sessionToken;
+
+    @BeforeClass
+    public void setupClass() throws IOException
+    {
+        String f = ImportVocabularyTypesTest.class.getName().replace(".", "/");
+        FILES_DIR = f.substring(0, f.length() - ImportVocabularyTypesTest.class.getSimpleName().length()) + "/test_files/";
+
+    }
+
+    @BeforeMethod
+    public void beforeTest()
+    {
+        sessionToken = v3api.login(TEST_USER, PASSWORD);
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalVocabularyCreationIsCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_TYPES_XLS)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        assertNotNull(detection);
+        assertEquals(detection.getDescription(), "Protein detection system");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalVocabularyHasFirstTermCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_TYPES_XLS)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        VocabularyTerm term = detection.getTerms().get(0);
+        assertEquals(term.getCode(), "HRP");
+        assertEquals(term.getDescription(), "The antibody is conjugated with the horseradish peroxydase");
+        assertEquals(term.getLabel(), "horseradish peroxydase");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalVocabularyCreatedNoExtraVocabulary() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_TYPES_XLS)));
+        // WHEN
+        List<Vocabulary> vocabularies = TestUtils.getAllVocabularies(v3api, sessionToken);
+        // THEN
+        assertEquals(vocabularies.size(), 3); // 2 created + 1 default
+    }
+
+    @Test
+    @DirtiesContext
+    public void testNormalVocabularyHasSecondTermCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_TYPES_XLS)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        VocabularyTerm term = detection.getTerms().get(1);
+        assertEquals(term.getCode(), "TEST_VOC");
+        assertEquals(term.getDescription(), "some focabulary that is used in tests and nothing else");
+        assertEquals(term.getLabel(), "vocabulary for tests");
+    }
+
+    @Test
+    @DirtiesContext
+    public void testVocabularyWithNoTermDescriptionShouldBeCreated() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_TERM_DESCRIPTION)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        assertNotNull(detection);
+        assertNull(detection.getTerms().get(0).getDescription());
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoVocabularyCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_CODE)));
+    }
+
+    @Test(expectedExceptions = UserFailureException.class)
+    public void shouldThrowExceptionIfNoTermCode() throws IOException
+    {
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_TERM_CODE)));
+    }
+
+    @Test
+    @DirtiesContext
+    public void shouldNotThrowExceptionIfNoVocabularyDescription() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_DESCRIPTION)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        assertNotNull(detection);
+        assertNull(detection.getDescription());
+    }
+
+    @Test
+    @DirtiesContext
+    public void shouldNotThrowExceptionIfNoTermLabel() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_TERM_LABEL)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        assertNotNull(detection);
+        assertNull(detection.getTerms().get(0).getLabel());
+    }
+
+    @Test
+    @DirtiesContext
+    public void shouldNotThrowExceptionIfNoTerms() throws IOException
+    {
+        // GIVEN
+        TestUtils.createFrom(v3api, sessionToken, Paths.get(FilenameUtils.concat(FILES_DIR, VOCABULARIES_NO_TERMS)));
+        // WHEN
+        Vocabulary detection = TestUtils.getVocabulary(v3api, sessionToken, "DETECTION");
+        // THEN
+        assertNotNull(detection);
+    }
+
+}
\ No newline at end of file
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/TestUtils.java b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/TestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..cd10c5cf5514ca8d6935c14eb09f88e47b10f905
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/TestUtils.java
@@ -0,0 +1,366 @@
+package ch.ethz.sis.openbis.systemtest.plugin.excelimport;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.stream.Collectors;
+
+import org.apache.commons.io.IOUtils;
+import org.apache.commons.lang3.StringUtils;
+
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSetType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.DataSetTypeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.Experiment;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.ExperimentType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.ExperimentFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.fetchoptions.ExperimentTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.ExperimentIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.id.IExperimentId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.experiment.search.ExperimentTypeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.Project;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.fetchoptions.ProjectFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.project.search.ProjectSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.fetchoptions.PropertyAssignmentFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.fetchoptions.PropertyTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.search.PropertyTypeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.Sample;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.SampleType;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.fetchoptions.SampleTypeFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.ISampleId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SampleIdentifier;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.id.SamplePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.sample.search.SampleTypeSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.service.CustomASServiceExecutionOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.service.id.CustomASServiceCode;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.Space;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.fetchoptions.SpaceFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.space.search.SpaceSearchCriteria;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.Vocabulary;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.fetchoptions.VocabularyFetchOptions;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.id.VocabularyPermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.vocabulary.search.VocabularySearchCriteria;
+import ch.ethz.sis.openbis.generic.server.asapi.v3.IApplicationServerInternalApi;
+
+public class TestUtils
+{
+
+    public static final String XLS_PARAM = "xls";
+
+    public static final String SCRIPTS_PARAM = "scripts";
+
+    public static final String XLS_IMPORT_API = "xls-import-api";
+
+    static Vocabulary getVocabulary(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        VocabularySearchCriteria criteria = new VocabularySearchCriteria();
+        criteria.withId().thatEquals(new VocabularyPermId(code));
+
+        VocabularyFetchOptions fo = new VocabularyFetchOptions();
+        fo.withTerms();
+
+        SearchResult<Vocabulary> result = v3api.searchVocabularies(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static List<Vocabulary> getAllVocabularies(IApplicationServerInternalApi v3api, String sessionToken)
+    {
+        VocabularySearchCriteria criteria = new VocabularySearchCriteria();
+        VocabularyFetchOptions fo = new VocabularyFetchOptions();
+        fo.withTerms();
+
+        SearchResult<Vocabulary> result = v3api.searchVocabularies(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects();
+        } else
+        {
+            return null;
+        }
+    }
+
+    static SampleType getSampleType(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        SampleTypeSearchCriteria criteria = new SampleTypeSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        SampleTypeFetchOptions fo = new SampleTypeFetchOptions();
+        fo.withValidationPlugin().withScript();
+        PropertyAssignmentFetchOptions propCriteria = fo.withPropertyAssignments();
+        propCriteria.withPlugin().withScript();
+        propCriteria.withPropertyType().withVocabulary();
+
+        SearchResult<SampleType> result = v3api.searchSampleTypes(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static ExperimentType getExperimentType(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        ExperimentTypeSearchCriteria criteria = new ExperimentTypeSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        ExperimentTypeFetchOptions fo = new ExperimentTypeFetchOptions();
+        fo.withValidationPlugin().withScript();
+        PropertyAssignmentFetchOptions propCriteria = fo.withPropertyAssignments();
+        propCriteria.withPlugin().withScript();
+        propCriteria.withPropertyType().withVocabulary();
+
+        SearchResult<ExperimentType> result = v3api.searchExperimentTypes(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static DataSetType getDatasetType(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        DataSetTypeSearchCriteria criteria = new DataSetTypeSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        DataSetTypeFetchOptions fo = new DataSetTypeFetchOptions();
+        fo.withValidationPlugin().withScript();
+        PropertyAssignmentFetchOptions propCriteria = fo.withPropertyAssignments();
+        propCriteria.withPlugin().withScript();
+        propCriteria.withPropertyType().withVocabulary();
+
+        SearchResult<DataSetType> result = v3api.searchDataSetTypes(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static PropertyType getPropertyType(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        PropertyTypeSearchCriteria criteria = new PropertyTypeSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        PropertyTypeFetchOptions fo = new PropertyTypeFetchOptions();
+        fo.withVocabulary();
+
+        SearchResult<PropertyType> result = v3api.searchPropertyTypes(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static Space getSpace(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        SpaceSearchCriteria criteria = new SpaceSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        SpaceFetchOptions fo = new SpaceFetchOptions();
+
+        SearchResult<Space> result = v3api.searchSpaces(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static Project getProject(IApplicationServerInternalApi v3api, String sessionToken, String code)
+    {
+        ProjectSearchCriteria criteria = new ProjectSearchCriteria();
+        criteria.withCode().thatEquals(code);
+
+        ProjectFetchOptions fo = new ProjectFetchOptions();
+        fo.withSpace();
+
+        SearchResult<Project> result = v3api.searchProjects(sessionToken, criteria, fo);
+
+        if (result.getObjects().size() > 0)
+        {
+            return result.getObjects().get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static Experiment getExperiment(IApplicationServerInternalApi v3api, String sessionToken, String experimentCode, String projectCode,
+            String spaceCode)
+    {
+        List<IExperimentId> ids = new ArrayList<>();
+        ids.add(new ExperimentIdentifier(spaceCode, projectCode, experimentCode));
+
+        ExperimentFetchOptions fo = new ExperimentFetchOptions();
+        fo.withProject();
+        fo.withProperties();
+        fo.withType();
+
+        List<Experiment> result = v3api.getExperiments(sessionToken, ids, fo).values().stream().collect(Collectors.toList());
+
+        if (result.size() > 0)
+        {
+            return result.get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static Sample getSample(IApplicationServerInternalApi v3api, String sessionToken, String sampleCode, String spaceCode)
+    {
+        List<ISampleId> ids = new ArrayList<>();
+        ids.add(new SampleIdentifier(spaceCode, null, null, sampleCode));
+
+        return getSamples(v3api, sessionToken, ids);
+    }
+
+    static Sample getSampleByPermId(IApplicationServerInternalApi v3api, String sessionToken, String permId)
+    {
+        List<ISampleId> ids = new ArrayList<>();
+        ids.add(new SamplePermId(permId));
+
+        return getSamples(v3api, sessionToken, ids);
+    }
+
+    private static Sample getSamples(IApplicationServerInternalApi v3api, String sessionToken, List<ISampleId> ids)
+    {
+        SampleFetchOptions fo = new SampleFetchOptions();
+        SampleFetchOptions childrenFo = fo.withChildren();
+        childrenFo.withSpace();
+        childrenFo.withExperiment();
+        SampleFetchOptions parentsFo = fo.withParents();
+        parentsFo.withSpace();
+        parentsFo.withExperiment();
+        fo.withExperiment();
+        fo.withProject();
+        fo.withProperties();
+        fo.withSpace();
+        fo.withType();
+
+        List<Sample> result = v3api.getSamples(sessionToken, ids, fo).values().stream().collect(Collectors.toList());
+
+        if (result.size() > 0)
+        {
+            return result.get(0);
+        } else
+        {
+            return null;
+        }
+    }
+
+    static String createFrom(IApplicationServerInternalApi v3api, String sessionToken, Path... xls_paths) throws IOException
+    {
+        List<byte[]> excels = new ArrayList<>();
+        for (Path xls_path : xls_paths)
+        {
+            byte[] xls = readData(xls_path);
+            excels.add(xls);
+        }
+        CustomASServiceExecutionOptions options = new CustomASServiceExecutionOptions();
+        options.withParameter(XLS_PARAM, excels);
+        return (String) v3api.executeCustomASService(sessionToken, new CustomASServiceCode(XLS_IMPORT_API), options);
+    }
+
+    static String createFrom(IApplicationServerInternalApi v3api, String sessionToken, Map<String, String> scripts, Path... xls_paths)
+            throws IOException
+    {
+        List<byte[]> excels = new ArrayList<>();
+        for (Path xls_path : xls_paths)
+        {
+            byte[] xls = readData(xls_path);
+            excels.add(xls);
+        }
+        CustomASServiceExecutionOptions options = new CustomASServiceExecutionOptions();
+        options.withParameter(XLS_PARAM, excels);
+        options.withParameter(SCRIPTS_PARAM, scripts);
+        return (String) v3api.executeCustomASService(sessionToken, new CustomASServiceCode(XLS_IMPORT_API), options);
+    }
+
+    static String getValidationScript()
+    {
+        return "def validate(entity, isNew):\n  if isNew:\n    return";
+    }
+
+    static String getDynamicScript()
+    {
+        return "def calculate():\n    return 1";
+    }
+
+    static Map<String, String> getValidationPluginMap()
+    {
+        String dynamicScriptString = getValidationScript();
+        Map<String, String> scriptsMap = new HashMap<>();
+        scriptsMap.put("valid.py", dynamicScriptString);
+
+        return scriptsMap;
+    }
+
+    static Map<String, String> getDynamicPluginMap()
+    {
+        String dynamicScriptString = getDynamicScript();
+        Map<String, String> scriptsMap = new HashMap<>();
+        scriptsMap.put("dynamic/dynamic.py", dynamicScriptString);
+
+        return scriptsMap;
+    }
+
+    static String extractSamplePermIdFromResults(String result)
+    {
+        // Note this will work only if we created single sample!!
+        String permId = result.substring(result.indexOf("CreateSamplesOperationResult") + "CreateSamplesOperationResult".length());
+        permId = StringUtils.strip(permId, "[]");
+        return permId;
+    }
+
+    private static byte[] readData(Path xls_path) throws IOException
+    {
+        String path = xls_path.toString();
+        InputStream resourceAsStream = TestUtils.class.getClassLoader().getResourceAsStream(path);
+        try
+        {
+            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
+            IOUtils.copy(resourceAsStream, byteArrayOutputStream);
+            return byteArrayOutputStream.toByteArray();
+        } finally
+        {
+            if (resourceAsStream != null)
+            {
+                resourceAsStream.close();
+            }
+        }
+    }
+
+}
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..d54b992af7d5ef3497b591b71b0a937aeecee4c6
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_properties.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_properties.xls
new file mode 100644
index 0000000000000000000000000000000000000000..5a4648215981dec891c3791194051c2e247ddbfd
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/no_properties.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/normal_dataset.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/normal_dataset.xls
new file mode 100644
index 0000000000000000000000000000000000000000..d72039c8ae394e9954c07af64559e7d34a812961
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/normal_dataset.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/with_validation.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/with_validation.xls
new file mode 100644
index 0000000000000000000000000000000000000000..cdee2cb18599a074ff8c34a4666c7a46027d080c
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/dataset_types/with_validation.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..bcae94a211270a70536fbeb0c0128e35813f4d76
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/normal_experiment.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/normal_experiment.xls
new file mode 100644
index 0000000000000000000000000000000000000000..d3c3dda61bd16fa12d7ab9bbaf65cba6ba70caa2
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/normal_experiment.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/with_validation_script.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/with_validation_script.xls
new file mode 100644
index 0000000000000000000000000000000000000000..20daeadf5af7c7a35d34185b165cb95a6decfc23
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiment_types/with_validation_script.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..fa502e8210ac48b660a275973dd373cabdbc351a
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_inside.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_inside.xls
new file mode 100644
index 0000000000000000000000000000000000000000..48fe7da35a0f258b912a5449d61a69dab46ebc64
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/all_inside.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..79d7b595f514ef121fb09f982c5e9ec1f50efe05
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..5b5939c6d0491056bdd0f551c2df7bbade805f1c
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/experiment_type_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..e768de099fb1028c3c631e60384f6a6037d2075d
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_non_mandatory_property.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_non_mandatory_property.xls
new file mode 100644
index 0000000000000000000000000000000000000000..f6f9c73a5872c901a041afe139ca6097153a81e8
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_non_mandatory_property.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_project.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_project.xls
new file mode 100644
index 0000000000000000000000000000000000000000..b10a360b48af59ead2b011f4697a55e325679f64
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/no_project.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/project.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/project.xls
new file mode 100644
index 0000000000000000000000000000000000000000..22fe9892d7d761ca40f1007c3ad4d257c1eedf6e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/project.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space.xls
new file mode 100644
index 0000000000000000000000000000000000000000..f38abaf801838e24b49534c7e95ec11d69a5733d
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_and_project_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_and_project_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..662154538b1d733036d6d7ae60cc5e6948175f7a
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_and_project_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..002041a89a52c99a4b3334778eca0e2e715a317d
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/space_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/type_and_space_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/type_and_space_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..ca53bd70919b60029dcf4876ff0a65571c3f9224
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/type_and_space_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property.xls
new file mode 100644
index 0000000000000000000000000000000000000000..bb9a38e731caee28ea3164d7735da5a8c3aee1fc
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property_missing.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property_missing.xls
new file mode 100644
index 0000000000000000000000000000000000000000..2232c73fd30a0d85ffb21a4146f818f333fa6989
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_mandatory_property_missing.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels.xls
new file mode 100644
index 0000000000000000000000000000000000000000..2cd522d4a96d4eda75587ba4878e561e26fe5085
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels_type_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels_type_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..05a162bffb0ed5d4a768e0414d1b5c7c64a3c860
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/experiments/with_properties_as_labels_type_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/dynamic/dynamic.py b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/dynamic/dynamic.py
new file mode 100644
index 0000000000000000000000000000000000000000..187583711b0b2d81f1ad5525763cae8d23561239
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/dynamic/dynamic.py
@@ -0,0 +1,2 @@
+def calculate():
+    return 1
\ No newline at end of file
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/valid.py b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/valid.py
new file mode 100644
index 0000000000000000000000000000000000000000..d87950f600d11b50b96dcedef36fe8f36971140c
--- /dev/null
+++ b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/scripts/valid.py
@@ -0,0 +1,3 @@
+def validate(entity, isNew):
+  if isNew:
+    return
\ No newline at end of file
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/types.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/types.xls
new file mode 100644
index 0000000000000000000000000000000000000000..c29c0e6d2f1c6586b770f3e6e2d5291784c9bbb6
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/full/types.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..40565df30dd0a1cbab6b9fd1bf8e98cc37d98713
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_desc.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_desc.xls
new file mode 100644
index 0000000000000000000000000000000000000000..256aff470a2c0e67bf6e8ca7c0574b57bfd9384a
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_desc.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_space.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_space.xls
new file mode 100644
index 0000000000000000000000000000000000000000..be1a6f5b673089c4d40f17c3f79ed055202e3736
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/no_space.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/spaces.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/spaces.xls
new file mode 100644
index 0000000000000000000000000000000000000000..ee521c4efcf08b1f3263ffbf239d07a1f784ab2b
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/spaces.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces.xls
new file mode 100644
index 0000000000000000000000000000000000000000..124040d0a40c49d88cec4de77dab2616c88e355f
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces_on_server.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces_on_server.xls
new file mode 100644
index 0000000000000000000000000000000000000000..c372754c23f24f7491ca9e20132dd151d05a881f
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/projects/with_spaces_on_server.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..0495c967c5583cdd003fa7db0d9e03bd3ac53660
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_data_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_data_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..ea8c86ae63ab1cd00c3925c7ad483bad33f98918
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_data_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_desc.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_desc.xls
new file mode 100644
index 0000000000000000000000000000000000000000..a93f2d1d00f5c469c84e476b82264e5f35b7df95
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_desc.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_label.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_label.xls
new file mode 100644
index 0000000000000000000000000000000000000000..2920993c13829a6ef699a562d4d1df250ae36226
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_label.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_vocab_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_vocab_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..30f6effc706cf7eaa62952b3477469eedfda1a36
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/no_vocab_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/normal_property_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/normal_property_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..b60b0d1af6c8bcc493e04f7ab025c2f30bcba1b4
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/normal_property_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabcode_when_not_vocabtype.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabcode_when_not_vocabtype.xls
new file mode 100644
index 0000000000000000000000000000000000000000..07b06775fb363a9c78ca6845927f0ce4d1baf16e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabcode_when_not_vocabtype.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabulary_detection.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabulary_detection.xls
new file mode 100644
index 0000000000000000000000000000000000000000..9dbed1010de4ae51769dcd5dc3f427bbcda4cc50
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/vocabulary_detection.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab.xls
new file mode 100644
index 0000000000000000000000000000000000000000..c11888fc27960ed5f93d193e2d8e5c4e50e398e7
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab_on_server.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab_on_server.xls
new file mode 100644
index 0000000000000000000000000000000000000000..97378724a33e3c75a66a7e7b98343673fdd57991
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/property_types/with_vocab_on_server.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..a20c2669d8420cc4f14dd1e7f570d97344fd8a0c
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples.xls
new file mode 100644
index 0000000000000000000000000000000000000000..26f1ce1b3d41182ad5ee0b16def5a35afd8ced4a
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples_v2.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples_v2.xls
new file mode 100644
index 0000000000000000000000000000000000000000..9ca2cccef1e90d0d169369dcb19e04e8a9584685
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/normal_samples_v2.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/vocabulary_detection.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/vocabulary_detection.xls
new file mode 100644
index 0000000000000000000000000000000000000000..778cead50ffb0439af049dfeed92324f4c52acd0
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/vocabulary_detection.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_auto_generated_codes.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_auto_generated_codes.xls
new file mode 100644
index 0000000000000000000000000000000000000000..53fa161043a304cc4b506dadc5cfdf6d61d88946
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_auto_generated_codes.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_dynamic_script.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_dynamic_script.xls
new file mode 100644
index 0000000000000000000000000000000000000000..f6dbb88115880f4ff23e23dec6bb325db9b97573
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_dynamic_script.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_validation_script.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_validation_script.xls
new file mode 100644
index 0000000000000000000000000000000000000000..745fab798e0d9a94093918215080479a6a05e4ac
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_validation_script.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_in_xls.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_in_xls.xls
new file mode 100644
index 0000000000000000000000000000000000000000..513d56b4c83351e59f7a8de2a68cd54e80d1440e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_in_xls.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_on_server.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_on_server.xls
new file mode 100644
index 0000000000000000000000000000000000000000..e8c32928586b43ab4803e601408e4eb45812fb5e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/sample_types/with_vocabulary_on_server.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..4749694789683c3bc418946c887fd6671f9aa1f1
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_in.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_in.xls
new file mode 100644
index 0000000000000000000000000000000000000000..dd6d161dee473e898ceb5a6e6bf0c54127cb3cb9
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/all_in.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..86310e82f98edb136517f67e5059f4d04eefe25c
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_dollartag.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_dollartag.xls
new file mode 100644
index 0000000000000000000000000000000000000000..bf0460d53939ddbbf2977398336f22fee53188d3
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/child_as_dollartag.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment.xls
new file mode 100644
index 0000000000000000000000000000000000000000..c9ab2810593b69711331702f3e2c081581b8db4e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..90d5b40a5dc26d4c7861e4027493d63056f0d1c7
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/experiment_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/mandatory_field_missing.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/mandatory_field_missing.xls
new file mode 100644
index 0000000000000000000000000000000000000000..68c815bd31b7cebaf063f6edba675c10089e2a3f
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/mandatory_field_missing.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/non_mandatory_field_missing.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/non_mandatory_field_missing.xls
new file mode 100644
index 0000000000000000000000000000000000000000..b4304796f0a7f970e34b90257498586ea06cd4c5
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/non_mandatory_field_missing.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..df1496108946d62bc7cf40f013ed1202e612487e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_dollartag.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_dollartag.xls
new file mode 100644
index 0000000000000000000000000000000000000000..84eddade405ea5e2730193575dcad653fbe9aa8f
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/parent_as_dollartag.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/project.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/project.xls
new file mode 100644
index 0000000000000000000000000000000000000000..8a075fdf2f6f5907ebc85b2e42fadd5d2c89f402
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/project.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..191b054327cd829c1b497f5492c02fbcb6748811
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..cae6691312385b98caa13d04e59a18f8ef0b5350
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/sample_type_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space.xls
new file mode 100644
index 0000000000000000000000000000000000000000..7184089ea5a51ad491f02f3940e0bb33c3f2eceb
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..684cfcf3e39a832f8176340492c62e97ee867d78
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_project_experiment_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_project_experiment_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..174b541bb4a23cf4dac1dc2a987577974f2216e6
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/space_project_experiment_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type.xls
new file mode 100644
index 0000000000000000000000000000000000000000..2798f91d6081a200fa1521726e8f466b37d23e26
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type_elsewhere.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type_elsewhere.xls
new file mode 100644
index 0000000000000000000000000000000000000000..4deec4455c64c7895f2864a6667ca3199b40a326
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/vocab_type_elsewhere.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..56c21ac4eb5641ff8eaad5dd6db6e88e0714c1bb
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code_but_with$.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code_but_with$.xls
new file mode 100644
index 0000000000000000000000000000000000000000..744ae3ea4b84432acbd15f1a7e5aadac5c906a11
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_ambiguous_code_but_with$.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sample_level.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sample_level.xls
new file mode 100644
index 0000000000000000000000000000000000000000..abf26b6a42a6ed8d54b035b15c6a17124e701d63
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sample_level.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sampletype_level.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sampletype_level.xls
new file mode 100644
index 0000000000000000000000000000000000000000..4cbb931ed0b6e5e9d53c8b590a5d7a617ca72640
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_auto_generated_code_sampletype_level.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_child.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_child.xls
new file mode 100644
index 0000000000000000000000000000000000000000..71c45c3e02b29a2cab48e9234eaad90ab5fe20b6
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_child.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_parent.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_parent.xls
new file mode 100644
index 0000000000000000000000000000000000000000..a63d1b6c4e297640462f3c241d2bd900843f84b2
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/samples/with_no_such_parent.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_code.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_code.xls
new file mode 100644
index 0000000000000000000000000000000000000000..66b359e91807e8236803f18014f10d6065b2a41f
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_code.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_desc.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_desc.xls
new file mode 100644
index 0000000000000000000000000000000000000000..bd91bf15e2faa913d5ba3585a2e2038795e577b9
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/no_desc.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/normal_spaces.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/normal_spaces.xls
new file mode 100644
index 0000000000000000000000000000000000000000..13967a518d6a7491eac13ef97c2e23f603e7a738
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/spaces/normal_spaces.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/normal_vocab.xls b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/normal_vocab.xls
new file mode 100644
index 0000000000000000000000000000000000000000..1012b0c10cbb0b0a2126c01bc9e51634840bb300
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/normal_vocab.xls differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_code.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_code.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..327e9952a7cc9b025bb491abb3faf88c9b28fcc2
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_code.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_desc.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_desc.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..63cbf942b4efa579282c864e0ad1ae76b120c050
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_desc.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_code.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_code.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..78d4d0ce9a6fee95cc7686ef661d0627926ddd8b
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_code.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_desc.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_desc.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..2237ea8613c1a7e1a61268704b3ad320aa40cc63
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_desc.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_label.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_label.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..db47fe26e67e19819b649ee6b27cdfc9b91c2e00
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_term_label.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_terms.xlsx b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_terms.xlsx
new file mode 100644
index 0000000000000000000000000000000000000000..0fa1b978f1ca7eae53c5d2108de04333e6d3dc3e
Binary files /dev/null and b/openbis_standard_technologies/sourceTest/java/ch/ethz/sis/openbis/systemtest/plugin/excelimport/test_files/vocabularies/vocab_no_terms.xlsx differ
diff --git a/openbis_standard_technologies/sourceTest/java/tests.xml b/openbis_standard_technologies/sourceTest/java/tests.xml
index 63c73169b0852cdd4fb77366cccf07c26ba3b6e0..a198fbcfdb1da92cb07df9f7fcc71c7bf4b604f4 100644
--- a/openbis_standard_technologies/sourceTest/java/tests.xml
+++ b/openbis_standard_technologies/sourceTest/java/tests.xml
@@ -1,11 +1,12 @@
-<suite name="All" verbose="2" >
-  <test name="All" annotations="JDK">
-    <groups>
-      <run>
-        <exclude name="broken" />
-      </run>
-    </groups>
-    <packages>
-   </packages>
- </test>
+<suite name="All" verbose="2">
+	<test name="All" annotations="JDK">
+		<groups>
+			<run>
+				<exclude name="broken" />
+			</run>
+		</groups>
+		<packages>
+			<package name="ch.ethz.sis.openbis.systemtest.plugin.*" />
+		</packages>
+	</test>
 </suite>