diff --git a/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java b/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java
index b2e5a806db99dcc0f87269a876edb0b8820ecebc..8d96390a2cfdb26e916fddc0b1f9d8c74d8a5fad 100644
--- a/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java
+++ b/api-openbis-java/sourceTest/java/ch/ethz/sis/openbis/generic/sharedapi/v3/ToStringCheck.java
@@ -172,7 +172,7 @@ public class ToStringCheck
 
         TableModel o = new TableModel(columns, rows);
 
-        assertEquals(o.toString(), "TableModel[columns={col1,col2},rowCount=1]");
+        assertEquals(o.toString(), "TableModel[columns=[col1, col2],rowCount=1]");
     }
 
     @Test
@@ -228,7 +228,7 @@ public class ToStringCheck
         o.add(new SamplePermId("p1"), new SampleIdentifier("i1"));
         o.remove(new SamplePermId("p2"), new SampleIdentifier("i2"));
         o.set(new SamplePermId("p3"), new SampleIdentifier("i3"));
-        assertEquals(o.toString(), "IdListUpdateValue[added={P1,I1},removed={P2,I2},set={P3,I3}]");
+        assertEquals(o.toString(), "IdListUpdateValue[added=[P1, I1],removed=[P2, I2],set=[P3, I3]]");
     }
 
     @Test
@@ -360,7 +360,7 @@ public class ToStringCheck
         SynchronousOperationExecutionResults o =
                 new SynchronousOperationExecutionResults(Arrays.asList(result1, result2));
         assertEquals(o.toString(),
-                "SynchronousOperationExecutionResults[results={CreateSamplesOperationResult[TEST-PERM-ID-1],CreateExperimentsOperationResult[TEST-PERM-ID-2]}]");
+                "SynchronousOperationExecutionResults[results=[CreateSamplesOperationResult[TEST-PERM-ID-1], CreateExperimentsOperationResult[TEST-PERM-ID-2]]]");
     }
 
     @Test
@@ -437,7 +437,7 @@ public class ToStringCheck
         o.setFileMetadata(Arrays.asList(f));
 
         assertEquals(o.toString(),
-                "FullDataSetCreation[metadataCreation=DataSetCreation[experimentId=TEST-EXPERIMENT-ID,sampleId=<null>,code=test-code],fileMetadata={DataSetFileCreation[path=test-path]}]");
+                "FullDataSetCreation[metadataCreation=DataSetCreation[experimentId=TEST-EXPERIMENT-ID,sampleId=<null>,code=test-code],fileMetadata=[DataSetFileCreation[path=test-path]]]");
     }
 
     @Test
diff --git a/core-plugin-openbis/clients.gradle b/core-plugin-openbis/clients.gradle
index 6f3094bcc263e911695a9110e5f7a042672eb992..dbbd8e5e6360535b61f3edf9d97359626474c967 100644
--- a/core-plugin-openbis/clients.gradle
+++ b/core-plugin-openbis/clients.gradle
@@ -8,8 +8,8 @@ dependencies {
             'apache:commons-codec:1.10',
             'apache:commons-io:2.6',
             'apache:httpclient:4.3.6',
-            'apache:commons-lang3:3.11',
-            'apache:commons-text:1.6',
+            'apache:commons-lang3:3.14',
+            'apache:commons-text:1.11',
             'apache:commons-logging:1.2',
             'apache:log4j:1.2.15',
             'apache:geronimo-stax:1.0',
diff --git a/core-plugin-openbis/query-api.gradle b/core-plugin-openbis/query-api.gradle
index 15e679884de971d4f9324b259b396c9d64ef4110..c61ed99a0dbc2c668f0e3ed86226c14d551d8392 100644
--- a/core-plugin-openbis/query-api.gradle
+++ b/core-plugin-openbis/query-api.gradle
@@ -79,7 +79,7 @@ dependencies {
             'springframework:spring-webmvc:5.0.1.RELEASE',
             'springframework:spring-expression:5.0.1.RELEASE',
             'apache:commons-logging:1.2',
-            'apache:commons-lang3:3.11',
+            'apache:commons-lang3:3.14',
             'marathon:marathon-spring-util:1.2.5',
             'aopalliance:aopalliance:1.0'
 }
@@ -127,7 +127,7 @@ dependencies {
     apiV3Dependencies 'sis:sis-base:23.06.0',
             'sis:sis-file-transfer:19.03.1',
             'apache:httpclient:4.3.6',
-            'apache:commons-lang3:3.11',
+            'apache:commons-lang3:3.14',
             'eclipse:jetty-client:9.4.44.v20210927',
             'springframework:spring-web:5.0.1.RELEASE',
             'marathon:marathon-spring-util:1.2.5'
diff --git a/core-plugin-openbis/screening-api.gradle b/core-plugin-openbis/screening-api.gradle
index 6f38bfd00d88c604bd7dc8633bcfe2b1e5ddf507..019526741bd68d83fb4406821217229496fc08ba 100644
--- a/core-plugin-openbis/screening-api.gradle
+++ b/core-plugin-openbis/screening-api.gradle
@@ -85,7 +85,7 @@ dependencies {
     batteries 'sis:sis-base:23.06.0',
             'apache:httpclient:4.3.6',
             'apache:httpcore:4.3.3',
-            'apache:commons-lang3:3.11',
+            'apache:commons-lang3:3.14',
             'apache:log4j:1.2.15',
             'springframework:spring-aop:5.0.1.RELEASE',
             'springframework:spring-beans:5.0.1.RELEASE',
diff --git a/lib-base/build.gradle b/lib-base/build.gradle
index c2f917ba88530f62a1f684e30f260c4498f24f3d..5013e753bd747558f9773b35907d70e8fc83a717 100644
--- a/lib-base/build.gradle
+++ b/lib-base/build.gradle
@@ -2,7 +2,7 @@ apply from: '../build/javaproject.gradle'
 
 dependencies {
     api 'apache:commons-io:2.6',
-            'apache:commons-lang3:3.11',
+            'apache:commons-lang3:3.14',
             'testng:testng:6.8-CISD',
             'rinn:restrictions:1.0.2'
 } 
diff --git a/lib-commonbase/build.gradle b/lib-commonbase/build.gradle
index 9ff6a97fb71534764071e0dfa8c35442d2247ca8..7c1075c2d1c77534c19ade37274dfcc7bf1a760d 100644
--- a/lib-commonbase/build.gradle
+++ b/lib-commonbase/build.gradle
@@ -2,8 +2,8 @@ apply from: '../build/javaproject.gradle'
 
 dependencies {
     api 'apache:commons-io:2.6',
-            'apache:commons-lang3:3.11',
-            'apache:commons-text:1.6',
+            'apache:commons-lang3:3.14',
+            'apache:commons-text:1.11',
             'apache:log4j:1.2.15',
             'sis:sis-base:23.06.0',
             'rinn:restrictions:1.0.2',
diff --git a/lib-file-download/build.gradle b/lib-file-download/build.gradle
index 0d3bc9bfea98db0bbbd48df894cd259ca07c5fc3..9ed5dca42d028eaad8502e32bd3ad0af2dfe67a6 100644
--- a/lib-file-download/build.gradle
+++ b/lib-file-download/build.gradle
@@ -3,7 +3,7 @@ apply from: './javaproject.gradle'
 dependencies {
 
 	compile 	'apache:commons-io:2.6',
-			'apache:commons-lang3:3.7'
+			'apache:commons-lang3:3.14'
 		
 
 	testCompile 'testng:testng:6.8-CISD',
diff --git a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java
index e04705c5fbe29d3066335d257c81f43c887e056a..4b198f6c413826067294f260a38eb384a8ea9615 100644
--- a/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java
+++ b/server-application-server/sourceTest/java/ch/ethz/sis/openbis/systemtest/asapi/v3/ExecuteOperationsTest.java
@@ -940,7 +940,7 @@ public class ExecuteOperationsTest extends AbstractOperationExecutionTest
         v3api.executeOperations(sessionToken, Arrays.asList(new CreateSpacesOperation(spaceCreation())), o);
 
         assertAccessLog(
-                "execute-operations  OPERATIONS('[CreateSpacesOperation 1 creation(s)]') EXECUTION_OPTIONS('SynchronousOperationExecutionOptions[description=test-description,notification=OperationExecutionEmailNotification[emails={test@email.com}]]')");
+                "execute-operations  OPERATIONS('[CreateSpacesOperation 1 creation(s)]') EXECUTION_OPTIONS('SynchronousOperationExecutionOptions[description=test-description,notification=OperationExecutionEmailNotification[emails=[test@email.com]]]')");
     }
 
     @Test
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java
index 69fa684a54eacee20bc98a2158046a19efda3b57..6a83ae2fec4d0c115828c5c5f524719a3c38d616 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/server/business/bo/fetchoptions/samplelister/SampleListerTest.java
@@ -70,12 +70,12 @@ public class SampleListerTest extends AssertJUnit
         user = ManagerTestTool.createPerson();
         lister = new SampleLister(query, user);
         context.checking(new Expectations()
+        {
             {
-                {
-                    atMost(1).of(query).getRelationshipTypeId("PARENT_CHILD", true);
-                    will(returnValue(RELATION_SHIP_TYPE));
-                }
-            });
+                atMost(1).of(query).getRelationshipTypeId("PARENT_CHILD", true);
+                will(returnValue(RELATION_SHIP_TYPE));
+            }
+        });
     }
 
     @AfterMethod
@@ -106,30 +106,31 @@ public class SampleListerTest extends AssertJUnit
     {
         final List<Long> sampleIDs = Arrays.asList(101L, 102L);
         context.checking(new Expectations()
+        {
             {
-                {
-                    SampleRecord r101 = record(101);
-                    SampleRecord r102 = record(102);
-                    LongOpenHashSet sampleIdSet = new LongOpenHashSet(new long[] { r101.s_id, r102.s_id });
-                    one(query).listSamplesByIds(sampleIdSet);
-                    will(returnValue(Arrays.asList(r101, r102)));
+                SampleRecord r101 = record(101);
+                SampleRecord r102 = record(102);
+                LongOpenHashSet sampleIdSet =
+                        new LongOpenHashSet(new long[] { r101.s_id, r102.s_id });
+                one(query).listSamplesByIds(sampleIdSet);
+                will(returnValue(Arrays.asList(r101, r102)));
 
-                    one(query).getProperties(sampleIdSet);
-                    will(returnValue(Arrays.asList(property(101, "A", "alpha"))));
+                one(query).getProperties(sampleIdSet);
+                will(returnValue(Arrays.asList(property(101, "A", "alpha"))));
 
-                    one(query).getMetaprojectAssignments(sampleIdSet, user.getId());
-                    will(returnValue(Arrays.asList(sampleMetaproject(102, 42))));
+                one(query).getMetaprojectAssignments(sampleIdSet, user.getId());
+                will(returnValue(Arrays.asList(sampleMetaproject(102, 42))));
 
-                    one(query).getMetaprojects(new LongOpenHashSet(new long[] { 42 }));
-                    will(returnValue(Arrays.asList(metaproject(42, "answer"))));
+                one(query).getMetaprojects(new LongOpenHashSet(new long[] { 42 }));
+                will(returnValue(Arrays.asList(metaproject(42, "answer"))));
 
-                    atLeast(1).of(filter).isValid(user, sample(r101));
-                    will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r101));
+                will(returnValue(true));
 
-                    atLeast(1).of(filter).isValid(user, sample(r102));
-                    will(returnValue(true));
-                }
-            });
+                atLeast(1).of(filter).isValid(user, sample(r102));
+                will(returnValue(true));
+            }
+        });
 
         List<Sample> samples =
                 lister.getSamples(sampleIDs,
@@ -147,43 +148,44 @@ public class SampleListerTest extends AssertJUnit
     {
         final List<Long> sampleIDs = Arrays.asList(101L, 102L);
         context.checking(new Expectations()
+        {
             {
-                {
-                    one(query).getParents(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
-                    will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101),
-                            parentChild(3, 102))));
+                one(query).getParents(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
+                will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101),
+                        parentChild(3, 102))));
 
-                    SampleRecord r1 = record(1);
-                    SampleRecord r2 = record(2);
-                    SampleRecord r3 = record(3);
-                    SampleRecord r101 = record(101);
-                    SampleRecord r102 = record(102);
-                    one(query).listSamplesByIds(new LongOpenHashSet(new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id }));
-                    will(returnValue(Arrays.asList(r1, r2, r3, r101, r102)));
+                SampleRecord r1 = record(1);
+                SampleRecord r2 = record(2);
+                SampleRecord r3 = record(3);
+                SampleRecord r101 = record(101);
+                SampleRecord r102 = record(102);
+                one(query).listSamplesByIds(new LongOpenHashSet(
+                        new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id }));
+                will(returnValue(Arrays.asList(r1, r2, r3, r101, r102)));
 
-                    atLeast(1).of(filter).isValid(user, sample(r1));
-                    will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r1));
+                will(returnValue(true));
 
-                    atLeast(1).of(filter).isValid(user, sample(r2));
-                    will(returnValue(false));
+                atLeast(1).of(filter).isValid(user, sample(r2));
+                will(returnValue(false));
 
-                    atLeast(1).of(filter).isValid(user, sample(r3));
-                    will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r3));
+                will(returnValue(true));
 
-                    atLeast(1).of(filter).isValid(user, sample(r101));
-                    will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r101));
+                will(returnValue(true));
 
-                    atLeast(1).of(filter).isValid(user, sample(r102));
-                    will(returnValue(false));
-                }
-            });
+                atLeast(1).of(filter).isValid(user, sample(r102));
+                will(returnValue(false));
+            }
+        });
 
         List<Sample> samples =
                 lister.getSamples(sampleIDs, EnumSet.of(SampleFetchOption.PARENTS), filter);
 
         assertEquals(
-                "[Sample[/SPACE/S-101,MY-TYPE,properties=?,parents={Sample[/SPACE/S-1,"
-                        + "MY-TYPE,properties=?,parents=?,children=?]},children=?]]",
+                "[Sample[/SPACE/S-101,MY-TYPE,properties=?,parents=[Sample[/SPACE/S-1," +
+                        "MY-TYPE,properties=?,parents=?,children=?]],children=?]]",
                 samples.toString());
         assertEquals("[BASIC, PARENTS]", samples.get(0).getRetrievedFetchOptions().toString());
         assertEquals("[BASIC]", samples.get(0).getParents().get(0).getRetrievedFetchOptions()
@@ -195,53 +197,55 @@ public class SampleListerTest extends AssertJUnit
     {
         final List<Long> sampleIDs = Arrays.asList(201L, 202L);
         context.checking(new Expectations()
+        {
             {
-                {
-                    one(query).getDescendants(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
-                    will(returnValue(Arrays.asList(parentChild(201, 301), parentChild(201, 302),
-                            parentChild(302, 401))));
-                    one(query).getAncestors(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
-                    will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101),
-                            parentChild(3, 102), parentChild(101, 201), parentChild(102, 202))));
-
-                    SampleRecord r1 = record(1);
-                    SampleRecord r2 = record(2);
-                    SampleRecord r3 = record(3);
-                    SampleRecord r101 = record(101);
-                    SampleRecord r102 = record(102);
-                    SampleRecord r201 = record(201);
-                    SampleRecord r202 = record(202);
-                    SampleRecord r301 = record(301);
-                    SampleRecord r302 = record(302);
-                    SampleRecord r401 = record(401);
-                    one(query).listSamplesByIds(
-                            new LongOpenHashSet(new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id, r201.s_id,
-                                    r202.s_id, r301.s_id, r302.s_id, r401.s_id }));
-                    will(returnValue(Arrays.asList(r1, r2, r3, r101, r102, r201, r202, r301, r302,
-                            r401)));
-
-                    atLeast(1).of(filter).isValid(user, sample(r1));
-                    will(returnValue(true));
-                    atLeast(1).of(filter).isValid(user, sample(r2));
-                    will(returnValue(false));
-                    atLeast(1).of(filter).isValid(user, sample(r3));
-                    will(returnValue(true));
-                    atLeast(1).of(filter).isValid(user, sample(r101));
-                    will(returnValue(true));
-                    atLeast(1).of(filter).isValid(user, sample(r102));
-                    will(returnValue(false));
-                    atLeast(1).of(filter).isValid(user, sample(r201));
-                    will(returnValue(true));
-                    atLeast(1).of(filter).isValid(user, sample(r202));
-                    will(returnValue(false));
-                    atLeast(1).of(filter).isValid(user, sample(r301));
-                    will(returnValue(false));
-                    atLeast(1).of(filter).isValid(user, sample(r302));
-                    will(returnValue(true));
-                    atLeast(1).of(filter).isValid(user, sample(r401));
-                    will(returnValue(true));
-                }
-            });
+                one(query).getDescendants(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
+                will(returnValue(Arrays.asList(parentChild(201, 301), parentChild(201, 302),
+                        parentChild(302, 401))));
+                one(query).getAncestors(RELATION_SHIP_TYPE, new LongOpenHashSet(sampleIDs));
+                will(returnValue(Arrays.asList(parentChild(1, 101), parentChild(2, 101),
+                        parentChild(3, 102), parentChild(101, 201), parentChild(102, 202))));
+
+                SampleRecord r1 = record(1);
+                SampleRecord r2 = record(2);
+                SampleRecord r3 = record(3);
+                SampleRecord r101 = record(101);
+                SampleRecord r102 = record(102);
+                SampleRecord r201 = record(201);
+                SampleRecord r202 = record(202);
+                SampleRecord r301 = record(301);
+                SampleRecord r302 = record(302);
+                SampleRecord r401 = record(401);
+                one(query).listSamplesByIds(
+                        new LongOpenHashSet(
+                                new long[] { r1.s_id, r2.s_id, r3.s_id, r101.s_id, r102.s_id,
+                                        r201.s_id,
+                                        r202.s_id, r301.s_id, r302.s_id, r401.s_id }));
+                will(returnValue(Arrays.asList(r1, r2, r3, r101, r102, r201, r202, r301, r302,
+                        r401)));
+
+                atLeast(1).of(filter).isValid(user, sample(r1));
+                will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r2));
+                will(returnValue(false));
+                atLeast(1).of(filter).isValid(user, sample(r3));
+                will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r101));
+                will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r102));
+                will(returnValue(false));
+                atLeast(1).of(filter).isValid(user, sample(r201));
+                will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r202));
+                will(returnValue(false));
+                atLeast(1).of(filter).isValid(user, sample(r301));
+                will(returnValue(false));
+                atLeast(1).of(filter).isValid(user, sample(r302));
+                will(returnValue(true));
+                atLeast(1).of(filter).isValid(user, sample(r401));
+                will(returnValue(true));
+            }
+        });
 
         List<Sample> samples =
                 lister.getSamples(sampleIDs,
@@ -249,11 +253,11 @@ public class SampleListerTest extends AssertJUnit
                         filter);
 
         assertEquals(
-                "[Sample[/SPACE/S-201,MY-TYPE,properties=?,parents={Sample[/SPACE/S-101,MY-TYPE,"
-                        + "properties=?,parents={Sample[/SPACE/S-1,MY-TYPE,properties=?,parents=[],"
-                        + "children=?]},children=?]},children={Sample[/SPACE/S-302,MY-TYPE,"
-                        + "properties=?,parents=?,children={Sample[/SPACE/S-401,MY-TYPE,properties=?,"
-                        + "parents=?,children=[]]}]}]]",
+                "[Sample[/SPACE/S-201,MY-TYPE,properties=?,parents=[Sample[/SPACE/S-101," +
+                        "MY-TYPE,properties=?,parents=[Sample[/SPACE/S-1,MY-TYPE,properties=?," +
+                        "parents=[],children=?]],children=?]],children=[Sample[/SPACE/S-302,MY-TYPE," +
+                        "properties=?,parents=?,children=[Sample[/SPACE/S-401,MY-TYPE,properties=?" +
+                        ",parents=?,children=[]]]]]]]",
                 samples.toString());
         assertEquals("[BASIC, PARENTS, CHILDREN]", samples.get(0).getRetrievedFetchOptions()
                 .toString());
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
index 56cb94c49f4419f22e2ff509d3df1cb8e6ce69ec..288ff6ea98af111981acbddd9f6d82aca82f0ce7 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/TranslatorTest.java
@@ -155,8 +155,8 @@ public class TranslatorTest extends AssertJUnit
         ExperimentType translatedExperimentType =
                 Translator.translate(builder.getExperimentType(), vocabTerms);
 
-        assertEquals("ExperimentType[MY-EXP,<null>,{PropertyTypeGroup[<null>,"
-                + "{PropertyType[VARCHAR,NAME,Name,<null>,mandatory]}]}]",
+        assertEquals("ExperimentType[MY-EXP,<null>,[PropertyTypeGroup[<null>," +
+                        "[PropertyType[VARCHAR,NAME,Name,<null>,mandatory]]]]]",
                 translatedExperimentType.toString());
     }
 
@@ -182,13 +182,12 @@ public class TranslatorTest extends AssertJUnit
         ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType translatedDataSetType =
                 Translator.translate(dataSetType, vocabTerms);
 
-        assertEquals("DataSetType[CODE,<null>,deletionDisallowed=false,mainDataSetPattern=<null>,"
-                + "mainDataSetPath=<null>,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,NAME,"
-                + "Name,<null>,optional]}],PropertyTypeGroup[A,{PropertyType[VARCHAR,CITY,City,"
-                + "<null>,optional]}],PropertyTypeGroup[<null>,"
-                + "{ControlledVocabularyPropertyType[CONTROLLEDVOCABULARY,LEVEL,Level,<null>,"
-                + "mandatory,{ControlledVocabularyPropertyType.VocabularyTerm[HIGH,High]}]}],"
-                + "PropertyTypeGroup[A,{PropertyType[REAL,AGE,Age,<null>,optional]}]}]",
+        assertEquals("DataSetType[CODE,<null>,deletionDisallowed=false,mainDataSetPattern=<null>," +
+                        "mainDataSetPath=<null>,[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,NAME,Name," +
+                        "<null>,optional]]], PropertyTypeGroup[A,[PropertyType[VARCHAR,CITY,City,<null>,optional]]]," +
+                        " PropertyTypeGroup[<null>,[ControlledVocabularyPropertyType[CONTROLLEDVOCABULARY," +
+                        "LEVEL,Level,<null>,mandatory,[ControlledVocabularyPropertyType.VocabularyTerm[HIGH,High]]]]]," +
+                        " PropertyTypeGroup[A,[PropertyType[REAL,AGE,Age,<null>,optional]]]]]",
                 translatedDataSetType.toString());
     }
 
@@ -206,8 +205,8 @@ public class TranslatorTest extends AssertJUnit
         ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.DataSetType translatedDataSetType =
                 Translator.translate(builder.getDataSetType(), vocabTerms);
 
-        assertEquals("DataSetType[CODE,hello,deletionDisallowed=true,mainDataSetPattern=.*,mainDataSetPath=/here,"
-                + "{PropertyTypeGroup[A,{PropertyType[VARCHAR,NAME,Name,<null>,optional]}]}]",
+        assertEquals("DataSetType[CODE,hello,deletionDisallowed=true,mainDataSetPattern=.*," +
+                        "mainDataSetPath=/here,[PropertyTypeGroup[A,[PropertyType[VARCHAR,NAME,Name,<null>,optional]]]]]",
                 translatedDataSetType.toString());
     }
 
@@ -230,12 +229,11 @@ public class TranslatorTest extends AssertJUnit
         ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleType translatedSampleType =
                 Translator.translate(dataSetType, vocabTerms);
 
-        assertEquals("SampleType[CODE,test type,ValidationPluginInfo[test,Testing],listable=true,"
-                + "showContainer=true,showParents=true,showParentMetaData=true,uniqueSubcodes=true,"
-                + "automaticCodeGeneration=true,codePrefix=S-,{PropertyTypeGroup[A,"
-                + "{PropertyType[VARCHAR,NAME,Name,<null>,optional],PropertyType[VARCHAR,CITY,"
-                + "City,<null>,optional]}],PropertyTypeGroup[<null>,{PropertyType[TIMESTAMP,"
-                + "TIMESTAMP,Timestamp,<null>,optional]}]}]",
+        assertEquals("SampleType[CODE,test type,ValidationPluginInfo[test,Testing],listable=true," +
+                        "showContainer=true,showParents=true,showParentMetaData=true,uniqueSubcodes=true," +
+                        "automaticCodeGeneration=true,codePrefix=S-,[PropertyTypeGroup[A," +
+                        "[PropertyType[VARCHAR,NAME,Name,<null>,optional], PropertyType[VARCHAR,CITY,City,<null>,optional]]], " +
+                        "PropertyTypeGroup[<null>,[PropertyType[TIMESTAMP,TIMESTAMP,Timestamp,<null>,optional]]]]]",
                 translatedSampleType.toString());
     }
 
@@ -268,10 +266,10 @@ public class TranslatorTest extends AssertJUnit
         ch.systemsx.cisd.openbis.generic.shared.api.v1.dto.SampleType translatedSampleType =
                 Translator.translate(dataSetType, vocabTerms);
 
-        assertEquals("SampleType[CODE,<null>,<null>,listable=false,showContainer=false,showParents=false,"
-                + "showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false,"
-                + "codePrefix=<null>,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,NAME,Name,"
-                + "<null>,optional]}]}]",
+        assertEquals("SampleType[CODE,<null>,<null>,listable=false,showContainer=false," +
+                        "showParents=false,showParentMetaData=false,uniqueSubcodes=false," +
+                        "automaticCodeGeneration=false,codePrefix=<null>,[PropertyTypeGroup" +
+                        "[<null>,[PropertyType[VARCHAR,NAME,Name,<null>,optional]]]]]",
                 translatedSampleType.toString());
     }
 
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java
index 4577e465ef0633360a1a77e0224b966c98bd93c6..549e50918a1b5642fb20d0c882b2476d7d09e076 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/generic/shared/api/v1/dto/DataSetTypeTest.java
@@ -114,10 +114,9 @@ public class DataSetTypeTest extends AssertJUnit
     public void testToString()
     {
         String stringRepresentation = dataSetType.toString();
-        assertEquals("DataSetType[dataSet-type,hello,deletionDisallowed=false,mainDataSetPattern=.*,"
-                + "mainDataSetPath=/a/b/c,{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,PROP1,"
-                + "Property 1,<null>,optional],PropertyType[VARCHAR,PROP2,Property 2,"
-                + "Property 2 Description,optional]}]}]",
+        assertEquals("DataSetType[dataSet-type,hello,deletionDisallowed=false,mainDataSetPattern=.*," +
+                        "mainDataSetPath=/a/b/c,[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,PROP1," +
+                        "Property 1,<null>,optional], PropertyType[VARCHAR,PROP2,Property 2,Property 2 Description,optional]]]]]",
                 stringRepresentation);
     }
 }
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java
index de42558e640679049a5403355f54d8ad7bb98885..53afb5e0b1448134ab2edf97d7486a0103ab33ae 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationChangingServiceJsonApiTest.java
@@ -69,8 +69,8 @@ public class GeneralInformationChangingServiceJsonApiTest extends RemoteApiTestC
         String vocabularyCode = "ORGANISM";
         Vocabulary vocabulary = fetchVocabularyFromServer(vocabularyCode);
 
-        assertEquals("Vocabulary[ORGANISM,{VocabularyTerm[RAT,RAT],VocabularyTerm[DOG,DOG],"
-                + "VocabularyTerm[HUMAN,HUMAN],VocabularyTerm[GORILLA,GORILLA],VocabularyTerm[FLY,FLY]}]",
+        assertEquals("Vocabulary[ORGANISM,[VocabularyTerm[RAT,RAT], VocabularyTerm[DOG,DOG], " +
+                        "VocabularyTerm[HUMAN,HUMAN], VocabularyTerm[GORILLA,GORILLA], VocabularyTerm[FLY,FLY]]]",
                 vocabulary.toString());
 
         NewVocabularyTerm newTerm = new NewVocabularyTerm();
@@ -84,9 +84,9 @@ public class GeneralInformationChangingServiceJsonApiTest extends RemoteApiTestC
 
         Vocabulary updatedVocabulary = fetchVocabularyFromServer(vocabularyCode);
 
-        assertEquals("Vocabulary[ORGANISM,{VocabularyTerm[RAT,RAT],VocabularyTerm[DOG,DOG],"
-                + "VocabularyTerm[HUMAN,HUMAN],VocabularyTerm[GORILLA,GORILLA],"
-                + "VocabularyTerm[FLY,FLY],VocabularyTerm[ALIEN,Alien species]}]",
+        assertEquals("Vocabulary[ORGANISM,[VocabularyTerm[RAT,RAT], VocabularyTerm[DOG,DOG], " +
+                        "VocabularyTerm[HUMAN,HUMAN], VocabularyTerm[GORILLA,GORILLA], VocabularyTerm[FLY,FLY], " +
+                        "VocabularyTerm[ALIEN,Alien species]]]",
                 updatedVocabulary.toString());
     }
 
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
index ae266dddabb1cdf6a59a8521cc61475ecaf55c85..7b997418f4a208a35621400d109f832241d7f961 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/remoteapitest/api/v1/GeneralInformationServiceJsonApiTest.java
@@ -551,11 +551,10 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
                 }
             });
 
-        assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening,"
-                + "{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,DESCRIPTION,Description,"
-                + "A Description,mandatory],PropertyType[VARCHAR,COMMENT,Comment,"
-                + "Any other comments,optional],PropertyType[MATERIAL,ANY_MATERIAL,"
-                + "any_material,any_material,optional]}]}]",
+        assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," +
+                        "[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,DESCRIPTION,Description," +
+                        "A Description,mandatory], PropertyType[VARCHAR,COMMENT,Comment,Any other comments,optional], " +
+                        "PropertyType[MATERIAL,ANY_MATERIAL,any_material,any_material,optional]]]]]",
                 experimentTypes.get(0).toString());
         assertEquals(3, experimentTypes.size());
     }
@@ -600,11 +599,10 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
                 + "listable=false,showContainer=true,showParents=false,showParentMetaData=false,"
                 + "uniqueSubcodes=false,automaticCodeGeneration=false,codePrefix=S,[]]",
                 pick(types, "WELL").toString());
-        assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false,"
-                + "showParents=true,showParentMetaData=false,uniqueSubcodes=false,"
-                + "automaticCodeGeneration=false,codePrefix=S,{PropertyTypeGroup[<null>,"
-                + "{PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence,"
-                + "optional]}]}]",
+        assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," +
+                        "showParents=true,showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false," +
+                        "codePrefix=S,[PropertyTypeGroup[<null>," +
+                        "[PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence,optional]]]]]",
                 pick(types, "DILUTION_PLATE").toString());
         assertEquals(12, types.size());
     }
@@ -826,11 +824,11 @@ public class GeneralInformationServiceJsonApiTest extends RemoteApiTestCase
         List<Vocabulary> vocabularies = generalInformationService.listVocabularies(sessionToken);
 
         final Vocabulary gender = findVocabulary(vocabularies, "GENDER");
-        assertEquals("Vocabulary[GENDER,{VocabularyTerm[MALE,MALE],VocabularyTerm[FEMALE,FEMALE]}]",
+        assertEquals("Vocabulary[GENDER,[VocabularyTerm[MALE,MALE], VocabularyTerm[FEMALE,FEMALE]]]",
                 gender.toString());
         final Vocabulary human = findVocabulary(vocabularies, "HUMAN");
-        assertEquals("Vocabulary[HUMAN,{VocabularyTerm[MAN,MAN],VocabularyTerm[WOMAN,WOMAN],"
-                + "VocabularyTerm[CHILD,CHILD]}]",
+        assertEquals("Vocabulary[HUMAN,[VocabularyTerm[MAN,MAN], VocabularyTerm[WOMAN,WOMAN],"
+                + " VocabularyTerm[CHILD,CHILD]]]",
                 human.toString());
 
         Vocabulary organism = findVocabulary(vocabularies, "ORGANISM");
diff --git a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
index e5380e62b344c85682a5acca7c379035075d7725..8906f612857752e29be7eff118a437b5fbe31600 100644
--- a/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
+++ b/server-application-server/sourceTest/java/ch/systemsx/cisd/openbis/systemtest/api/v1/GeneralInformationServiceTest.java
@@ -564,8 +564,8 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 generalInformationService.searchForSamples(sessionToken, searchCriteria,
                         EnumSet.of(SampleFetchOption.DESCENDANTS));
         Collections.sort(samples, SAMPLE_COMPARATOR);
-        assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children={Sample[/TEST-SPACE/S1,"
-                + "NORMAL,properties=?,parents=?,children=[]]}]", samples.get(1).toString());
+        assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?," +
+                "children=[Sample[/TEST-SPACE/S1,NORMAL,properties=?,parents=?,children=[]]]]", samples.get(1).toString());
         assertEquals(8, samples.size());
         sessionToken = generalInformationService.tryToAuthenticateForAllServices("test_role", "a");
 
@@ -598,8 +598,8 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 generalInformationService.searchForSamples(sessionToken, searchCriteria,
                         EnumSet.of(SampleFetchOption.DESCENDANTS));
         Collections.sort(samples, SAMPLE_COMPARATOR);
-        assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children={Sample[/TEST-SPACE/S1,"
-                + "NORMAL,properties=?,parents=?,children=[]]}]", samples.get(1).toString());
+        assertEquals("Sample[/CISD/3V-126,DILUTION_PLATE,properties=?,parents=?,children=" +
+                "[Sample[/TEST-SPACE/S1,NORMAL,properties=?,parents=?,children=[]]]]", samples.get(1).toString());
         assertEquals(8, samples.size());
 
         samples =
@@ -2016,11 +2016,10 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 }
             });
 
-        assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening,"
-                + "{PropertyTypeGroup[<null>,{PropertyType[VARCHAR,DESCRIPTION,Description,"
-                + "A Description,mandatory],PropertyType[VARCHAR,COMMENT,Comment,"
-                + "Any other comments,optional],PropertyType[MATERIAL,ANY_MATERIAL,"
-                + "any_material,any_material,optional]}]}]",
+        assertEquals("ExperimentType[COMPOUND_HCS,Compound High Content Screening," +
+                        "[PropertyTypeGroup[<null>,[PropertyType[VARCHAR,DESCRIPTION,Description,A Description,mandatory], " +
+                        "PropertyType[VARCHAR,COMMENT,Comment,Any other comments,optional], " +
+                        "PropertyType[MATERIAL,ANY_MATERIAL,any_material,any_material,optional]]]]]",
                 experimentTypes.get(0).toString());
         assertEquals(3, experimentTypes.size());
     }
@@ -2087,10 +2086,10 @@ public class GeneralInformationServiceTest extends SystemTestCase
                 + "listable=false,showContainer=true,showParents=false,showParentMetaData=false,"
                 + "uniqueSubcodes=false,automaticCodeGeneration=false,codePrefix=S,[]]",
                 pick(types, "WELL").toString());
-        assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false,"
-                + "showParents=true,showParentMetaData=false,uniqueSubcodes=false,"
-                + "automaticCodeGeneration=false,codePrefix=S,{PropertyTypeGroup[<null>,"
-                + "{PropertyType[INTEGER,OFFSET,Offset,Offset from the start of the sequence,optional]}]}]",
+        assertEquals("SampleType[DILUTION_PLATE,Dilution Plate,<null>,listable=true,showContainer=false," +
+                        "showParents=true,showParentMetaData=false,uniqueSubcodes=false,automaticCodeGeneration=false," +
+                        "codePrefix=S,[PropertyTypeGroup[<null>,[PropertyType[INTEGER,OFFSET,Offset," +
+                        "Offset from the start of the sequence,optional]]]]]",
                 pick(types, "DILUTION_PLATE").toString());
         assertEquals(12, types.size());
     }
diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java
index d1ddb8e533e186a155d437d89595b3f9faffb51f..0f42fa87ad220dbe2c29456a706f083c7b6d183e 100644
--- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java
+++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/etlserver/path/PathInfoDatabaseRefreshingTaskTest.java
@@ -198,8 +198,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,"
-                + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," +
+                        "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-5 successfully added to database. Data set size: 0\n" +
@@ -232,10 +232,10 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,"
-                + "{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE,"
-                + "2017-01-21 15:42:49,LESS_THAN_OR_EQUAL],"
-                + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,A,EQUALS]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE,2017-01-21 15:42:49,LESS_THAN_OR_EQUAL], " +
+                        "SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,A,EQUALS]]," +
+                        "[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-2 successfully added to database. Data set size: 0\n" +
@@ -264,8 +264,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,"
-                + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE," +
+                        "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" +
@@ -295,8 +295,9 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,"
-                + "REGISTRATION_DATE,2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.TimeAttributeMatchClause[ATTRIBUTE,REGISTRATION_DATE," +
+                        "2017-01-23 15:42:48,LESS_THAN_OR_EQUAL]],[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" +
@@ -311,8 +312,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause["
-                + "ATTRIBUTE,REGISTRATION_DATE," + T2 + ",LESS_THAN_OR_EQUAL]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause["
+                + "ATTRIBUTE,REGISTRATION_DATE," + T2 + ",LESS_THAN_OR_EQUAL]],[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" +
@@ -328,8 +329,8 @@ public class PathInfoDatabaseRefreshingTaskTest extends AbstractFileSystemTestCa
 
         task.execute();
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.TimeAttributeMatchClause["
-                + "ATTRIBUTE,REGISTRATION_DATE," + T1 + ",LESS_THAN_OR_EQUAL]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.TimeAttributeMatchClause["
+                + "ATTRIBUTE,REGISTRATION_DATE," + T1 + ",LESS_THAN_OR_EQUAL]],[]]",
                 criteriaMatcher.recordedObject().toString());
         AssertionUtil.assertContainsLines(LOG_PREFIX + "Refresh path info for 2 physical data sets.\n" +
                 LOG_PREFIX + "Paths inside data set ds-3 successfully added to database. Data set size: 0\n" +
diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java
index 78cbecc7bb9c75df4854495d6794e2a4059211c1..4d91e10a1beb1e3941343177c4ee3250a09ef959 100644
--- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java
+++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/client/api/v1/impl/OpenbisServiceFacadeTest.java
@@ -537,10 +537,10 @@ public class OpenbisServiceFacadeTest extends AssertJUnit
         List<Sample> samples =
                 openbisFacade.listSamplesForExperimentAndSampleType("123-1", "MY-TYPE");
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,"
-                + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,MY-TYPE,EQUALS]},"
-                + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES,"
-                + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,TYPE,MY-TYPE,EQUALS]]," +
+                        "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]",
                 criteriaMatcher.recordedObject().toString());
         assertSame(result, samples);
     }
@@ -569,12 +569,12 @@ public class OpenbisServiceFacadeTest extends AssertJUnit
         List<Sample> samples = openbisFacade.listSamplesOfSample("123-1");
 
         List<SearchCriteria> recordedCriterias = criteriaMatcher.getRecordedObjects();
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,"
-                + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]",
                 recordedCriterias.get(0).toString());
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE_CONTAINER,"
-                + "SearchCriteria[MATCH_ALL_CLAUSES,{"
-                + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[SAMPLE_CONTAINER,"
+                + "SearchCriteria[MATCH_ALL_CLAUSES,["
+                + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]",
                 recordedCriterias.get(1).toString());
         assertEquals(2, recordedCriterias.size());
         assertEquals("[Sample[/DB/S1,sample-type-code,properties=?,parents=?,children=?], "
@@ -604,12 +604,11 @@ public class OpenbisServiceFacadeTest extends AssertJUnit
         List<Sample> samples = openbisFacade.listSamplesOfSample("123-1");
 
         List<SearchCriteria> recordedCriterias = criteriaMatcher.getRecordedObjects();
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,"
-                + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]",
                 recordedCriterias.get(0).toString());
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE_CONTAINER,"
-                + "SearchCriteria[MATCH_ALL_CLAUSES,{"
-                + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[SAMPLE_CONTAINER,"
+                + "SearchCriteria[MATCH_ALL_CLAUSES,["
+                + "SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,123-1,EQUALS]],[]]]]]",
                 recordedCriterias.get(1).toString());
         assertEquals(2, recordedCriterias.size());
         assertEquals("[Sample[/DB/S3,sample-type-code,properties=?,parents=?,children=?]]",
@@ -631,9 +630,9 @@ public class OpenbisServiceFacadeTest extends AssertJUnit
 
         List<DataSet> dataSets = openbisFacade.listDataSetsForExperiment("abc-1");
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[EXPERIMENT," +
-                "SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.AttributeMatchClause[" +
-                "ATTRIBUTE,PERM_ID,abc-1,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," +
+                        "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,abc-1,EQUALS]],[]]]]]",
                 criteriaMatcher.recordedObject().toString());
         assertEquals("[DataSet[ds1,e1,<null>,data-set-type,{}]]", dataSets.toString());
     }
@@ -653,9 +652,9 @@ public class OpenbisServiceFacadeTest extends AssertJUnit
 
         List<DataSet> dataSets = openbisFacade.listDataSetsForSample("abc-1");
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],{SearchSubCriteria[SAMPLE,"
-                + "SearchCriteria[MATCH_ALL_CLAUSES,{SearchCriteria.AttributeMatchClause["
-                + "ATTRIBUTE,PERM_ID,abc-1,EQUALS]},[]]]}]", criteriaMatcher.recordedObject()
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," +
+                "[SearchSubCriteria[SAMPLE,SearchCriteria[MATCH_ALL_CLAUSES," +
+                "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,PERM_ID,abc-1,EQUALS]],[]]]]]", criteriaMatcher.recordedObject()
                 .toString());
         assertEquals("[DataSet[ds1,e1,<null>,data-set-type,{}]]", dataSets.toString());
     }
diff --git a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java
index bf58be666544543c1284b9700c50ffa1725dd6d3..5b9a819ee4e1caa439b4c26719a07aec4c2cf402 100644
--- a/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java
+++ b/server-original-data-store/sourceTest/java/ch/systemsx/cisd/openbis/dss/generic/server/plugins/jython/JythonBasedAggregationServiceReportingPluginTest.java
@@ -169,9 +169,9 @@ public class JythonBasedAggregationServiceReportingPluginTest extends AbstractFi
         IReportingPluginTask plugin = createPlugin("script.py");
         TableModel tableModel = plugin.createAggregationReport(parameters, processingContext);
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],"
-                        + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES,"
-                        + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,ABC,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],[SearchSubCriteria[EXPERIMENT," +
+                        "SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,ABC,EQUALS]],[]]]]]",
                 searchCriteriaRecorder.recordedObject().toString());
         assertEquals("[Experiment, Data Set Code, Number of Files, Number of Proteins]", tableModel
                 .getHeader().toString());
@@ -210,9 +210,9 @@ public class JythonBasedAggregationServiceReportingPluginTest extends AbstractFi
                     message.startsWith(prefix));
         }
 
-        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[],"
-                        + "{SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES,"
-                        + "{SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,<null>,EQUALS]},[]]]}]",
+        assertEquals("SearchCriteria[MATCH_ALL_CLAUSES,[]," +
+                        "[SearchSubCriteria[EXPERIMENT,SearchCriteria[MATCH_ALL_CLAUSES," +
+                        "[SearchCriteria.AttributeMatchClause[ATTRIBUTE,CODE,<null>,EQUALS]],[]]]]]",
                 searchCriteriaRecorder.recordedObject().toString());
         context.assertIsSatisfied();
     }
diff --git a/test-api-openbis-javascript/build.gradle b/test-api-openbis-javascript/build.gradle
index 6c606c5fa01b30b7941090f3cf9bfdfb4dd82a93..24a2a393b936c2df7565ccf4a40a6de9e9163970 100644
--- a/test-api-openbis-javascript/build.gradle
+++ b/test-api-openbis-javascript/build.gradle
@@ -45,7 +45,7 @@ dependencies {
             'testng:testng:6.8-CISD',
             'selenium:selenium-java:3.141.59'
 
-    testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.11'
+    testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.14'
 
     testRuntimeSecond 'google:gwt-user:2.4'
 
diff --git a/test-ui-core/build.gradle b/test-ui-core/build.gradle
index bc11d527897c774dd417b074ca5c791c3fe79ad2..74614fc3c03da6f8c280ff033cf9eb5a3d608013 100644
--- a/test-ui-core/build.gradle
+++ b/test-ui-core/build.gradle
@@ -37,7 +37,7 @@ dependencies {
             'testng:testng:6.8-CISD',
             'selenium:selenium-java:3.141.59'
 
-    testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.11'
+    testRuntimeFirst 'javax:servlet-api:3.1.0', 'reflections:reflections:0.9.10', 'apache:commons-lang3:3.14'
 
     testRuntimeSecond 'google:gwt-user:2.4'