diff --git a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/DownloadFileTest.java b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/DownloadFileTest.java
index e28f931d2ead52959d2ae2736190c94b0a1977f6..a1c857980dd626b5819e2f50dea3ab280c774e06 100644
--- a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/DownloadFileTest.java
+++ b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/DownloadFileTest.java
@@ -24,6 +24,9 @@ import ch.ethz.sis.filetransfer.DownloadStatus;
 import ch.ethz.sis.filetransfer.IDownloadItemId;
 import ch.ethz.sis.filetransfer.IDownloadListener;
 import ch.ethz.sis.filetransfer.ILogger;
+import ch.ethz.sis.filetransfer.IRetryAction;
+import ch.ethz.sis.filetransfer.IRetryProvider;
+import ch.ethz.sis.filetransfer.IRetryProviderFactory;
 import ch.ethz.sis.filetransfer.LogLevel;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.DataSet;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.fetchoptions.DataSetFetchOptions;
@@ -41,7 +44,6 @@ import ch.ethz.sis.openbis.generic.dssapi.v3.fastdownload.FastDownloader;
 import ch.systemsx.cisd.common.collection.SimpleComparator;
 import ch.systemsx.cisd.common.exceptions.ExceptionUtils;
 import ch.systemsx.cisd.common.filesystem.FileUtilities;
-import ch.systemsx.cisd.openbis.dss.generic.shared.ServiceProvider;
 
 public class DownloadFileTest extends AbstractFileTest
 {
@@ -167,32 +169,49 @@ public class DownloadFileTest extends AbstractFileTest
     {
         // Given
         String sessionToken = as.login(TEST_USER, PASSWORD);
-        DataSetFilePermId folder = new DataSetFilePermId(new DataSetPermId(dataSetCode), getPath("subdir1"));
-        List<DataSetFilePermId> fileIds = Arrays.asList(folder);
+        DataSetFilePermId file1 = new DataSetFilePermId(new DataSetPermId(dataSetCode), getPath("subdir1/file3.txt"));
+        DataSetFilePermId file2 = new DataSetFilePermId(new DataSetPermId(dataSetCode), getPath("subdir1/file4.txt"));
+        List<DataSetFilePermId> fileIds = Arrays.asList(file1, file2);
         FastDownloadSessionOptions options = new FastDownloadSessionOptions().withWishedNumberOfStreams(1);
         List<Exception> exceptions = new ArrayList<>();
         IDownloadListener listener = new DownloadListenerAdapter()
             {
-
                 @Override
-                public void onChunkDownloaded(int chunkSequenceNumber)
+                public void onDownloadFailed(Collection<Exception> e)
                 {
-                    ServiceProvider.getDataStoreService().cleanupSession(sessionToken);
+                    exceptions.addAll(e);
                 }
-
+            };
+        IRetryProviderFactory retryProviderFactory = new IRetryProviderFactory()
+            {
                 @Override
-                public void onDownloadFailed(Collection<Exception> e)
+                public IRetryProvider createRetryProvider(ILogger logger)
                 {
-                    exceptions.addAll(e);
+                    return new IRetryProvider()
+                        {
+                            int counter = 3;
+                            @Override
+                            public <T> T executeWithRetry(IRetryAction<T> action) throws DownloadException
+                            {
+                                T result = action.execute();
+                                if (counter-- > 0)
+                                {
+                                    return result;
+                                }
+                                throw new DownloadException("Download failed!!!!", false);
+                            }
+                        };
                 }
             };
 
         // When
         FastDownloadSession downloadSession = dss.createFastDownloadSession(sessionToken, fileIds, options);
-        FastDownloadResult downloadResult = new FastDownloader(downloadSession).withListener(listener).downloadTo(target);
+        FastDownloadResult downloadResult = new FastDownloader(downloadSession).withListener(listener)
+                .withRetryProviderFactory(retryProviderFactory ).downloadTo(target);
 
         // Then
         assertEquals(DownloadStatus.FAILED, downloadResult.getStatus());
+        assertEquals("[ch.ethz.sis.filetransfer.DownloadException: Download failed!!!!]", exceptions.toString());
     }
 
     @Test
diff --git a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
index f128992aa931fcfab36f3991f29dc8915094fdb9..ca346b3fec7d92fba53e8685e2dfec5dff3f49ac 100644
--- a/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
+++ b/datastore_server/sourceTest/java/ch/ethz/sis/openbis/generic/dss/systemtest/api/v3/SearchFileTest.java
@@ -49,6 +49,40 @@ public class SearchFileTest extends AbstractFileTest
         }
     }
 
+    @Test
+    public void withAndOperator() throws Exception
+    {
+        // Given
+        DataSetFileSearchCriteria sc = new DataSetFileSearchCriteria();
+        sc.withAndOperator();
+        sc.withDataSet().withPermId().thatEquals(dataSetCode);
+        sc.withDataSet().withPermId().thatEquals("blabla");
+        String sessionToken = gis.tryToAuthenticateForAllServices(TEST_USER, PASSWORD);
+
+        // When
+        List<DataSetFile> searchFiles = dss.searchFiles(sessionToken, sc, new DataSetFileFetchOptions()).getObjects();
+
+        // Then
+        assertEquals(0, searchFiles.size());
+    }
+
+    @Test
+    public void withOrOperator() throws Exception
+    {
+        // Given
+        DataSetFileSearchCriteria sc = new DataSetFileSearchCriteria();
+        sc.withOrOperator();
+        sc.withDataSet().withPermId().thatEquals(dataSetCode);
+        sc.withDataSet().withPermId().thatEquals("blabla");
+        String sessionToken = gis.tryToAuthenticateForAllServices(TEST_USER, PASSWORD);
+
+        // When
+        List<DataSetFile> searchFiles = dss.searchFiles(sessionToken, sc, new DataSetFileFetchOptions()).getObjects();
+
+        // Then
+        assertEquals(12, searchFiles.size());
+    }
+
     @Test
     public void testLogging()
     {
diff --git a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
index 312cc4b181e733755dd27cc24ea611058c9f3697..e84de4016b25bae3c41d5c2cc05ff5c269c98cee 100644
--- a/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
+++ b/openbis/source/java/ch/systemsx/cisd/openbis/generic/server/dataaccess/db/HibernateSearchDAO.java
@@ -87,12 +87,17 @@ import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.LuceneQueryB
 import ch.systemsx.cisd.openbis.generic.server.dataaccess.db.search.detailed.DetailedQueryBuilder;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.BasicEntityType;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriteria;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchCriterion;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchField;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchFieldKind;
+import ch.systemsx.cisd.openbis.generic.shared.basic.dto.DetailedSearchSubCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.IAssociationCriteria;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.MatchingEntity;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Person;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.PropertyMatch;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Space;
 import ch.systemsx.cisd.openbis.generic.shared.basic.dto.Span;
+import ch.systemsx.cisd.openbis.generic.shared.dto.AbstractIdAndCodeHolder;
 import ch.systemsx.cisd.openbis.generic.shared.dto.SearchableEntity;
 import ch.systemsx.cisd.openbis.generic.shared.dto.hibernate.SearchFieldConstants;
 import ch.systemsx.cisd.openbis.generic.shared.dto.properties.EntityKind;
@@ -106,6 +111,8 @@ import ch.systemsx.cisd.openbis.generic.shared.translator.DtoConverters;
 
 final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernateSearchDAO
 {
+    private static final Pattern VALID_CODE_PATTERN = Pattern.compile("^[^\\s/&]+$", Pattern.CASE_INSENSITIVE);
+
     /**
      * The <code>Logger</code> of this class.
      * <p>
@@ -784,6 +791,10 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
             DetailedSearchCriteria searchCriteria, EntityKind entityKind,
             List<IAssociationCriteria> associations)
     {
+        if (hasInvalidCodes(searchCriteria))
+        {
+            return Collections.emptyList();
+        }
         List<String> fieldNames = DetailedQueryBuilder.getIndexFieldNames(searchCriteria.getCriteria(), DtoConverters.convertEntityKind(entityKind));
 
         Query query = LuceneQueryBuilder.createDetailedSearchQuery(userId, searchCriteria, associations, entityKind, getFieldTypes(fieldNames));
@@ -802,6 +813,32 @@ final class HibernateSearchDAO extends HibernateDaoSupport implements IHibernate
         return entityIds;
     }
 
+    private boolean hasInvalidCodes(DetailedSearchCriteria searchCriteria)
+    {
+        if (searchCriteria != null)
+        {
+            for (DetailedSearchCriterion criterion : searchCriteria.getCriteria())
+            {
+                String value = criterion.getValue();
+                DetailedSearchField field = criterion.getField();
+                DetailedSearchFieldKind kind = field.getKind();
+                if (DetailedSearchFieldKind.ATTRIBUTE.equals(kind) && field.getAttributeCode().equals("CODE") 
+                        && VALID_CODE_PATTERN.matcher(value).matches() == false)
+                {
+                    return true;
+                }
+            }
+            for (DetailedSearchSubCriteria subCriteria : searchCriteria.getSubCriterias())
+            {
+                if (hasInvalidCodes(subCriteria.getCriteria()))
+                {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
     //
     // Helpers
     //
diff --git a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchPropertyAssignmentTest.java b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchPropertyAssignmentTest.java
index 286e6010596d96d5286c1454cdf58da0e415825f..841d2e743c21cf68c6aa78f0380bd815d0227188 100644
--- a/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchPropertyAssignmentTest.java
+++ b/openbis/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/SearchPropertyAssignmentTest.java
@@ -16,6 +16,8 @@
 
 package ch.ethz.sis.openbis.systemtest.asapi.v3;
 
+import static org.testng.Assert.assertEquals;
+
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -26,6 +28,7 @@ import org.testng.annotations.Test;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchResult;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.EntityKind;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.EntityTypePermId;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.search.EntityTypeSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.PropertyAssignment;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.fetchoptions.PropertyAssignmentFetchOptions;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.property.id.PropertyAssignmentPermId;
@@ -168,8 +171,11 @@ public class SearchPropertyAssignmentTest extends AbstractTest
 
         PropertyAssignmentSearchCriteria criteria = new PropertyAssignmentSearchCriteria();
         criteria.withAndOperator();
-        criteria.withEntityType().withId().thatEquals(new EntityTypePermId("CELL_PLATE", EntityKind.SAMPLE));
-        criteria.withPropertyType().withId().thatEquals(new PropertyTypePermId("BACTERIUM"));
+        EntityTypeSearchCriteria entityTypeSearchCriteria = criteria.withEntityType();
+        entityTypeSearchCriteria.withOrOperator();
+        entityTypeSearchCriteria.withCode().thatStartsWith("VALI");
+        entityTypeSearchCriteria.withCode().thatEndsWith("PLATE");
+        criteria.withPropertyType().withId().thatEquals(new PropertyTypePermId("COMMENT"));
 
         SearchResult<PropertyAssignment> searchResult =
                 v3api.searchPropertyAssignments(sessionToken, criteria, fo);
@@ -178,9 +184,11 @@ public class SearchPropertyAssignmentTest extends AbstractTest
 
         for (PropertyAssignment propertyAssignment : propertyAssignments)
         {
-            Assert.assertTrue(propertyAssignment.getEntityType().getCode().equals("CELL_PLATE")
-                    && propertyAssignment.getPropertyType().getCode().equals("BACTERIUM"));
+            Assert.assertTrue((propertyAssignment.getEntityType().getCode().startsWith("VALI")
+                    || propertyAssignment.getEntityType().getCode().endsWith("PLATE"))
+                    && propertyAssignment.getPropertyType().getCode().equals("COMMENT"));
         }
+        assertEquals(propertyAssignments.size(), 3);
     }
 
     @Test
@@ -194,9 +202,13 @@ public class SearchPropertyAssignmentTest extends AbstractTest
 
         PropertyAssignmentSearchCriteria criteria = new PropertyAssignmentSearchCriteria();
         criteria.withOrOperator();
-        criteria.withEntityType().withId().thatEquals(new EntityTypePermId("CELL_PLATE", EntityKind.SAMPLE));
+        EntityTypeSearchCriteria entityTypeSearchCriteria = criteria.withEntityType();
+        entityTypeSearchCriteria.withAndOperator();
+        entityTypeSearchCriteria.withCode().thatStartsWith("CELL");
+        entityTypeSearchCriteria.withCode().thatEndsWith("PLATE");
         criteria.withPropertyType().withId().thatEquals(new PropertyTypePermId("BACTERIUM"));
 
+
         SearchResult<PropertyAssignment> searchResult =
                 v3api.searchPropertyAssignments(sessionToken, criteria, fo);
 
@@ -207,6 +219,7 @@ public class SearchPropertyAssignmentTest extends AbstractTest
             Assert.assertTrue(propertyAssignment.getEntityType().getCode().equals("CELL_PLATE")
                     || propertyAssignment.getPropertyType().getCode().equals("BACTERIUM"));
         }
+        assertEquals(propertyAssignments.size(), 11);
     }
 
     @Test
diff --git a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index f63efd65e6798ff98a8ecbb0acb883bbc6f0a272..5bfdcc2556e52fb882df933c175756a1cfae1ae8 100644
--- a/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/openbis/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -844,7 +844,7 @@ public class GeneralInformationServiceTest extends SystemTestCase
     {
         SearchCriteria searchCriteria = new SearchCriteria();
         searchCriteria.addMatchClause(MatchClause.createAttributeMatch(MatchClauseAttribute.CODE,
-                "MP002-1 "));
+                "MP002-1"));
 
         EnumSet<SampleFetchOption> fetchOptions =
                 EnumSet.of(SampleFetchOption.PROPERTIES, SampleFetchOption.DESCENDANTS);
diff --git a/openbis_api/build.gradle b/openbis_api/build.gradle
index 385a8e6b0abd1e93289b8eaef1e8feb35ea8cb70..c3e15e4e3634dbed05895e73d146cc17fb5d79d2 100644
--- a/openbis_api/build.gradle
+++ b/openbis_api/build.gradle
@@ -5,7 +5,7 @@ apply from: '../gradle/javaproject.gradle'
 
 dependencies {
 	compile project(':common'),
-			'sis:sis-file-transfer:19.03.0',
+			'sis:sis-file-transfer:19.03.1',
 			'fasterxml:jackson-core:2.9.7',
 			'fasterxml:jackson-annotations:2.9.7'
 			
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
index 39b83aed275e412b89f46221651006b9b41a0ac6..58894bf1bfa843d402bf4e2ff1e1d8a59fd5f811 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/asapi/v3/dto/entitytype/search/EntityTypeSearchCriteria.java
@@ -20,6 +20,7 @@ import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractObjectSear
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodeSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.CodesSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.entitytype.id.IEntityTypeId;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -46,6 +47,16 @@ public class EntityTypeSearchCriteria extends AbstractObjectSearchCriteria<IEnti
         return with(new EntityKindSearchCriteria());
     }
 
+    public EntityTypeSearchCriteria withOrOperator()
+    {
+        return (EntityTypeSearchCriteria) withOperator(SearchOperator.OR);
+    }
+
+    public EntityTypeSearchCriteria withAndOperator()
+    {
+        return (EntityTypeSearchCriteria) withOperator(SearchOperator.AND);
+    }
+
     @Override
     protected SearchCriteriaToStringBuilder createBuilder()
     {
diff --git a/openbis_api/source/java/ch/ethz/sis/openbis/generic/dssapi/v3/dto/datasetfile/search/DataSetFileSearchCriteria.java b/openbis_api/source/java/ch/ethz/sis/openbis/generic/dssapi/v3/dto/datasetfile/search/DataSetFileSearchCriteria.java
index a919d9973760058bc8d60f894d2c1f9f9029f464..4e0cda4e20c6b59788acbcbf1146f0a056d4cb1e 100644
--- a/openbis_api/source/java/ch/ethz/sis/openbis/generic/dssapi/v3/dto/datasetfile/search/DataSetFileSearchCriteria.java
+++ b/openbis_api/source/java/ch/ethz/sis/openbis/generic/dssapi/v3/dto/datasetfile/search/DataSetFileSearchCriteria.java
@@ -18,6 +18,7 @@ package ch.ethz.sis.openbis.generic.dssapi.v3.dto.datasetfile.search;
 
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.AbstractCompositeSearchCriteria;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchCriteriaToStringBuilder;
+import ch.ethz.sis.openbis.generic.asapi.v3.dto.common.search.SearchOperator;
 import ch.ethz.sis.openbis.generic.asapi.v3.dto.dataset.search.DataSetSearchCriteria;
 import ch.systemsx.cisd.base.annotation.JsonObject;
 
@@ -34,6 +35,16 @@ public class DataSetFileSearchCriteria extends AbstractCompositeSearchCriteria
         return with(new DataSetSearchCriteria());
     }
 
+    public DataSetFileSearchCriteria withOrOperator()
+    {
+        return (DataSetFileSearchCriteria) withOperator(SearchOperator.OR);
+    }
+
+    public DataSetFileSearchCriteria withAndOperator()
+    {
+        return (DataSetFileSearchCriteria) withOperator(SearchOperator.AND);
+    }
+
     @Override
     protected SearchCriteriaToStringBuilder createBuilder()
     {
diff --git a/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/dss-monitoring-initialization.py b/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/dss-monitoring-initialization.py
index fc10827bd41e798c3feb3b4d70bc0904175a28dd..5e66be7d3804b4f0f029ae3b3df85d87c887aefd 100644
--- a/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/dss-monitoring-initialization.py
+++ b/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/dss-monitoring-initialization.py
@@ -1,4 +1,6 @@
+from __future__ import with_statement
 import subprocess
+from java.util import Arrays
 from ch.systemsx.cisd.common.exceptions import UserFailureException
 from ch.systemsx.cisd.openbis.dss.generic.shared import ServiceProvider
 from ch.ethz.sis.openbis.generic.asapi.v3.dto.space.id import SpacePermId
@@ -51,46 +53,46 @@ def process(tr, parameters, tableBuilder):
 def _create_data_set_type(session_token, data_set_type_code):
     v3 = ServiceProvider.getV3ApplicationService()
     data_set_type_permid = EntityTypePermId(data_set_type_code)
-    if v3.getDataSetTypes(session_token, [data_set_type_permid], DataSetTypeFetchOptions()).get(data_set_type_permid) is None:
+    if v3.getDataSetTypes(session_token, Arrays.asList(data_set_type_permid), DataSetTypeFetchOptions()).get(data_set_type_permid) is None:
         data_set_type_creation = DataSetTypeCreation()
         data_set_type_creation.setCode(data_set_type_code)
-        v3.createDataSetTypes(session_token, [data_set_type_creation])
+        v3.createDataSetTypes(session_token, Arrays.asList(data_set_type_creation))
 
 def _create_sample(tr, session_token, space_code, sample_code, sample_type_code):
     v3 = ServiceProvider.getV3ApplicationService()
     space_permid = SpacePermId(space_code)
-    if v3.getSpaces(session_token, [space_permid], SpaceFetchOptions()).get(space_permid) is None:
+    if v3.getSpaces(session_token, Arrays.asList(space_permid), SpaceFetchOptions()).get(space_permid) is None:
         space_creation = SpaceCreation()
         space_creation.setCode(space_code)
-        v3.createSpaces(session_token, [space_creation])
+        v3.createSpaces(session_token, Arrays.asList(space_creation))
     sample_id = SampleIdentifier(space_code, None, sample_code)
-    if v3.getSamples(session_token, [sample_id], SampleFetchOptions()).get(sample_id) is None:
+    if v3.getSamples(session_token, Arrays.asList(sample_id), SampleFetchOptions()).get(sample_id) is None:
         sample_type_permid = EntityTypePermId(sample_type_code)
-        if v3.getSampleTypes(session_token, [sample_type_permid], SampleTypeFetchOptions()).get(sample_type_permid) is None:
+        if v3.getSampleTypes(session_token, Arrays.asList(sample_type_permid), SampleTypeFetchOptions()).get(sample_type_permid) is None:
             sample_type_creation = SampleTypeCreation()
             sample_type_creation.setCode(sample_type_code)
-            v3.createSampleTypes(session_token, [sample_type_creation])
+            v3.createSampleTypes(session_token, Arrays.asList(sample_type_creation))
         sample_creation = SampleCreation()
         sample_creation.setTypeId(sample_type_permid)
         sample_creation.setSpaceId(space_permid)
         sample_creation.setCode(sample_code)
-        v3.createSamples(session_token, [sample_creation])
+        v3.createSamples(session_token, Arrays.asList(sample_creation))
     return tr.getSearchService().getSample(sample_id.getIdentifier())
 
 def _create_user(session_token, user_id, password, space_code):
     v3 = ServiceProvider.getV3ApplicationService()
     person_permid = PersonPermId(user_id)
-    if v3.getPersons(session_token, [person_permid], PersonFetchOptions()).get(person_permid) is None:
+    if v3.getPersons(session_token, Arrays.asList(person_permid), PersonFetchOptions()).get(person_permid) is None:
         passwdShPath = '../openBIS-server/jetty/bin/passwd.sh'
         subprocess.call([passwdShPath, 'add', user_id, '-p', password])
         creation = PersonCreation()
         creation.setUserId(user_id)
-        v3.createPersons(session_token, [creation])
+        v3.createPersons(session_token, Arrays.asList(creation))
         role_assignment_creation = RoleAssignmentCreation()
         role_assignment_creation.setUserId(person_permid)
         role_assignment_creation.setRole(Role.OBSERVER)
         role_assignment_creation.setSpaceId(SpacePermId(space_code))
-        v3.createRoleAssignments(session_token, [role_assignment_creation])
+        v3.createRoleAssignments(session_token, Arrays.asList(role_assignment_creation))
 
 def _get_parameter(parameters, key, default_value):
     p = parameters.get(key)
diff --git a/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/utilities/initialization.py b/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/utilities/initialization.py
new file mode 100644
index 0000000000000000000000000000000000000000..f0a991b3ec97af0a8c1f4d29442f44e8363e1313
--- /dev/null
+++ b/openbis_standard_technologies/dist/core-plugins/monitoring-support/1/dss/reporting-plugins/dss-monitoring-initialization/utilities/initialization.py
@@ -0,0 +1,50 @@
+#!/usr/bin/python
+import sys
+import getpass
+import ssl
+import json
+
+if sys.version_info.major < 3:
+    import urllib2
+else:
+    import urllib.request
+
+def ask_server(url, request_data):
+    if sys.version_info.major < 3:
+        if sys.version_info.minor >= 2 and sys.version_info.micro > 9:
+            return urllib2.urlopen(url, request_data, context=ssl._create_unverified_context()).read()
+        return urllib2.urlopen(url, request_data).read()
+    return urllib.request.urlopen(url, request_data.encoding('utf8'), context=ssl._create_unverified_context()).read()
+
+if len(sys.argv) < 3:
+    raise Exception("Usage: python init_dss_monitoring.py <openBIS URL> <admin user id> [<admin password>]")
+url = sys.argv[1]
+admin_user = sys.argv[2]
+if len(sys.argv) == 3:
+    password = getpass.getpass()
+else:
+    password = sys.argv[3]
+
+data = '{"method":"tryToAuthenticateAtQueryServer","params":["%s","%s"],"id":"1","jsonrpc":"2:0"}' % (admin_user, password)
+answer = ask_server("%s/openbis/openbis/rmi-query-v1.json" % url, data)
+session_token = json.loads(answer)['result']
+
+space_code = 'NAGIOS'
+sample_code = 'NAGIOS'
+sample_type_code = 'NAGIOS'
+data_set_code = '99999999999999999-0000000'
+data_set_type_code = 'NAGIOS'
+file_name = 'nagios.txt'
+file_content = 'Nagios'
+user_id='nrpe'
+user_password='<choose a strong password>'
+
+data = ('{"method":"createReportFromAggregationService","params":["%s","DSS1","dss-monitoring-initialization",'
+        + '{"sessionToken":"%s","data set code":"%s","space code":"%s","sample code":"%s","data set type code":"%s",'
+        + '"sample type code":"%s","file name":"%s","file content":"%s",' 
+        + '"user id":"%s","password":"%s"}],"id":"1","jsonrpc":"2.0"}' 
+       ) % (session_token, session_token, data_set_code, space_code, sample_code, data_set_type_code, 
+            sample_type_code, file_name, file_content, user_id, user_password)
+answer = ask_server("%s/openbis/openbis/rmi-query-v1.json" % url, data)
+print(answer)
+
diff --git a/openbis_standard_technologies/query-api.gradle b/openbis_standard_technologies/query-api.gradle
index 25d2f6633d2bf8a4035d5a23659fceba2a39759a..1c23fe45ca169b67e32f724b246e573266a32c03 100644
--- a/openbis_standard_technologies/query-api.gradle
+++ b/openbis_standard_technologies/query-api.gradle
@@ -125,7 +125,7 @@ task apiV3Jar(type: Jar) {
 configurations.create('apiV3Dependencies')
 dependencies {
   apiV3Dependencies 'sis:sis-base:18.09.0',
-                    'sis:sis-file-transfer:19.03.0',
+                    'sis:sis-file-transfer:19.03.1',
                     'apache:httpclient:4.3.6',
                     'apache:commons-lang3:3.7',
                     'eclipse:jetty-client:9.4.14.v20181114',